43

gunicorn と nginx を使用して Django アプリケーションをホストするための 2 つの戦略を見てきました。

1 つの戦略は、ネットワーク ポートで gunicorn を実行することです。例 ( http://goodcode.io/blog/django-nginx-gunicorn/から):

location / {
    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://localhost:8000/;
}

もう 1 つの戦略は、起動時に gunicorn を UNIX ソケットにバインドすることです (例: http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/ ) 。

upstream hello_app_server {
    server unix:/tmp/gunicorn.sock fail_timeout=0;
}

...

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    if (!-f $request_filename) {
        proxy_pass http://hello_app_server;
        break;
    }
}

どの戦略が優れているかについての考えは? それぞれを行う適切な方法について何かコメントはありますか? TCP によってオーバーヘッドが発生すると思われるため、私はソケット アプローチに傾いています。私が見た実装例間のヘッダー、接続タイムアウトなどの違いが最も心配です。

4

5 に答える 5

33

小さな TCP/IP オーバーヘッドを除けば、大きな違いはありません。各 listen() ソケットは接続キューを取得し、accept() はそのキューから接続をポップします。gunicorn では、各ワーカーはそのキューから新しい接続をポップするだけなので、それは変更されません。違いは、パフォーマンス (ソケットの方が少し速い) と移植性 (ポート:IP の方が柔軟) です。Unix ドメイン ソケットを使用するとパフォーマンスが少し向上しますが、localhost に接続されたソケットを使用すると、サーバー アプリを別の OS に移動する場合に移植性が少し向上します。これは、IP アドレスを localhost から別のホスト名に変更するだけで実行できます。 .

于 2013-12-11T15:54:10.613 に答える
20

Web サーバーとアプリ サーバー (wsgi) の両方が同じマシンに存在する場合は、ソケット トラフィックを選択するのが簡単です。ただし、ソケットはネットワーク経由では機能しないため、ネットワーク接続経由​​でネットワーク ポートが必要になります。

  1. webserver と appserver が同じマシンにある場合 - GO SOCKET
  2. ウェブサーバーとアプリサーバーがネットワーク上にある場合 - GO PORTS
于 2016-03-31T06:56:37.733 に答える