背景
ウェブサーバーを移転する場合、DNS の変更が浸透するまでは、旧サーバーから新サーバーに reverse proxy 設定をしておく必要があります。旧サーバーをそのままにしてしまうと、変更前の IP でリクエストがあった場合、旧サーバーが処理を受け付けてしまいます。データベースへの書き込みを伴うような場合に、本来反映されるべきデータが反映されないことになります。
移転するドメインが TLS SNI を使った name based virtualhost を利用している場合、reverse proxy となる旧サーバーからは正しく SNI リクエストを送信する必要があります。この記事ではその設定方法について共有します。
設定方法
旧サーバーでは以下のようにして新サーバーにリクエストを reverse proxy します。
server {
listen 443 ssl http2;
server_name www.example.com;
ssl on;
ssl_certificate example.crt;
ssl_certificate_key example.key;
location / {
proxy_pass https://new-server-ip;
proxy_ssl_name www.example.com;
proxy_ssl_server_name on;
proxy_set_header Host $http_host;
proxy_set_header X_Real_IP $remote_addr;
proxy_set_header X_Forwarded_Proto $scheme;
proxy_set_header X_Forwarded_Host $http_host;
proxy_set_header X_Forwarded_Server $host;
proxy_set_header X_Forwarded_For $proxy_add_x_forwarded_for;
}
}
ポイントは proxy_ssl_name と proxy_ssl_server_name の二つの directive です。
proxy_ssl_server_name で proxy 先のサーバーとの接続に TLS SNI を有効にし、proxy_ssl_name で SNI で利用するホスト名を指定します。