Welcome! Log In Create A New Profile

Advanced

Re: Два IP адреса и неожиданное поведение Nginx

Maxim Dounin
April 25, 2020 07:04PM
Hello!

On Sun, Apr 26, 2020 at 12:26:14AM +0300, Александр Карабанов wrote:

> Здравствуйте.
> У сервера стало два IP.
> Казалось бы достаточно в конфигах заменить listen x.x.x.x:80 на listen *:80
> и выполнить systemctl reload nginx.service но нет, во-первых после
> перечитывания конфига ничего не происходит, то есть он просто не
> перечитывается, всё продолжает работать, как и работало.

В логе при этом будет явно означена возникшая при попытке
переконфигурации ошибка. Вы, судя по всему, используете Linux, а
на линуксе "из соображений безопасности" нельзя открыть сокет на
"*" (AKA 0.0.0.0, AKA INADDR_ANY) и на конкретном IP-адресе на
одном и том же порту. В результате изменить конфигурацию с
"слушали только на одном IP-адресе" и "слушаем на INADDR_ANY"
невозможно, так как при изменении конфигурации nginx попытается
открыть оба сокета (один будет открыт в "старой" конфигурации, а
другой nginx попытается открыть для "новой" - получит ошибку, и
откатится на старую конфигурацию).

> Явная остановка и запуск демона приносят плоды и Nginx начинает слушать
> 0.0.0.0:80, но после этого все сайты перестают работать (Nginx отвечает
> 404).

А тут проблема проще: если у вас в конфиге встречается и 0.0.0.0 и
конкретный IP-адрес, то nginx по умолчанию открывает один общий
listen-сокет на 0.0.0.0 (чтобы и на линуксе тоже работало;
отдельные сокеты можно явно подребовать с помощью параметра bind), и
ведёт себя так, как должны вести себя соединения для
соответствующих разных сокетов: то есть соединения к конкретному
IP-адресу обрабатываются только там, где указан listen для этого
конкретного IP-адреса, а остальные соединения - там, где указан
listen на 0.0.0.0.

> Только явное указание двух директив listen с двумя IP и явная
> остановка/запуск демона решают проблему, после чего всё начинает работать,
> как ожидается.
>
> Что не так с listen *:80, почему так не работает?

С "listen *:80" всё так, однако:

а) Надо понимать, как работают listen-сокеты. Использование
"listen *:80" совместно с "listen <ip>:80" подразумевает вполне
конкретную логику обработки соединений, приходящих на заданный
ip-адрес (они будут обрабатываться в тех блоках server, где
используется "listen <ip>:80") и все другие адреса (они будут
использоваться там, где используется "listen *:80").

б) На Линуксе при переключениями между конфигурациями, где
используется "listen *:80" и где он не используется вообще - могут
возникать сложности, налагаемые особенностями реализации TCP-стека
конкретной операционной системы (на других операционных системах
таких проблем нет). Соответствующие ошибки явно отражаются в логе
ошибок (как и любые другие ошибки, возникающие при
переконфигурации, кстати; вообще в лог ошибок полезно заглядывать,
он не просто так существует).

--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Два IP адреса и неожиданное поведение Nginx

Александр Карабанов April 25, 2020 05:28PM

Re: Два IP адреса и неожиданное поведение Nginx

Александр Карабанов April 25, 2020 05:58PM

Re: Два IP адреса и неожиданное поведение Nginx

Maxim Dounin April 25, 2020 07:04PM

Re: Два IP адреса и неожиданное поведение Nginx

Александр Карабанов April 25, 2020 08:22PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 305
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready