Flask アプリケーションを Gunicorn で本番運用する手順
1. 導入
Flask は軽量で柔軟な Python 製 Web フレームワークであり、小規模から中規模のアプリケーション開発に適しています。しかし、本番環境で Flask アプリケーションを効率的かつ安定的に稼働させるためには、WSGI (Web Server Gateway Interface) サーバーである Gunicorn の利用が不可欠です。Gunicorn は、複数のプロセスでリクエストを処理することで、アプリケーションのパフォーマンスとスケーラビリティを向上させます。本稿では、Flask アプリケーションを Gunicorn を用いて本番運用するための具体的な手順と、運用に際して考慮すべき事項を解説します。
2. 事前準備
2.1. Python 環境の構築
本番サーバーに Python がインストールされていることを確認します。バージョンは、開発環境と同じ、または互換性のあるバージョンを選択してください。
2.2. 仮想環境の作成と有効化
プロジェクトごとに独立した Python 環境を構築するために、仮想環境を使用します。これにより、依存関係の衝突を防ぎ、管理を容易にします。
python3 -m venv venv source venv/bin/activate
2.3. 必要なパッケージのインストール
Flask アプリケーション本体と Gunicorn をインストールします。
pip install Flask gunicorn
アプリケーションが依存する他のライブラリも、requirements.txt ファイルに記述し、一括でインストールすることを推奨します。
pip freeze > requirements.txt pip install -r requirements.txt
3. Flask アプリケーションの準備
3.1. WSGI エントリーポイントの作成
Gunicorn が Flask アプリケーションを起動するために、WSGI エントリーポイントとなるファイルを作成します。通常、これはアプリケーションのインスタンスを生成するファイルです。例えば、app.py というファイルに以下のようなコードを記述します。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
このファイル(例:app.py)を Gunicorn から呼び出すように設定します。
4. Gunicorn の設定と実行
4.1. 基本的な Gunicorn コマンド
Gunicorn はコマンドラインから実行します。基本的なコマンドは以下の通りです。
gunicorn -w 4 app:app
-w 4:-wオプションはワーカープロセスの数を指定します。ここでは 4 つのワーカープロセスを起動します。CPU コア数に合わせて調整することが一般的です。app:app: この部分は、モジュール名:アプリケーションインスタンス名を示します。上記の例では、app.pyファイル内のappという名前の Flask インスタンスを起動することを意味します。
4.2. バインドオプション
Gunicorn がリッスンする IP アドレスとポートを指定します。
gunicorn -w 4 -b 0.0.0.0:8000 app:app
-b 0.0.0.0:8000: すべてのネットワークインターフェイス(0.0.0.0)のポート8000でリッスンします。本番環境では、通常、Web サーバー(Nginx や Apache)がリバースプロキシとして機能し、Gunicorn はローカルホスト(127.0.0.1)でポートをバインドすることが多いです。
4.3. Gunicorn 設定ファイルの使用
Gunicorn の設定項目が増えてきた場合、設定ファイルを管理することで、コマンドラインが煩雑になるのを防ぎ、設定の可読性と保守性を向上させることができます。gunicorn_config.py のようなファイルを作成し、以下のように設定を記述します。
# gunicorn_config.py bind = "127.0.0.1:8000" workers = 4 threads = 2 loglevel = "info" accesslog = "access.log" errorlog = "error.log"
そして、この設定ファイルを使用して Gunicorn を起動します。
gunicorn -c gunicorn_config.py app:app
4.4. プロセス管理(systemd の利用)
本番環境では、サーバーの再起動時や Gunicorn プロセスのクラッシュ時に自動的に Gunicorn を再起動させる必要があります。Linux システムでは、systemd を使用して Gunicorn をサービスとして管理するのが一般的です。
/etc/systemd/system/myflaskapp.service のようなファイルを作成し、以下のように記述します。
[Unit] Description=Gunicorn instance to serve myflaskapp After=network.target [Service] User=your_user Group=your_group WorkingDirectory=/path/to/your/flask/app Environment="PATH=/path/to/your/flask/app/venv/bin" ExecStart=/path/to/your/flask/app/venv/bin/gunicorn --access-logfile - --error-logfile - --workers 4 --bind unix:/run/myflaskapp.sock app:app [Install] WantedBy=multi-user.target
User,Group: Gunicorn プロセスを実行するユーザーとグループを指定します。セキュリティのため、root 権限を持たないユーザーを指定することが推奨されます。WorkingDirectory: Flask アプリケーションのルートディレクトリを指定します。Environment="PATH=...": 仮想環境内の Gunicorn を実行するために PATH を設定します。ExecStart: Gunicorn の起動コマンドを指定します。ここでは Unix ソケット(unix:/run/myflaskapp.sock)を使用しています。
作成後、systemd でサービスを有効化し、起動します。
sudo systemctl daemon-reload sudo systemctl enable myflaskapp.service sudo systemctl start myflaskapp.service sudo systemctl status myflaskapp.service
5. Web サーバー(Nginx)との連携
本番環境では、Gunicorn が直接インターネットに公開されることは稀です。通常、Nginx や Apache といった Web サーバーを Gunicorn の手前に配置し、リバースプロキシとして機能させます。これにより、静的ファイルの配信、SSL/TLS 暗号化、ロードバランシング、DoS 攻撃からの保護などを Nginx に任せることができます。
5.1. Nginx 設定例
Nginx の設定ファイル(例:/etc/nginx/sites-available/myflaskapp)に以下のような設定を記述します。
server {
listen 80;
server_name your_domain.com www.your_domain.com;
location /static {
alias /path/to/your/flask/app/static;
}
location / {
proxy_pass http://unix:/run/myflaskapp.sock;
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;
}
}
proxy_pass http://unix:/run/myflaskapp.sock;: Gunicorn が Unix ソケットで待ち受けている場合、このパスを指定します。TCP ソケットで待ち受けている場合はhttp://127.0.0.1:8000のようになります。proxy_set_header: クライアントの情報を Gunicorn に正しく渡すために重要です。
設定後、Nginx を再起動して設定を反映させます。
sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled/ sudo systemctl restart nginx
6. セキュリティに関する考慮事項
- HTTPS の利用: 本番環境では、必ず SSL/TLS 証明書を導入し、HTTPS で通信するように設定してください。Let’s Encrypt を利用すると無料で証明書を取得できます。
- 最小権限の原則: Gunicorn プロセスは、必要最低限の権限を持つユーザーで実行してください。
- ログの監視: エラーログとアクセスログを定期的に確認し、不正なアクセスやエラーの兆候を早期に発見できるようにします。
- ファイアウォールの設定: 必要なポート以外は閉じるようにファイアウォールを設定してください。
7. パフォーマンスチューニング
- ワーカー数の調整: CPU コア数やサーバーのスペックに合わせてワーカー数を調整します。多すぎるとコンテキストスイッチのオーバーヘッドが増加し、少なすぎるとリソースを有効活用できません。
- スレッド数の利用: Gunicorn はワーカープロセス内でスレッドも利用できます。I/O バウンドな処理が多いアプリケーションでは、スレッド数を増やすことでパフォーマンスが向上する場合があります。
- アプリケーションの最適化: データベースクエリの最適化、キャッシュの利用、非同期処理の導入など、Flask アプリケーション自体のパフォーマンス改善も重要です。
8. まとめ
Flask アプリケーションを Gunicorn で本番運用する手順は、仮想環境の準備から始まり、Gunicorn の実行、そして Nginx との連携、プロセス管理まで多岐にわたります。これらのステップを正確に実行することで、安定したパフォーマンスでアプリケーションを公開することが可能になります。セキュリティとパフォーマンスの考慮も怠らず、継続的な監視とチューニングを行うことが、本番環境での運用成功の鍵となります。
