nginx не прослушивает порт 80 дважды? - PullRequest
2 голосов
/ 23 февраля 2020

Редактировать: Сначала прочтите это:

Помимо принятого ответа, эти ошибки возникают при запуске nginx без systemd. Убить nginx: ps -ax | grep nginx → найти главный пид nginx kill ###; запустите nginx с systemd: systemctl start nginx.

Если systemctl не используется для запуска nginx, остановка systemctl nginx не работает (по крайней мере, на моем сервер); Итак, перезапуск systemctl nginx выдает эту ошибку при попытке запуска nginx во второй раз.

О моей настройке:

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

Что я пытаюсь сделать sh:

Как настроить два веб-сайта на один IP-адрес, используя nginx?

Сообщения об ошибках:

nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/example.com:22 строка 2.

nginx: [emerg] a duplicate default server for 0.0.0.0:443 in /etc/nginx/sites-enabled/example.com:22 строка 2. default_server используется на порту 443.

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/example.com:23 строка 3. default_server пробуется как http2 в одном файле и используется порт 443.

nginx: [emerg] duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com:23 строка 3. default_server пробуется как http2 в одном файле.

nginx: [emerg] invalid parameter "example.com" in /etc/nginx/sites-enabled/example.com:23 строка 3: default_server пробуется как example.com

Файлы конфигурации (комментарии удалены):

Существует два таких файла (код показан ниже) . Мои конфигурационные файлы точно такие же, как в приведенном ниже блоке кода, с одним отличием: в обоих файлах example.com - это настоящее уникальное доменное имя, которым я владею.

Мои конфигурационные файлы живут в /etc/nginx/sites-available и они символически связаны с /etc/nginx/sites-enabled.

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/example.com; #example.com is different in both files.
    index index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com; #example.com is different in both files.

    location / {
        try_files $uri $uri/ =404;
    }
}

Первичный диссонанс:

Другой вопрос стека говорит о необходимости переписать эти строки или закомментировать одну из них. Перезаписи либо не устраняют ошибку, либо приводят к ситуации, когда файлы не предоставляются публично (example.com никуда не денется).

Резюме:

Этот вопрос, похоже, касается строки 2, строка 3 или строка 2 и 3.

По сути, все ведущие инструкции либо прямо говорят читателю использовать код выше -или- , они не упоминают эти строки .

Ответы [ 4 ]

2 голосов
/ 23 февраля 2020

Когда вы указываете флаг default_server в директиве listen, nginx будет использовать этот блок server для обслуживания любого запроса, где заголовок HTTP Host не совпадает с server_name в любых других серверных блоках ( или в запросе отсутствует заголовок Host). Вы можете использовать флаг default_server на любой конкретной комбинации IP: порт, заданной в качестве параметра директивы listen только один раз. Но вы можете использовать этот флаг несколько раз для разных комбинаций IP: портов.

Некоторые примеры, если ваш сервер имеет несколько сетевых интерфейсов:

server {
    listen 1.2.3.4:80 default_server; # this will be default server block for any request coming to 1.2.3.4 IP address on port 80
    ...
}
server {
    listen 5.6.7.8:80 default_server; # this will be default server block for any request coming to 5.6.7.8 IP address on port 80
    ...
}
server {
    listen 80 default_server; # this will be default server block for any request coming to any other IP address (except 1.2.3.4 and 5.6.7.8) on port 80
    ...
}

Рабочий пример:

Как правило, когда мне нужно сервер нескольких сайтов на одном сервере, я использую следующую конфигурацию (конечно, это упрощено, в настоящее время мы обычно используем HTTPS с перенаправлением от http://example.com до https://example.com):

Файл конфигурации сайта 1

server {
    listen 80;
    server_name example1.com www.example1.com;
    ...
}

Файл конфигурации сайта 2

server {
    listen 80;
    server_name example2.com www.example2.com;
    ...
}

Файл конфигурации сервера по умолчанию

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

Из-за флага default_server в директиве listen третий блок сервера используется, когда в заголовке Host запроса нет ни одного из имен моих сайтов (или в запросе вообще нет заголовка Host). ). Я не ожидаю, что посетители, которые не знают, какой сайт они посещают (обычно это сканеры портов, поисковики уязвимостей и т. Д. c.), Поэтому я использую специальный код nginx 444 (закрытое соединение без какого-либо ответа) для них .

1 голос
/ 23 февраля 2020

Вы не можете запускать два приложения по одному и тому же адресу с одним и тем же портом.

Все, что вам нужно сделать, - это просто изменить порт вашего приложения: один на 80, а другой - на другой порт, скажем, 3000.

Если вы хотите, чтобы ваше приложение работало только с портом 80, просто удалите файл по умолчанию из

/etc/nginx/sites-available/default

и , опционально также из

/etc/nginx/sites-enabled/default

Вы можете запустить

sudo rm -rf /etc/nginx/sites-available/default

sudo rm -rf /etc/nginx/sites-enabled/default

Теперь вы сможете запустить один из ваше приложение на порту 80

1 голос
/ 23 февраля 2020

Как следует из сообщения об ошибке, у вас не может быть двух прослушивателей по умолчанию на одном IP-адресе и порте. Удалите default_server из объявлений listen в одном или обоих ваших серверных блоках.

    listen 80;
    listen [::]:80 ipv6only=on;
0 голосов
/ 22 апреля 2020

Я пришел к этой проблеме, когда настраивал три имени хоста на одном IP.

Я использую бесплатный сертификат SSL, который может подписывать только одно имя хоста. Поэтому я применяю три сертификата ssl.

server {
    listen      443 backlog=50000;
    server_name example1.com;
server {
    listen       443;
    server_name  example2.com;
server {
    listen       443  backlog=50000;
    server_name  example3.com;

Когда я использую nginx -t для тестирования файла конфигурации, он показывает

nginx: [ emerg] дублированные параметры прослушивания для 0.0.0.0:443 в /etc/nginx/conf.d/example1_https.conf:2

nginx: файл конфигурации /etc/nginx/nginx.conf не пройден

Я исправил это, удалив backlog=50000 из example3.com

...