リバースプロキシの設定
nginx をフロントに置き、背後のアプリケーションサーバーへリクエストを転送する。
| 項目 | 例 |
|---|---|
| OS | Debian 13.x(Ubuntu系でも概ね同様) |
| 公開URL | https://app.example.com/ |
| nginx | app.example.com |
| バックエンド | http://127.0.0.1:3000 |
| 設定ファイル | /etc/nginx/sites-available/app.example.com.conf |
| 証明書 | /etc/nginx/tls/app.example.com/fullchain.pem |
| 秘密鍵 | /etc/nginx/tls/app.example.com/privkey.pem |
バックエンドアプリケーションは、nginx と同じサーバーの 127.0.0.1:3000 で起動している前提とする。
証明書は HTTP/HTTPSとリダイレクトの設定 と同じく、サーバー証明書とIntermediate CA証明書を連結した fullchain.pem、root所有・600の配備用秘密鍵 privkey.pem を使用する。証明書のSANには app.example.com を含める。
1. バックエンドへ直接疎通確認する
Section titled “1. バックエンドへ直接疎通確認する”nginx を設定する前に、nginx サーバー上からバックエンドへ到達できることを確認する。
curl -I http://127.0.0.1:3000/ここで失敗する場合、nginx の設定ではなくバックエンドアプリケーション側を先に直す。
2. upstreamを定義する
Section titled “2. upstreamを定義する”/etc/nginx/sites-available/app.example.com.conf を作成する。
upstream app_backend { server 127.0.0.1:3000;}
server { listen 80; listen [::]:80; server_name app.example.com;
return 301 https://$host$request_uri;}
server { listen 443 ssl; listen [::]:443 ssl; server_name app.example.com;
ssl_certificate /etc/nginx/tls/app.example.com/fullchain.pem; ssl_certificate_key /etc/nginx/tls/app.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3;
location / { proxy_pass http://app_backend; 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; }}3. サイトを有効化する
Section titled “3. サイトを有効化する”sudo ln -s /etc/nginx/sites-available/app.example.com.conf \ /etc/nginx/sites-enabled/app.example.com.conf構文を確認して reload する。
sudo nginx -tsudo systemctl reload nginx4. 動作確認する
Section titled “4. 動作確認する”HTTP でアクセスすると HTTPS へリダイレクトされることを確認する。
curl -I http://app.example.com/HTTPS でバックエンドの応答が返ることを確認する。
curl -I https://app.example.com/バックエンドアプリケーション側のログで、リクエストが届いていることも確認する。
5. パス付きで転送する場合
Section titled “5. パス付きで転送する場合”アプリケーションを /app/ 配下で公開する場合、バックエンドが / 配下で動くのか、/app/ 配下で動くのかを決める。
バックエンドへ /app/ を外して渡す例。
location /app/ { proxy_pass http://app_backend/; 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;}/app/ を付けたまま渡す例。
location /app/ { proxy_pass http://app_backend; 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_pass の URI の有無でバックエンドへ渡るパスが変わる。ここを曖昧にすると、静的ファイルや API のパスがずれる。
確認コマンド
Section titled “確認コマンド”sudo nginx -tsudo nginx -Tsystemctl status nginxjournalctl -u nginxtail -f /var/log/nginx/access.logtail -f /var/log/nginx/error.logcurl -I http://app.example.com/curl -I https://app.example.com/502 が返る場合は、nginx からバックエンドへ接続できていない可能性が高い。まず curl http://127.0.0.1:3000/、バックエンドの listen アドレス、firewall、アプリケーションログを確認する。