Flask アプリを Gunicorn でデプロイする

Flask の開発サーバーは本番環境には適さない。本番では Gunicorn などの WSGI サーバーを使ってデプロイする。

Gunicorn のインストール

pip install gunicorn

基本的な起動

gunicorn app:app

app:app は「app.py ファイルの app オブジェクト」を意味する。デフォルトでは 127.0.0.1:8000 で起動する。

オプション指定

gunicorn -w 4 -b 0.0.0.0:8000 app:app
-wワーカープロセス数
-bバインドするアドレスとポート
--timeoutリクエストタイムアウト秒数
--access-logfileアクセスログの出力先
--error-logfileエラーログの出力先

ワーカー数の目安は (2 × CPUコア数) + 1 とされている。

アプリケーションファクトリの場合

create_app 関数を使っている場合は、呼び出し形式を指定する。

gunicorn "app:create_app()"

設定ファイル

オプションが多い場合は設定ファイルにまとめられる。

# gunicorn.conf.py
bind = '0.0.0.0:8000'
workers = 4
timeout = 30
accesslog = '/var/log/gunicorn/access.log'
errorlog = '/var/log/gunicorn/error.log'
gunicorn -c gunicorn.conf.py app:app

systemd によるサービス化

Linux 環境ではサービスとして登録すると、自動起動や再起動が容易になる。

# /etc/systemd/system/myapp.service
[Unit]
Description=Gunicorn instance to serve myapp
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/var/www/myapp/venv/bin/gunicorn -c gunicorn.conf.py app:app

[Install]
WantedBy=multi-user.target
sudo systemctl start myapp
sudo systemctl enable myapp

Nginx との連携

Gunicorn の前段に Nginx を配置してリバースプロキシとするのが一般的である。静的ファイルの配信やSSL終端を Nginx に任せることで、パフォーマンスとセキュリティが向上する。