Как в Nginx запретить отвечать на любой домен

У веб-сервера Nginx есть один фатальный недостаток — он пытается ответить на любой входящий запрос. Причём он отвечает даже на те запросы, в host-заголовке которых указан домен, который не был сконфигурирован! В этом случае Nginx выбирает первую попавшуюся секцию server и отдаёт ей запрос, даже если внутри этой секции значения директив server_name не соответствуют значению host-заголовка запроса.

Такое поведение может приводить к путанице и неразберихе. Поэтому достаточно часто возникает задача — разрешить nginx отвечать только на те запросы, для которых был сконфигурирован server_name.

Делается это достаточно просто, нужно в файле nginx.conf сконфигурировать сервер-заглушку без указания server_name и указать в качестве первого по списку сервера в секции http:

server {
 listen 80;
 return 444;
}
http {
    ....
    server {
        another;
    }
    include /etc/nginx/conf.d/*.conf;
}

Такая конфигурация создаст дефолтный сервер, который будет отвечать на запросы для всех доменов, которые небыли явно сконфигурированы. А в ответ будет отдавать просто статус 444 Connection Closed Without Response. В качестве дополнения можно добавить логгирование всех запросов попадающих на дефолтный пустой сервер:

access_log /var/log/nginx/empty-access.log main;