[Nginx]Python(Gunicorn+Flask)を実行

TIPS

Webサーバーとして圧倒的なシェアを誇るNginx(エンジンエックス)は高速でリクエストを処理できる非常に優秀なサーバーですが、実はNginx単体ではPythonプログラムを直接動かすことはできません。

NginxでPythonアプリを動かすには、WEBサーバー(Nginx)とPythonアプリの間を仲介してくれるアプリケーションサーバー(WSGIサーバー)を挟む必要があります。

今回は、最も一般的で実務でもよく使われる「Nginx + Gunicorn + Flask(Python)」の構成について、設定から起動までの手順を分かりやすくブログにまとめました!

全体像のイメージ

仕組みはとてもシンプルです。ユーザーからのリクエストをまずNginxが受け取り、それをGunicornという仲介役にパスします。GunicornがPythonプログラムを実行し、結果をNginx経由でユーザーに返すという流れです。

  • Nginx:窓口(Webサーバー)。静的ファイルの処理やリバースプロキシを担当。
  • Gunicorn:仲介役(WSGIサーバー)。NginxからのリクエストをPythonが理解できる形に変換。
  • Flask (Python):中身(Webアプリケーション)。実際のロジックを処理。

ステップ1:Python環境とFlaskアプリの準備

まずはPythonの仮想環境を作成し、必要なパッケージ(FlaskとGunicorn)をインストールします。ここではUbuntuなどのLinux環境を想定しています。

1. 環境構築

# 独自の作業ディレクトリを作成して移動
mkdir my_python_app && cd my_python_app

# 仮想環境の作成と有効化
python3 -m venv venv
source venv/bin/activate

# FlaskとGunicornのインストール
pip install Flask gunicorn

2. サンプルアプリの作成

次に、実行するためのシンプルなPythonファイルを作成します。今回は app.py という名前で作成しましょう。

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return '<h1>NginxからPythonの実行に成功しました!</h1>'

if __name__ == '__main__':
    app.run()

ステップ2:Gunicorn単体での起動確認

Nginxを設定する前に、まずは仲介役であるGunicornが正しくPythonアプリを動かせるか確認します。

以下のコマンドを実行してみてください。

gunicorn --bind 127.0.0.1:8000 app:app
  • --bind 127.0.0.1:8000:サーバー内部(ローカルホスト)の8000番ポートで待機します。
  • app:appapp.pyファイルのappというFlaskインスタンスを実行するという意味です。

起動したら、別のターミナルやブラウザから http://127.0.0.1:8000 にアクセスし、「NginxからPythonの実行に成功しました!」と表示されればGunicorn側の準備は完了です。確認できたら Ctrl + C で一度終了させておきます。

ステップ3:Nginxのリバースプロキシ設定

いよいよ本題のNginxの設定です。Nginxが受け取ったリクエストを、先ほど確認したGunicorn(8000番ポート)へ転送(リバースプロキシ)する設定を書き加えます。

Nginxの設定ファイル(例: /etc/nginx/sites-available/default/etc/nginx/conf.d/default.conf)を開き、以下のように記述します。

server {
    listen 80;
    server_name your_domain_or_IP; # 自身のドメインまたはサーバーのIPアドレス

    location / {
        # 外部からのリクエストをGunicornが待機する8000番ポートに転送
        proxy_pass http://127.0.0.1:8000;
        
        # ヘッダー情報を正しく引き渡すための設定
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

設定ファイルを保存したら、構文にエラーがないかチェックしてNginxを再起動します。

Bash

# 設定ファイルの構文チェック
sudo nginx -t

# エラーがなければ再起動して設定を反映
sudo systemctl restart nginx

ステップ4:いざ、連動させて動作確認!

最後に、すべてのパーツを同時に動かして確認します。

1. Gunicornをバックグラウンドで起動

本番運用を想定して、今回は後ろでずっと動き続けるように -D(デーモン化)オプションをつけて起動します。

gunicorn --bind 127.0.0.1:8000 app:app -D

2. ブラウザからアクセス

ブラウザを開き、設定したドメイン、またはサーバーのIPアドレス( http://サーバーのIPアドレス )に直接アクセスしてみてください。

ポート番号(:8000)をつけずにアクセスし、先ほどのFlaskアプリの画面が表示されれば成功です!

Nginx(80番ポート)がリクエストを受け取り、裏側のGunicorn(8000番ポート)を通じてPythonを無事に実行してくれました。

コメント

タイトルとURLをコピーしました