web-dev-qa-db-ja.com

gunicornからのリクエストに対応

Rackspace.comでサーバーをセットアップしようとしています。

次のことを行いました。

  • Centos6.3をインストールしました
  • インストール済みPython 2.7
  • ホームページの「クイックスタート」を使用してgunicornをインストールしました: gunicorn.org/

クイックスタートでは、「helloworld」アプリケーションが初期化されているようです。

ファイル "myapp.py"を作成します:

(チュートリアル)$ vi myapp.py 
(チュートリアル)$ cat myapp.py 

myapp.py」の内容

def app(environ, start_response):
   data = "Hello, World!\n"
   start_response("200 OK", [
       ("Content-Type", "text/plain"),
       ("Content-Length", str(len(data)))
   ])
   return iter([data])

私はサーバーについてほとんど知らないので、次に何をすべきかわかりません。サーバーのIPアドレスをブラウザに入力しようとしましたが、タイムアウトが発生したようです。

あるかどうかはわかりません:

  • インストールする必要がある何か他のもの。 Nginxは、gunicorn Webサイトの「 deploy "」に記載されています。 Nginxはプロキシサーバーのようですが、gunicornはサーバーだと思っていたので、混乱しました。 2台のサーバーが必要な理由がわかりませんか?
  • gunicornで構成する必要があるもの
  • サーバー自体で構成する必要があるもの
  • 実際にリクエストを処理するために実行する必要がある他の何か

次のステップは何ですか?

本当にありがとう!

16
Chris Dutrow

クイックスタートガイドを見ると、おそらく実行する必要があります

(tutorial) $ ../bin/gunicorn -w 4 myapp:app

これは、次のような行を生成するはずです。

Listening at: http://127.0.0.1:8000

とりわけ。そのアドレスでサイトにアクセスできるかどうかを確認してください。

また、127.0.0.1はループバックアドレスです。そのホスト自体からのみアクセスできます。 gunicornを別のオプションにバインドするには、それを渡します--bind 0.0.0.0:80、Jan-Philipが示唆するように。

ラックスペースについて言及しているため、目的のポートへの着信接続を許可するためにファイアウォール設定を調整する必要がある可能性があります。

gunicornはあなたの場合のWebサーバーであるため、NginxはNginxからgunicornにHTTPリクエストを渡すバックプロキシとして機能します。

そこで、同じマシンで実行される単純なNginxとGunicornの構成を実行するための手順をここに示します。

  • nginx構成から開始

/ etc/nginx/nginx.confに移動し、http {}の下に次のものがあることを確認します。include/ etc/nginx/site-enabled/*;

http{
    # other configurations (...)
    include /etc/nginx/sites-enabled/*;
}

ここで、/ etc/nginx/sites-enabled/mysite.confにファイルを含めます。このファイルで、リクエストをgunicornアプリにプロキシします。

server {
    listen 80 default; # this means nginx will be 
                       # listening requests on port 80 and 
                       # this will be the default nginx server
    server_name localhost;

    # declare proxy params and values to forward to your gunicorn webserver
    proxy_pass_request_headers on;
    proxy_pass_request_body on;
    proxy_set_header Host $Host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 120s;

    location / {
        # here is where you declare that every request to / 
        # should be proxy to 127.0.0.1:8000 (which is where
        # your gunicorn will be running on)          
        proxy_pass_header Server;
        proxy_set_header Host $http_Host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;

        proxy_pass http://127.0.0.1:8000/; # the actual nginx directive to 
                                           # forward the request
    }
}

さて、この時点であなたが持っているのは、127.0.0.1:80に向かうすべてのリクエストが127.0.0.1:8000に渡されるプロキシとして機能するNginxだけです。

  • 今があなたのGunicornウェブサーバーを設定する時です:

通常、私が構成ファイルを使用する方法では、Gunicornの構成ファイルは通常のpythonファイルです。したがって、任意の場所にファイルを作成します。このファイルは- / etc/gunicorn/mysite.py

workers = 3              # number of workers Gunicorn will spawn 

bind = '127.0.0.1:8000'  # this is where you declare on which address your 
                         # gunicorn app is running.
                         # Basically where Nginx will forward the request to

pidfile = '/var/run/gunicorn/mysite.pid' # create a simple pid file for gunicorn. 

user = 'user'          # the user gunicorn will run on

daemon = True          # this is only to tell gunicorn to deamonize the server process

errorlog = '/var/log/gunicorn/error-mysite.log'    # error log

accesslog = '/var/log/gunicorn/access-mysite.log'  # access log

proc_name = 'gunicorn-mysite'            # the gunicorn process name

OK、すべて設定済みです。これで、サーバーを起動するために必要な作業はすべて完了しました。

Gunicornを起動し、使用するアプリと構成ファイルを指示します。コマンドラインとmyapp.pyファイルが配置されているフォルダーから次のコマンドを実行します。

gunicorn -c /etc/gunicorn/mysite.py mysite:app

ここで、nginxのみを起動します。

/etc/init.d/nginx start 

または

service nginx start

お役に立てれば。

34
andrefsp

これまでに開発されたWebアプリケーションがないようです。ですから、今のあなたの目標は開発環境を整えることだと思います。当面は、ほとんどのフレームワークに含まれている開発Webサーバーを使用してWebアプリケーションを開発してください。フラスコ。

使用しているフレームワークが何であれ、開発Webサーバーが0.0.0.0でリッスンするようにして、サービスが構成済みのすべてのネットワークインターフェイスでリッスンし、ポートが外部に開かれていることを確認します(Rackspace設定を確認してください) )。

アプリケーションの開発が完了したとき、または既存のアプリケーションを検討しているときは、しっかりとデプロイする必要があります。次に、nginxの背後にあるgunicornがオプションです。

私はあなたの質問を大まかに調べます。もう少し読む必要があるようです:-)

  • Nginxは、gunicornWebサイトの「デプロイ」の下に記載されています。 Nginxはプロキシサーバーのようですが、gunicornはサーバーだと思っていたので、混乱しました。 2台のサーバーが必要な理由がわかりませんか?

Nginxはフル機能のWebサーバーです。その性能と安定性が高く評価されています。人々はこれを使用して、静的ファイルを提供し(このタスクで動的Webアプリケーションに負担をかけないため)、必要に応じてWebアプリケーションに要求を転送し、SSLを終了し、負荷分散を行います。これは不完全な図であることに注意してください。

gunicornは、WSGIアプリを提供するためのサーバーです。主に、Webアプリケーションを実際に実行するワーカープロセスを管理します。

  • gunicornで構成する必要があるもの。サーバー自体で構成する必要があるもの。実際にリクエストを処理するために実行する必要がある他の何か。

実際には、Linuxボックスを無限の方法で最適化できます(パフォーマンスのため、たとえばファイル記述子の制限を増やしたり、セキュリティのために)。 gunicorn内では、ワーカープロセスの数などを構成できます。フロントエンドまたは別のロードバランサーとしてnginxを使用している場合、これには独自の構成があります。ご覧のとおり、実際のシナリオで実際に展開するには、セットアップが非常に複雑になる可能性があります。これは些細なことではありません。

ただし、WSGIアプリケーションを試してみるには、開発フレームワークを適切にセットアップするだけです。これはほとんどの場合非常に簡単で、ファイアウォールの問題がないことを確認してください。それで全部です。