作成したアプリをEC2上にデプロイできたはいいものの、リバースプロキシサーバーとしてのNginxが具体的にどういう役割を担っているのかいまいちわからなかったため、ここで整理します。
プロキシサーバーとリバースプロキシサーバーの違い
プロキシサーバー
クライアント(内から) → プロキシサーバー → インターネット
- 社内ネットワークが外に直接出られないときに通す道
- セキュリティ・ログ監視・通信制御などで使用される
→自分の代わりに外へアクセスしてくれる
例: 会社のpcでブラウザの「プロキシ設定」をする場合など
リバースプロキシサーバー
クライアント(外から) → リバースプロキシサーバー(nginxなど) → webアプリ
- サーバ側からみて、複数のアプリ・APIにルーティングしたり負荷分散する
- ポート変換などができる
→外から来たアクセスを中継して内部に通してくれる
http://example.com → localhost:8000に中継
全体像(マスキング済)
#1
server {
listen 80;
server_name <DOMAIN> www.<DOMAIN>;
return 301 https://$host$request_uri;
}
#2
server {
listen 443 ssl http2;
server_name <DOMAIN> www.<DOMAIN>;
#3
ssl_certificate /etc/letsencrypt/live/<LE_PATH>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<LE_PATH>/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
#4
location / {
proxy_pass http://x.x.x.x:<APP_PORT>;
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;
}
#5
location /static/ {
alias /var/www/static/;
autoindex off;
}
}
①listen80
server {
listen 80;
server_name <DOMAIN> www.<DOMAIN>;
return 301 https://$host$request_uri;
}
行 | 内容 |
---|---|
listen 80; | HTTPのポートでリクエストを受ける |
server_name … | ドメイン名にマッチした場合にこの設定を適用 |
return 301 … | 受け取ったHTTPリクエストを、HTTPSへリダイレクト |
②listen443
server {
listen 443 ssl http2;
server_name <DOMAIN> www.<DOMAIN>;
行 | 内容 |
---|---|
listen 443 ssl; |
HTTPS(SSL)通信を受け付ける設定 |
server_name |
①と同じ。指定ドメインからのリクエストを対象にする |
③SSL証明書設定
ssl_certificate /etc/letsencrypt/live/<LE_PATH>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<LE_PATH>/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
行 | 内容 |
---|---|
ssl_certificate |
サーバー証明書本体(ドメイン用) |
ssl_certificate_key |
秘密鍵(certbotが生成) |
include |
TLSの推奨オプション設定(Let’s Encryptが自動生成) |
ssl_dhparam |
強い暗号設定用の追加キー(Diffie-Hellman) |
④転送処理
proxy_pass http://x.x.x.x:<APP_PORT>;
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;
行 | 内容 |
---|---|
location / |
ルート(トップページ)へのリクエスト |
proxy_pass |
ローカルで動いているアプリケーションのポートへ転送 |
proxy_set_header |
転送先に対して元のリクエスト情報を渡す設定(重要) |
⑤静的なファイルの処理
location /static/ {
alias /var/www/static/;
autoindex off;
}
}
行 | 内容 |
---|---|
location /static/ |
/static/ にアクセスが来たときの処理 |
alias |
実際のファイルパスにマッピング(alias は必ず末尾に/ 必要) |
autoindex |
ディレクトリの中身を一覧表示できるようにする(デバッグ用途) |
構成まとめ
機能 | 動作 |
---|---|
HTTPアクセス | 自動でHTTPSにリダイレクト |
HTTPSアクセス | 鍵マーク付きのアプリ(URL)を表示 |
CSSやJSなどの静的ファイル |
/static/ 経由で読み込まれる |