HTTP・HTTPS・リダイレクト
nginx では、HTTP 用の
serverと HTTPS 用のserverを分け、HTTP 側でreturnを使って HTTPS へリダイレクトする構成がよく使われる。
HTTPとHTTPSの違い
Section titled “HTTPとHTTPSの違い”HTTP は、暗号化されていないアプリケーション層の通信である。HTTPS は、HTTP を TLS の上で流す通信である。
HTTP client -> nginx
HTTPS client -> TLS -> nginx -> HTTP処理HTTPS では、nginx が TLS サーバー証明書と秘密鍵を使って TLS 接続を受ける。nginx が TLS を終端すると、その後の処理は通常の HTTP リクエストとして server や location に渡される。
HTTPSで必要なもの
Section titled “HTTPSで必要なもの”HTTPS を受ける nginx には、少なくとも次が必要になる。
| 要素 | 例 |
|---|---|
| 待ち受け設定 | listen 443 ssl; |
| サーバー証明書 | ssl_certificate /etc/nginx/tls/www.example.com/fullchain.pem; |
| サーバー秘密鍵 | ssl_certificate_key /etc/nginx/tls/www.example.com/privkey.pem; |
| 対象ホスト名 | server_name www.example.com; |
証明書の SAN には、実際にブラウザーや curl で接続する DNS 名を入れる。証明書の作成は Server Certificateの作成 を参照する。
HTTPからHTTPSへのリダイレクト
Section titled “HTTPからHTTPSへのリダイレクト”HTTP で来たアクセスを HTTPS に寄せるには、HTTP 用 server で return を使う。
server { listen 80; listen [::]:80; server_name www.example.com;
return 301 https://$host$request_uri;}return 301 は、リクエスト処理をそこで止め、クライアントに恒久的なリダイレクトを返す。$host$request_uri を使うと、元の Host と URI を保ったまま scheme だけを HTTPS に変えられる。
301と308
Section titled “301と308”リダイレクトでよく使うステータスは次のとおり。
| ステータス | 意味 | 備考 |
|---|---|---|
301 |
恒久的リダイレクト | 多くの HTTP -> HTTPS リダイレクトで使われる |
302 |
一時的リダイレクト | 一時的な移動向け |
308 |
恒久的リダイレクト | メソッドを維持したい場合に使う |
学習用の基本構成では 301 でよい。POST などのメソッド維持を厳密に考える API では 308 も検討する。
Basic認証とHTTPS
Section titled “Basic認証とHTTPS”HTTP Basic 認証は、ユーザー名とパスワードをリクエストに載せる。TLS なしの HTTP で使うと認証情報が保護されない。
そのため、PAM 経由の LDAP 認証を nginx で使う場合も、外部からの入口は HTTPS にする。
client -> HTTPS -> nginx -> auth_pam -> PAM -> LDAP