はじめに
この実験では、Nginx をリバースプロキシとして設定する方法を学びます。
リバースプロキシは、大きな会社の受付係に似ています。代表番号に電話をかけても、CEO やサポート担当者と直接話すわけではありません。まず受付係が電話に出て「どのようなご用件でしょうか」と尋ね、適切な担当者に電話を転送します。
このシナリオでは、次のように考えます。
- Nginx は受付係です(ポート 80 で待ち受けます)。
- Python App は「サポートチーム」です(ポート 8000 で待ち受けます)。
- あなたは電話をかけるクライアントです。
/app が要求されたときに、Nginx がそのリクエストを Python サーバーへ転送し、レスポンスをクライアントへ返すように設定します。
リバースプロキシは、現代の Web アーキテクチャの中心的な役割を担います。アプリケーションサーバーの前段に配置することで、安定した公開エントリポイントを提供できます。また、TLS 終端、負荷分散、キャッシュ、リクエストルーティングも処理できます。
つまり、Nginx は常に自分でファイルを配信するわけではありません。クライアントからのトラフィックを受け取り、そのトラフィックを背後にある別のサービスへ渡すことが主な役割になる場合もあります。
バックエンドアプリケーションを起動する
まず、リクエストの転送先となるサービスが必要です。ここでは、Python を使って非常にシンプルな Web アプリケーションを作成します。
アプリケーションがファイルを配信するための専用フォルダーを作成します。
プロジェクトディレクトリ内に app というフォルダーを作成し、その中にシンプルな HTML ファイルを作成します。
mkdir -p ~/project/app
echo "Hello from the Python Backend." > ~/project/app/index.html
次に、Python サーバーを起動します。このコマンドは、Python に Web サーバーとして動作させ、現在のディレクトリにあるファイルをポート 8000 で配信するよう指示します。
この Python プロセスが、この例におけるバックエンドアプリケーションサーバーです。実際のコンテンツ生成は Python サーバーが担当し、Nginx は公開側のエントリポイントとして前段で動作します。
末尾に & を付けると、サーバーをバックグラウンドで実行できます。サーバーを動かしたまま、ターミナルを引き続き使用できます。
cd ~/project
python3 -m http.server 8000 &
正しく起動したことを確認します。ポート 8000 で待ち受けているプロセスを検索してください。
netstat -tuln | grep 8000
0.0.0.0:8000 と (LISTEN) が表示されます。これは、「バックエンドアプリケーション」がポート 8000 でリクエストを受け付ける準備ができていることを示します。
Nginx のリバースプロキシを設定する
このステップでは、Python アプリケーションについて Nginx に知らせるため、Nginx の設定ファイルを変更します。
sudo と nano テキストエディターを使って、デフォルトの設定ファイルを編集します。
sudo nano /etc/nginx/sites-enabled/default
server { ... } ブロックの中を下方向に移動します。既存の location / { ... } ブロックがあります。その下に新しい location /app ブロックを追加します。
ファイルに次のコードを追加してください。中括弧 { } とセミコロン ; を間違えないように注意してください。
location /app {
proxy_pass http://127.0.0.1:8000;
}
この設定で何が起きるのでしょうか。
location /app:/appで始まるリクエストを Nginx が処理するように指定します。proxy_pass ...:電話を転送するボタンのような役割を持ちます。/appへのリクエストを受け取ったら、Nginx がlocalhost(127.0.0.1)のポート 8000 に転送するよう指示します。
この転送が、リバースプロキシの本質です。クライアントは Nginx と通信しますが、Nginx はクライアントの代わりにバックエンドサーバーのクライアントとして動作します。
ファイルの構成は、次のようになります。
server {
listen 80 default_server;
...
location / {
try_files $uri $uri/ =404;
}
location /app {
proxy_pass http://127.0.0.1:8000;
}
}
Ctrl+O を押してから Enter を押すとファイルを保存できます。その後、Ctrl+X を押して nano を終了します。
設定を検証して再読み込みする
設定ファイルは更新されましたが、Nginx はまだ古いルールを使用しています。変更を反映するため、サービスを再読み込みします。
まず、再読み込みの前に、必ず設定にタイプミスがないかテストしてください。壊れた設定を再読み込みすると、Web サーバー全体が動作しなくなる可能性があります。
次のテストコマンドを実行します。
sudo nginx -t
次のメッセージが表示されます。
syntax is oktest is successful
テストに成功したら、Nginx を再読み込みして変更を適用します。
sudo service nginx reload
これで Nginx の設定が更新され、リクエストを転送できる状態になりました。
この時点で、Nginx はディスク上のファイルを読み取るだけのファイルサーバーではなく、URL とバックエンドサービスの間をつなぐルーターとして動作しています。
プロキシをテストする
最後のステップでは、「受付係」が正しく役割を果たしていることを確認します。
Nginx(ポート 80)に対して /app/ を要求する Web リクエストを送信します。Nginx はこのリクエストを Python サーバー(ポート 8000)へすぐに転送するはずです。
次のコマンドを実行します。
curl http://localhost/app/
バックエンドサーバーから次のメッセージが表示されます。
Hello from the Python Backend.
何が起きたのでしょうか。
- あなたが Nginx(
localhost:80)に/app/を要求しました。 - Nginx が設定ルールを確認し、
/appに一致したため、proxy_passの指示に従いました。 - Nginx がポート 8000 の Python Server にリクエストを送りました。
- Python Server が「Hello...」ページを Nginx に返しました。
- Nginx が「Hello...」ページをあなたに返しました。
このリクエストの流れは、現代のインフラストラクチャのさまざまな場面に登場するため、覚えておく価値があります。
browser -> reverse proxy -> application server -> reverse proxy -> browser
これで、リバースプロキシの構築に成功しました。
まとめ
この実験では、Nginx をリバースプロキシとして正常に設定しました。次の方法を学びました。
- Python を使ってシンプルなバックエンドアプリケーションをホストする。
- ルーティング用の
locationブロックを使って Nginx を設定する。 proxy_passディレクティブを使ってトラフィックを転送する。curlを使ってプロキシのリクエストチェーンを検証する。
このアーキテクチャは現代の Web アプリケーションの基盤です。Nginx をセキュリティや負荷分散に利用し、別のアプリケーションにバックグラウンドでロジックを処理させることができます。



