スタンドアロンWSGIコンテナ—フラスコのドキュメント

提供:Dev Guides
< FlaskFlask/docs/1.0.x/deploying/wsgi-standalone
移動先:案内検索

スタンドアロンWSGIコンテナ

WSGIアプリケーションを含み、HTTPを提供するPythonで記述された人気のあるサーバーがあります。 これらのサーバーは、実行時にスタンドアロンになります。 あなたはあなたのウェブサーバーからそれらにプロキシすることができます。 問題が発生した場合は、プロキシ設定のセクションに注意してください。

Gunicorn

Gunicorn 「GreenUnicorn」はUNIX用のWSGIHTTPサーバーです。 これは、RubyのUnicornプロジェクトから移植されたフォーク前のワーカーモデルです。 イベントレットグリーンレットの両方をサポートします。 このサーバーでFlaskアプリケーションを実行するのは非常に簡単です。

gunicorn myproject:app

Gunicorn には、多くのコマンドラインオプションがあります。gunicorn -hを参照してください。 たとえば、ローカルホストポート4000(-b 127.0.0.1:4000)にバインドされた4つのワーカープロセス(-w 4)でFlaskアプリケーションを実行するには、次のようにします。

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app

gunicornコマンドは、アプリケーションモジュールまたはパッケージの名前と、モジュール内のアプリケーションインスタンスを想定しています。 アプリケーションファクトリパターンを使用する場合は、次の呼び出しを渡すことができます。

$ gunicorn "myproject:create_app()"

uWSGI

uWSGI は、Cで記述された高速アプリケーションサーバーです。 それは非常に構成可能であり、gunicornよりもセットアップが複雑になります。

uWSGI HTTPルーターの実行:

uwsgi --http 127.0.0.1:5000 --module myproject:app

より最適化されたセットアップについては、 uWSGI を参照してください。


Gevent

Gevent は、 greenlet を使用して、 libev イベントループの上に高レベルの同期APIを提供するコルーチンベースのPythonネットワーキングライブラリです。

from gevent.wsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

ツイストウェブ

Twisted Web は、成熟した非ブロッキングイベント駆動型ネットワークライブラリである Twisted に同梱されているWebサーバーです。 Twisted Webには、twistdユーティリティを使用してコマンドラインから制御できる標準のWSGIコンテナが付属しています。

twistd web --wsgi myproject.app

この例では、myprojectという名前のモジュールからappというFlaskアプリケーションを実行します。

Twisted Webは多くのフラグとオプションをサポートしており、twistdユーティリティも同様にサポートしています。 詳細については、twistd -hおよびtwistd web -hを参照してください。 たとえば、myprojectのアプリケーションを使用して、フォアグラウンドのポート8080でツイストWebサーバーを実行するには、次のようにします。

twistd -n web --port tcp:8080 --wsgi myproject.app

プロキシ設定

HTTPプロキシの背後でこれらのサーバーのいずれかを使用してアプリケーションをデプロイする場合、アプリケーションが機能するためには、いくつかのヘッダーを書き直す必要があります。 WSGI環境で問題となる2つの値は、通常、REMOTE_ADDRHTTP_HOSTです。 これらのヘッダーを渡すようにhttpdを構成するか、ミドルウェアで修正することができます。 Werkzeugには、いくつかの一般的なセットアップを解決するフィクサーが付属していますが、特定のセットアップ用に独自のWSGIミドルウェアを作成することをお勧めします。

これは、ローカルホストのポート8000で提供されるアプリケーションにプロキシし、適切なヘッダーを設定する単純なnginx構成です。

server {
    listen 80;

    server_name _;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        proxy_pass         http://127.0.0.1:8000/;
        proxy_redirect     off;

        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_set_header   X-Forwarded-Proto    $scheme;
    }
}

httpdがこれらのヘッダーを提供していない場合、最も一般的なセットアップでは、X-Forwarded-Hostから設定されているホストと、X-Forwarded-Forからのリモートアドレスが呼び出されます。

from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)

ヘッダーの信頼

悪意のあるクライアントによって偽造された可能性のある着信ヘッダーを盲目的に信頼するため、非プロキシ設定でこのようなミドルウェアを使用することはセキュリティの問題であることに注意してください。


別のヘッダーからヘッダーを書き換えたい場合は、次のようなフィクサーを使用することをお勧めします。

class CustomProxyFix(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        host = environ.get('HTTP_X_FHOST', '')
        if host:
            environ['HTTP_HOST'] = host
        return self.app(environ, start_response)

app.wsgi_app = CustomProxyFix(app.wsgi_app)