はじめに
Flaskは開発が迅速に行えるフレームワークですが、本番環境でのデプロイには単純にnohup python app.pyを実行するだけでは不十分です。この方法は並行処理能力が低く、セキュリティ面でも脆弱です。本番環境向けの安定したデプロイには、uWSGIのようなアプリケーションサーバと、Nginxのようなリバースプロキシサーバを組み合わせるのが標準的なアプローチです。本記事では、このセットアップ方法を解説します。
uWSGIの設定
uWSGIは、FlaskやDjangoなどのPython Webフレームワーク向けに最適化された、高性能なアプリケーションサーバです。まず、プロジェクトのルートディレクトリに設定ファイルを作成します。ここではuwsgi.iniという名前でファイルを作成します。
[uwsgi]
# Nginxとの通信に使用するソケット
socket = 127.0.0.1:3031
# プロジェクトのルートディレクトリ
chdir = /var/www/my_flask_app
# WSGIエントリーポイントとなるPythonファイル
wsgi-file = /var/www/my_flask_app/app.py
# WSGIアプリケーションオブジェクトの名前
callable = application
# 起動するワーカープロセスの数
processes = 2
# 各プロセス内のスレッド数
threads = 4
# デーモンとして実行し、ログをファイルに出力
daemonize = /var/www/my_flask_app/uwsgi.log
# マスタープロセスとして実行(推奨)
master = true
設定項目の説明は以下の通りです。
- socket: Nginxとの通信に使用するネットワークソケットを指定します。この設定は、uWSGIが直接HTTPリクエストを受け付けるものではなく、Nginxからのリクエストを受け取るための「パイプ」のようなものです。
- chdir: uWSGIが実行される作業ディレクトリを指定します。これにより、相対パスのインポートが正しく動作します。
- wsgi-file: WSGIアプリケーションを定義しているPythonファイルのパスを指定します。
- callable: WSGIアプリケーションオブジェクトの名前を指定します。通常は
app = Flask(__name__)で作成されるappオブジェクトですが、applicationという名前も一般的です。 - processes / threads: 並列処理の性能を調整します。プロセス数とスレッド数を適切に設定することで、サーバーの負荷と応答性能のバランスを取ります。
- daemonize: uWSGIをバックグラウンドプロセス(デーモン)として起動し、指定したファイルにログを出力します。
Nginxの設定
Nginxは、リバースプロキシ、静的ファイルの配信、負荷分散、セキュリティフィルタリングなどの役割を担います。Nginxの設定ファイル(通常は/etc/nginx/conf.d/ディレクトリ内)を編集します。ここでは、新しい設定ファイルmy_flask_app.confを作成します。
server {
# 外部からのアクセスを受け付けるポート
listen 80;
# サーバーのドメイン名またはIPアドレス
server_name your_domain_or_ip;
# アクセスログの保存先
access_log /var/log/nginx/my_flask_app_access.log;
# エラーログの保存先
error_log /var/log/nginx/my_flask_app_error.log;
location / {
# uWSGIのパラメータを含む標準ファイルをインクルード
include /etc/nginx/uwsgi_params;
# uWSGIサーバーのソケットアドレス
# uWSGIのsocket設定と一致させる必要があります。
uwsgi_pass 127.0.0.1:3031;
# uWSGIの作業ディレクトリ
uwsgi_param UWSGI_CHDIR /var/www/my_flask_app;
# WSGIスクリプトとアプリケーションオブジェクト
uwsgi_param UWSGI_SCRIPT app:application;
}
# 静的ファイル(CSS, JS, 画像など)の配信設定
location /static/ {
# 静的ファイルが存在するディレクトリ
root /var/www/my_flask_app;
}
}
設定項目の説明は以下の通りです。
- server: サーバーブロックの開始を示します。
- listen: Nginxがリッスンするポート番号(通常は80)を指定します。
- server_name: サーバーを特定するドメイン名またはIPアドレスを指定します。
- location /: ルートパス(
/)へのリクエストを処理するブロックです。 - include uwsgi_params: uWSGIが正しく動作するために必要なパラメータを含む標準ファイルを読み込みます。
- uwsgi_pass: リクエストを転送する先のuWSGIサーバーのソケットアドレスを指定します。uWSGIの
socket設定と完全に一致させる必要があります。 - uwsgi_param UWSGI_CHDIR: uWSGIサーバーにプロジェクトのルートディレクトリを伝えます。
- uwsgi_param UWSGI_SCRIPT: uWSGIサーバーに、どのPythonファイルのどのオブジェクトをWSGIアプリケーションとして使用するかを伝えます。
- location /static/: 静的ファイルを配信するための設定ブロックです。クライアントからの静的ファイルリクエストは、このブロック内の設定に基づいて処理されます。
この設定により、クライアントからのリクエストはまずNginxが受け取り、静的ファイルであれば直接配信し、そうでなければuWSGIサーバーに転送します。uWSGIがリクエストを処理し、その結果をNginx経由でクライアントに返します。このアーキテクチャにより、セキュリティ、性能、管理性が向上します。