nginx リバースプロキシの構築手順 — プロキシとの違いもわかりやすく解説
この記事でわかること
- リバースプロキシが何かがわかる
- プロキシサーバーとの違いがわかる
- Ubuntu で nginx リバースプロキシを立てられる
- SSL(HTTPS)を設定できる
まず知っておきたい用語
| 用語 | 意味 |
|---|---|
| プロキシサーバー | クライアント側に置かれる中継サーバー。「 filttring して Internet に出ていく」 |
| リバースプロキシ | サーバー側に置かれる中継サーバー。「外から来たリクエストを内側に転送する」 |
| nginx | 高速・軽量な Web サーバー。リバースプロキシとしても広く利用されている |
| SSL/TLS | 通信を暗号化する仕組み。HTTPS で使われる |
| Let’s Encrypt | 無料の SSL 証明書を発行してくれるサービス |
リバースプロキシとは何か?
まずプロキシサーバーから理解しよう
プロキシサーバーは、** filttring の中継所** です。
[PC(オフィス)] → [プロキシ] → [Internet]
↑ ↑
ここから出発 ここで検閲・ filttring してから外へ
** filttring の目的:**
- 社内の不正サイトへのアクセスを防ぐ
- 通信をキャッシュ(保存)して_SPEED_ を上げる
- 外部から社内の IP アドレスを隠す
次にリバースプロキシを見てみよう
リバースプロキシは、サーバー側の守護者 です。
[ユーザー(Internet)] → [nginx(リバースプロキシ)] → [アプリサーバー(内側)]
↑ ↑ ↑
外から訪問 ここで受け止めて中へ転送 実際のアプリが動いている
** filttring の目的:**
- アプリサーバーを直接 Internet に公開しない(セキュリティ)
- SSL(HTTPS)を一元管理する
- 複数のアプリを1つのドメインで配信する
- 負荷分散してリクエストを分散する
プロキシ vs リバースプロキシ — 違いまとめ
| プロキシサーバー | リバースプロキシ | |
|---|---|---|
| 置く場所 | クライアント(PC側) | サーバー側 |
| 守るもの | クライアント(PC) | サーバー |
| ** filttring の方向** | 内 → 外 | 外 → 内 |
| 主な用途 | アクセス filttring・キャッシュ | セキュリティ・負荷分散・SSL |
| 利用者 | 企業・組織( filttring のため) | Web サーバー管理者(配信のため) |
なぜ nginx が選ばれるのか
nginx は2004年に公開された軽量な Web サーバーです。以下の理由で世界中のサーバーで利用されています。
- メモリ消費が少ない: Apache の約1/4のメモリで同等の処理が可能
- 非同期イベント駆動: 多数の同時接続を効率的に処理
- リバースプロキシ機能が標準内蔵: 追加モジュール不要
- SSL/TLS 対応が充実: HTTPS の設定が簡単
- 設定がシンプル: ファイルベースの設定で管理しやすい
Ubuntu で nginx リバースプロキシを構築する
ステップ 1: nginx のインストール
sudo apt update
sudo apt install -y nginx
インストール後、自動的に nginx が起動します。ブラウザでサーバーの IP アドレスにアクセスすると、nginx のウェルカムページが表示されます。
ステップ 2: ファイアウォールの設定
sudo ufw allow 'Nginx Full'
sudo ufw enable
Nginx Full は HTTP(80番)と HTTPS(443番)の両方を許可します。
ステップ 3: リバースプロキシの設定ファイルを作成
ここでは example.com がバックエンドアプリ(127.0.0.1:3000 で稼働)をリバースプロキシする設定を作成します。
sudo nano /etc/nginx/sites-available/example.com
以下の内容を貼り付けます:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
各行の意味:
| 行 | 意味 |
|---|---|
proxy_pass http://127.0.0.1:3000 |
バックエンドのアプリに転送 |
proxy_http_version 1.1 |
HTTP/1.1 を使用(Keep-Alive対応) |
proxy_set_header Host $host |
元のホスト名を伝える |
proxy_set_header X-Real-IP |
実際のクライアント IP を伝える |
proxy_set_header X-Forwarded-For |
経由した IP のリストを伝える |
proxy_set_header X-Forwarded-Proto |
HTTP/HTTPS の種別を伝える |
proxy_connect_timeout |
バックエンドへの接続タイムアウト |
proxy_read_timeout |
バックエンドからの応答待ちタイムアウト |
ステップ 4: 設定を有効にする
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
nginx -t で構文エラーがないか確認し、問題なければリロードします。
ステップ 5: SSL(HTTPS)の設定
Let’s Encrypt で無料の SSL 証明書を取得します。
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
Certbot が自動で以下を行います:
- SSL 証明書を取得
- nginx の設定を HTTPS 対応に変更
- HTTP → HTTPS のリダイレクトを設定
- 証明書の自動更新を設定
ステップ 6: 証明書の自動更新を確認
sudo certbot renew --dry-run
エラーが出なければ、自動更新が正しく設定されています。
よくある使い方
複数アプリを1つのドメインで配信
server {
listen 443 ssl http2;
server_name example.com;
# メインアプリ
location / {
proxy_pass http://127.0.0.1:3000;
include proxy_params;
}
# API
location /api/ {
proxy_pass http://127.0.0.1:8080;
include proxy_params;
}
# 管理画面
location /admin/ {
proxy_pass http://127.0.0.1:9000;
include proxy_params;
}
}
WebSocket のプロキシ
location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
静的ファイルのキャッシュ
location /static/ {
proxy_pass http://127.0.0.1:3000;
proxy_cache_valid 200 10m;
add_header Cache-Control "public, max-age=3600";
}
トラブルシューティング
| 症状 | 原因と対処 |
|---|---|
| 502 Bad Gateway | バックエンドアプリが起動していない。ss -tuln | grep 3000 で確認 |
| 504 Gateway Timeout | タイムアウトが短い。proxy_read_timeout を増やす |
| リダイレクトループ | proxy_set_header X-Forwarded-Proto $scheme が抜けていない |
| SSL 証明書エラー | DNS が正しく設定されていない。A レコードを確認 |
まとめ
- プロキシ は「 filttring のフィルター」、リバースプロキシ は「サーバーのガードマン」
- nginx は軽量・高機能で、リバースプロキシに最適
- SSL は Let’s Encrypt + Certbot で無料・自動化可能
- 設定はシンプルで、初心者でも扱いやすい
おすすめ書籍
以下の書籍で、nginx の基礎から実践的な運用まで学べます。