nginxを使用すると、同一IPや同一ドメインであっても、要求されたドメイン名やパスなどの条件に応じてアクセスするサーバーを切り替えることができるので非常に便利です。
ところが、スマートフォンからモバイル回線経由で自宅のサーバーにアクセスした際、なぜか設定でドメインと紐づけてあるサイトとは別のサイト(mastodon)が表示されてしまう現象が度々発生していました。
色々調べたところ、どうやらIPv6アドレス経由でサーバーにアクセスした際に意図しないサイトが表示されていることに気づきました。
そこで、nginxの設定ファイルを見直したところ、表示されてほしいサイトに対して設定されていた記述が、下記のようになっていました。
server{
server_name example.com;
listen 80 default_server;
...省略...
}
server{
server_name example.com;
listen 443 default_server;
...省略...
}
一方、mastodonに対して設定していた内容は下記の通りでした。
server {
listen 80;
listen [::]:80;
server_name mastodon.example.com;
...省略...
}
server {
listen 443;
listen [::]:443;
server_name mastodon.example.com;
ssl on;
...省略...
}
nginxのリバースプロキシでは、実はどのNICのどのポートへアクセスされたか、という区切りでも細かく設定を分けることが可能となっています。
自分のサイトの場合、とりあえずどのポートやIPからであっても同じ結果となってほしかったため、すべてのserverディレクティブに
listen 80;
や
listen 443 ssl;
のように指定を行っていました。こうすることで、どのNIC経由でアクセスされても設定が呼び出されるようになります。
ところが、この書き方はあくまでIPv4経由でのアクセスに対してのみ有効となり、IPv6経由でも設定を適用させたい場合は上記に合わせて
listen [::]:80;
や
listen [::]:443;
という指定も入れておかなければいけなかったようです。
今回の場合、自分で設定したサイトに関してはすべてこのIPv6の記述が抜けており、mastodonの公式サイトから引っ張ってきたmastodon用のサイト設定の中にIPv6の記述があったため、IPv6経由ではmastodonがデフォルトのサイトとして判定されて、すべてこちらへ流れてきてしまっていたようでした。
ということで、サーバーに対してIPv4とIPv6両方から接続できる場合は、必ず
listen ポート番号;
と
listen [::]:ポート番号;
の両方の記述を入れましょう、というお話でした。