スタンドアロン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_ADDR
とHTTP_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)