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:app:app.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を無事に実行してくれました。

コメント