listen [::]:80;で躓いた話

戒めとして書きます。
/etc/nginx/sites-available/example

server {
        listen 80;
        server_name example.com;

        location / {
                root /var/www/exmample.com;
                index index.html;
        }
} 

ととてもシンプルに記述していたのですが、
http://example.comにブラウザからアクセスしてもnginxのあの初期ページが出てきて話になりません。

$ls -l /var/www/example.com
-rw-r--r-- 1 www-data www-data 25 Apr  5 12:30 index.html

で権限など見ても別に問題はないように見えますし。。。

access_logを見てみる

最初はsites-available/exampleの中にaccess_log /var/log/nginx/access.log;を記述してましたが、/etc/nginx/nginx.confの中のhttpブロックの中に記述してありましたね。早速見てみましょう。

2001:xxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx - - [06/Apr/2025:08:56:02 +0000] "GET / HTTP/1.1" 200 56 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:137.0) Gecko/20100101 Firefox/137.0"

ん~特に404とエラーが出るわけじゃないのになぁ。。。。

答え

はい、そうですよく見てください、 2001:xxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx からアクセスされています。要はIPv6アドレスからアクセスしてることになってますね。

で最初の/etc/nginx/sites-available/exampleを見返してみるとlisten 80;しかありませんね。
サーバーがIPv4しかアドレスを提供していない、
ドメインのDNSレコードでAAAAを設定していない
なら話は別ですが、世はまさにIPv6時代ですからこれを記述しないと標準で初期ホームページにアクセスされるようですね。

/etc/nginx/sites-available/example

server {
        listen 80;
        listen [::]:80;

        server_name example.com;

        location / {
                root /var/www/exmample.com;
                index index.html;
        }
} 

と書いてブラウザのプライベートモードでアクセスしたらちゃんと動きました。これでcertbotがちゃんと動くね。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です