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

TIPS
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アプリケーション)。実際のロジックを処理。
[Nginx]Python(Gunicorn+Flask)を実行
[unicorn]socket通信で高速化
NginxとGunicorn間の通信をTCPポートからUNIXドメインソケットへ切り替え、Webサーバーを高速化・セキュアにする方法を解説。移行時に陥りやすいパーミッション問題や「502 Bad Gateway」の解決策もステップバイステップで紹介します。

ステップ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 で一度終了させておきます。

[Nginx]Python(Gunicorn+Flask)を実行
[SSL]非公開サーバで証明書を取得
外部からアクセスできない非公開の内部サーバーで、Let's EncryptのSSL証明書を取得・運用する方法を解説。DNS-01チャレンジを活用し、インバウンド通信不要で証明書を発行する仕組みや条件、API連携による自動更新の自動化手法まで紹介します。

ステップ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を無事に実行してくれました。

Q よくある質問 (FAQ)
Q. なぜNginx単体ではPythonプログラムを直接実行できないのですか?
A.
Nginxは静的ファイルの処理やリバースプロキシに特化したWebサーバーであり、Pythonコードを実行する機能を持たないため、WSGI規格に準拠したGunicornなどのアプリケーションサーバーを仲介させる必要があります。
Q. 本番環境でGunicornを起動する際、なぜ「-D」オプションを使用するのですか?
A.
「-D」オプションはGunicornをデーモン(バックグラウンド)プロセスとして起動するためのものです。これにより、ターミナルを閉じてもプロセスが終了せず、Webアプリケーションの常時稼働が可能になります。

コメント

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