<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Спасибо за подробный ответ.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Проблема была в том, что был server {...} в котором был явно указан IP, когда я для него тоже указал listen *:80 всё заработало, как и ожидается, собственно так, как вы и описали.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">вс, 26 апр. 2020 г. в 02:02, Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello!<br>
<br>
On Sun, Apr 26, 2020 at 12:26:14AM +0300, Александр Карабанов wrote:<br>
<br>
> Здравствуйте.<br>
> У сервера стало два IP.<br>
> Казалось бы достаточно в конфигах заменить listen x.x.x.x:80 на listen *:80<br>
> и выполнить systemctl reload nginx.service но нет, во-первых после<br>
> перечитывания конфига ничего не происходит, то есть он просто не<br>
> перечитывается, всё продолжает работать, как и работало.<br>
<br>
В логе при этом будет явно означена возникшая при попытке <br>
переконфигурации ошибка.  Вы, судя по всему, используете Linux, а <br>
на линуксе "из соображений безопасности" нельзя открыть сокет на <br>
"*" (AKA 0.0.0.0, AKA INADDR_ANY) и на конкретном IP-адресе на <br>
одном и том же порту.  В результате изменить конфигурацию с <br>
"слушали только на одном IP-адресе" и "слушаем на INADDR_ANY" <br>
невозможно, так как при изменении конфигурации nginx попытается <br>
открыть оба сокета (один будет открыт в "старой" конфигурации, а <br>
другой nginx попытается открыть для "новой" - получит ошибку, и <br>
откатится на старую конфигурацию).<br>
<br>
> Явная остановка и запуск демона приносят плоды и Nginx начинает слушать<br>
> <a href="http://0.0.0.0:80" rel="noreferrer" target="_blank">0.0.0.0:80</a>, но после этого все сайты перестают работать (Nginx отвечает<br>
> 404).<br>
<br>
А тут проблема проще: если у вас в конфиге встречается и 0.0.0.0 и <br>
конкретный IP-адрес, то nginx по умолчанию открывает один общий <br>
listen-сокет на 0.0.0.0 (чтобы и на линуксе тоже работало; <br>
отдельные сокеты можно явно подребовать с помощью параметра bind), и <br>
ведёт себя так, как должны вести себя соединения для <br>
соответствующих разных сокетов: то есть соединения к конкретному <br>
IP-адресу обрабатываются только там, где указан listen для этого <br>
конкретного IP-адреса, а остальные соединения - там, где указан <br>
listen на 0.0.0.0.<br>
<br>
> Только явное указание двух директив listen с двумя IP и явная<br>
> остановка/запуск демона решают проблему, после чего всё начинает работать,<br>
> как ожидается.<br>
> <br>
> Что не так с listen *:80, почему так не работает?<br>
<br>
С "listen *:80" всё так, однако:<br>
<br>
а) Надо понимать, как работают listen-сокеты.  Использование <br>
"listen *:80" совместно с "listen <ip>:80" подразумевает вполне <br>
конкретную логику обработки соединений, приходящих на заданный <br>
ip-адрес (они будут обрабатываться в тех блоках server, где <br>
используется "listen <ip>:80") и все другие адреса (они будут <br>
использоваться там, где используется "listen *:80").<br>
<br>
б) На Линуксе при переключениями между конфигурациями, где <br>
используется "listen *:80" и где он не используется вообще - могут <br>
возникать сложности, налагаемые особенностями реализации TCP-стека <br>
конкретной операционной системы (на других операционных системах <br>
таких проблем нет).  Соответствующие ошибки явно отражаются в логе <br>
ошибок (как и любые другие ошибки, возникающие при <br>
переконфигурации, кстати; вообще в лог ошибок полезно заглядывать, <br>
он не просто так существует).<br>
<br>
-- <br>
Maxim Dounin<br>
<a href="http://mdounin.ru/" rel="noreferrer" target="_blank">http://mdounin.ru/</a><br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div><span style="color:rgb(102,102,102)">С уважением,</span><br></div><div><font color="#666666">Александр Карабанов<br></font></div></div></div></div></div></div>