コンテンツにスキップ

リバースプロキシの設定

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 サーバー上からバックエンドへ到達できることを確認する。

Terminal window
curl -I http://127.0.0.1:3000/

ここで失敗する場合、nginx の設定ではなくバックエンドアプリケーション側を先に直す。


/etc/nginx/sites-available/app.example.com.conf を作成する。

/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;
}
}

Terminal window
sudo ln -s /etc/nginx/sites-available/app.example.com.conf \
/etc/nginx/sites-enabled/app.example.com.conf

構文を確認して reload する。

Terminal window
sudo nginx -t
sudo systemctl reload nginx

HTTP でアクセスすると HTTPS へリダイレクトされることを確認する。

Terminal window
curl -I http://app.example.com/

HTTPS でバックエンドの応答が返ることを確認する。

Terminal window
curl -I https://app.example.com/

バックエンドアプリケーション側のログで、リクエストが届いていることも確認する。


アプリケーションを /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 のパスがずれる。


Terminal window
sudo nginx -t
sudo nginx -T
systemctl status nginx
journalctl -u nginx
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
curl -I http://app.example.com/
curl -I https://app.example.com/

502 が返る場合は、nginx からバックエンドへ接続できていない可能性が高い。まず curl http://127.0.0.1:3000/、バックエンドの listen アドレス、firewall、アプリケーションログを確認する。