nginx: [emerg] duplicate listen options и conflicting server name
Эти сообщения означают, что один и тот же адрес или имя сервера объявлены дважды. Чаще всего виноват включённый сайт по умолчанию, про который забыли, и ваш новый блок с теми же параметрами.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Остался включённый сайт по умолчанию
В Debian и Ubuntu при установке включается сайт
defaultс блоком на 80-м порту и параметром default_server. Новый блок с теми же параметрами приводит к конфликту. -
Параметры вроде ssl или http2 указаны в нескольких блоках
Часть параметров директивы listen задаётся один раз на адрес. Повторение в другом блоке для того же адреса даёт «duplicate listen options».
-
Одно имя сервера в двух блоках
nginx предупреждает о конфликте имён и использует первый блок. Запросы уходят не туда, куда ожидалось.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Печатает конкретное сообщение о конфликте с файлом и строкой.
sudo nginx -tЧто включено: сайт default часто оказывается лишним.
ls -l /etc/nginx/sites-enabled/Все адреса и имена в итоговой конфигурации.
sudo nginx -T 2>/dev/null | grep -n "listen\|server_name" | head -30Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- В Debian и Ubuntu при установке включается сайт
defaultс блоком на 80-м порту и параметром default_server. Новый блок с теми же параметрами приводит к конфликту.
- Как проверить
-
Посмотрите включённые сайты.
ls -l /etc/nginx/sites-enabled/ sudo nginx -T 2>/dev/null | grep -n "listen\|server_name" | head -20
- Как исправить
-
Отключите сайт по умолчанию, если он не нужен.
sudo rm /etc/nginx/sites-enabled/default && sudo nginx -t && sudo systemctl reload nginx
- Почему происходит
- Часть параметров директивы listen задаётся один раз на адрес. Повторение в другом блоке для того же адреса даёт «duplicate listen options».
- Как проверить
-
Найдите все объявления этого адреса.
sudo nginx -T 2>/dev/null | grep -n "listen" | sort -k2 | head -20
- Как исправить
-
Оставьте параметры только в одном блоке для каждого адреса. Для остальных достаточно
listen 443 ssl;без повторных параметров.
- Почему происходит
- nginx предупреждает о конфликте имён и использует первый блок. Запросы уходят не туда, куда ожидалось.
- Как проверить
-
Поищите повторяющиеся имена.
sudo nginx -T 2>/dev/null | grep server_name | sort | uniq -c | sort -rn | head
- Как исправить
- Уберите дубль или объедините блоки. Это предупреждение, но оно почти всегда означает ошибку в настройке.
Пример вывода
Параметры listen объявлены дважды для одного адреса. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
nginx[5210]: nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/site2.conf:4
nginx[5210]: nginx: configuration file /etc/nginx/nginx.conf test failed
Связанные ошибки
- nginx: [emerg] unknown directive nginx не запускается: неизвестная директива в конфигурации. Опечатка, не тот контекст или отсутствующий модуль.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- nginx: [emerg] open() failed при чтении конфигурации nginx не может открыть файл конфигурации, включённый через include, или файл сертификата. Разбор путей и прав.
- nginx reload не применяет изменения Перезагрузка nginx прошла, а изменения не действуют: правка не в том файле, файл не включён, кеш, старые рабочие процессы.
- nginx: could not build server_names_hash nginx не запускается при большом числе или длинных именах серверов: нужно увеличить server_names_hash_bucket_size.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
Где встречается чаще всего
Источники
- Документация nginx: директива listen
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено двумя блоками с listen 443 ssl на тестовой машине.