nginx: [warn] conflicting server name "example.ru" on 0.0.0.0:80, ignored
#Что означает предупреждение
Nginx выбирает виртуальный хост по имени из заголовка Host. Если одно имя встречается в двух блоках server на одинаковой паре адрес:порт, второй блок для этого имени игнорируется, а в журнал и вывод nginx -t попадает предупреждение. Реальная проблема в том, что запросы могут обслуживаться не тем блоком, который вы ожидаете: например, старой конфигурацией, оставшейся в sites-enabled или conf.d.
#Типичные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Файл подключён дваждыСимлинк и копия. | Одинаковые блоки в -T. | Удалите лишний. |
| Резервные копии в conf.d*.conf.bak маски. | Старый блок активен. | Переименуйте за пределы маски. |
| Дублирующий defaultДва default_server. | Ошибка 'duplicate default server'. | Оставьте один. |
| Конфликт HTTP/HTTPS блоковОдинаковое имя на разных портах. | Это допустимо. | Проверьте порт в listen. |
| Шаблоны и маски*.example.ru и example.ru. | Неожиданный выбор блока. | Уточните имена. |
| Автоматические генераторыCertbot, панель. | Создали второй файл. | Объедините. |
#Порядок
- Выведите полную итоговую конфигурацию и найдите все блоки с этим именемВ терминале сервера выполните
sudo nginx -T 2>&1и сохраните вывод в защищённый файл для просмотра; предупреждениеconflicting server name ... on ... ignoredукажет имя хоста иlisten-адрес. Найдите все строкиserver_nameс этим именем, но учитывайте, что одинаковый домен в блоках для 80 и 443 — нормален. - Определите, из каких файлов они подключеныВ полном выводе
nginx -Tперед каждым подключённым конфигурационным файлом есть комментарий с его путём. Запишите именно файлы, которые содержат конфликтующие блоки на одинаковых адресе/порту и имени сервера; не удаляйте блок только потому, что домен встречается дважды. - Проверьте каталоги sites-enabled, conf.d и include в основном файлеПроверьте действующие
includeв nginx.conf, каталоги/etc/nginx/conf.d/и/etc/nginx/sites-enabled/(если они используются). Один сайт может подключаться и через символьную ссылку, и отдельным файлом; выясните, какая версия конфигурации рабочая, и сохраните её копию. - Удалите дубликаты или объедините блокиЕсли обнаружен настоящий дубликат, оставьте один нужный серверный блок на конкретной паре адрес/порт, а лишний отключите штатным способом панели или уберите соответствующий
includeпосле резервной копии. Не объединяйте бездумно HTTPS и HTTP: им нужны разные настройки сертификата и перенаправления. - Проверьте, нет ли временных файлов *.bak, *.old, *~, которыеЕсли Nginx подключает файлы через широкую маску
conf.d/*, туда могли попасть резервные.old,.bakи файлы редактора. Проверьте их содержимое и расположение; переносите устаревший файл за пределы подключаемой директории, а не выполняйтеrmпо предложенному примеру без проверки назначения. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
- Проверьте конфигурацию и перезагрузите nginxПосле изменения выполните
sudo nginx -tи прочитайте не только строкуtest is successful, но и предупреждения; затемsudo systemctl reload nginx. Проверьте каждый конфликтовавший домен с правильным SNI/Host, включая HTTPS, чтобы убедиться, что используется нужный виртуальный хост и сертификат.
#Проверка результата
Выполните curl -I -H "Host: example.ru" http://127.0.0.1/ и убедитесь, что отвечает нужный блок (по заголовкам или содержимому). После устранения дублей предупреждение при nginx -t исчезнет. Если вы используете панель управления (ISPmanager, HestiaCP), не редактируйте её файлы вручную: панель пересоздаст конфигурацию, поэтому меняйте настройки через панель.
#Как понять, какой блок реально отвечает
Добавьте в каждый подозрительный блок свой заголовок: add_header X-Block "example-main" always; и проверьте командой curl -sI -H "Host: example.ru" http://127.0.0.1/ | grep X-Block. Так вы увидите, какая конфигурация обслуживает имя. После выявления лишних блоков удалите их и уберите заголовки. Для больших конфигураций удобно сохранить вывод nginx -T в файл и искать дубли утилитой sort | uniq -d: sudo nginx -T 2>/dev/null | grep -E "^\s*server_name" | sort | uniq -d покажет повторяющиеся строки server_name.
sudo nginx -T 2>/dev/null | grep -E "^\s*server_name" | sed 's/^\s*//' | sort | uniq -d