Назад | Перейти на главную страницу

Сервер Nginx «по умолчанию»?

У меня есть Nginx с несколькими включенными серверными блоками. Каждый сервер отвечает на 1 канонический домен и может пересылать 1 или более на этот канонический URL. У меня есть по крайней мере один сервер (еще не проверил их все), где, если я введу несуществующий домен, указывающий на это поле, Nginx отобразит сайт по своему выбору (всегда тот же сайт, но не тот, который Я после).

Я покопался в конфигурационном файле сайта, на который всегда заходил, но ничего не вижу очевидный который идентифицировал бы его как любой тип сайта по умолчанию, и тем не менее, он всегда появляется, когда я толстым пальцем нажимаю на URL.

Есть мысли о том, что я должен искать, чтобы отследить это?

Почему nginx это делает?

Причина этого проста. Очень старые или сломанные клиенты не отправляют Host Поле заголовка HTTP в своих запросах, и если вы используете серверные блоки на основе имени (виртуальные хосты на основе имени в терминах Apache), nginx не может определить, какой из настроенных вами серверов подразумевается клиентом. Та же проблема актуальна для любого другого веб-сервера, который поддерживает эту систему на основе имен. Эта проблема не возникнет, если вы будете использовать систему на основе IP для каждого домена (что также означает, что у вас есть несколько сетевых интерфейсов).

Еще по этой теме? Как nginx обрабатывает запрос


Какая первая?

nginx выберет сервер, который будет первым, если нет default флаг был установлен на любой listen директива:

server {
  server_name server1.com;
}

server {
  server_name server2.com;
}

server1.com будет по умолчанию.

Если вы автоматически включаете символические ссылки из sites-enabled (конфигурация по умолчанию) файл, который идет первым в каталоге, будет вашим первым сервером.


Что я могу сделать, чтобы предотвратить это?

Хороший вопрос, и вы должны его предотвратить. Нет причин поддерживать этих старых клиентов и абсолютно нет причин поддерживать сломанных клиентов. Проблема легко решается созданием конфигурации сервера по умолчанию для всех серверов. Следующий пример взят из одного из моих проектов и нацелен на текущую версию nginx для разработчиков (1.5.2, но должен работать и со старыми версиями):

# /etc/nginx/sites-enabled/_.conf

# Default server for clients who do not send correct Host header.
# The underline in the file name makes sure that this file comes first in the dir.
server {
  server_name _;
  listen *:80 default_server deferred;
  return 444;
}

Конфигурация обрезана, больше настроек nginx.

Добавить default_server на ваш listen директива в server что вы хотите использовать по умолчанию.