Nginx: listen socket

Ниже будут выдержки цитат из рассылки nginx, которые объясняют простые вещи при открытии/переоткрытии сокета не только в случае nginx’a, а и некоторых общих случаях.

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *