nginx の server_name

SSL対応する過程で、nginx の設定ファイルの中で server_name は何をしているのだろうと疑問に思って調べてみた。

役割

nginxはリクエストがあると、まず設定ファイルの中からアドレスと一致する部分(ポートだけならそのポート番号)を探し、server_nameが一致していたらそこで処理を続行する。

もしsever_nameの一致が取れるところがなければ、デフォルトに設定されているサーバーで処理をする。

何がうれしいかというと、server_nameに自分のページを設定しておけば、ip addressをなめながら直で鬼リクエストを飛ばしてくるようなbotを無視できる。逆に、server_nameを設定しないとこれらのリクエストにさらされ、サービスに負荷がかかったりする。

実際、以前に、サービスを公開していない(誰にも教えていない)のにリクエストがいくつか飛んできてたことがあり、インターネット怖いと思っていたところ。

実際どう書くか

具体的には以下のようになる。 該当部分だけだとわかりづらいこともあるので、関係ない記述も残している。

server {
    listen 80;
    server_name subdomain.domain.com; # here
    server_tokens off;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }

}

# if no match
server {
    listen 80 default_server; # here
    server_name _;
    return 444;
}

対象のアドレス・ポートに対して、default_serverが設定されていなければ、一番上に書かれているサーバーに処理が飛ぶ。

ここでは、仮に'default_server'を書かなければ、処理は一つ目に行ってしまい、server_nameを指定する意味はあまりなくなる。

はまったとこ

最後に注意点として、httpに接続する際にURLの末尾に/をつけていないと、最後の部分が破棄されてしまうので、なかなかうまくリダイレクトされないなと思ったらぜひ確認してみてほしい。

参考

Server names

nginx はどのようにリクエストを処理するか

nginxのserver_nameはちゃんと設定したほうがいいね。というお話 - イフブロ