FlaskをGunicornで本番運用する手順

プログラミング

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 との連携、プロセス管理まで多岐にわたります。これらのステップを正確に実行することで、安定したパフォーマンスでアプリケーションを公開することが可能になります。セキュリティとパフォーマンスの考慮も怠らず、継続的な監視とチューニングを行うことが、本番環境での運用成功の鍵となります。