カテゴリー: server

  • 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がちゃんと動くね。