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

Александр Карабанов zend.karabanov на gmail.com
Вс Апр 26 00:20:13 UTC 2020


Спасибо за подробный ответ.
Проблема была в том, что был server {...} в котором был явно указан IP,
когда я для него тоже указал listen *:80 всё заработало, как и ожидается,
собственно так, как вы и описали.

вс, 26 апр. 2020 г. в 02:02, Maxim Dounin <mdounin на mdounin.ru>:

> 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



-- 
С уважением,
Александр Карабанов
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20200426/bd27e476/attachment-0001.htm>


Подробная информация о списке рассылки nginx-ru