FlaskアプリケーションをuWSGIとNginxでデプロイする方法

はじめに

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経由でクライアントに返します。このアーキテクチャにより、セキュリティ、性能、管理性が向上します。

タグ: flask uWSGI nginx Python Webサーバー

8月5日 09:13 投稿