Nginx "reuseport" для той же пары IP: PORT на разных виртуальных хостах

Я правильно понимаю, что неправильно использовать "reuseport" для той же пары IP: PORT на разных виртуальных хостах:

http {
     server {
          listen       192.168.0.1:80 reuseport;
          server_name  server1;
          …
     }
     server {
          listen       192.168.0.1:80 reuseport;
          server_name  server2;
          …
     }
}

Эта конфигурация дает мне:

nginx: [emerg] duplicate listen options for 192.168.0.1:80 in /etc/nginx/vhosts/server1.local.conf:66

или

nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)

Итак, я должен использовать уникальные пары IP: PORT для каждого виртуального хоста?

В то же время серверный "прослушать 80 reuseport"; работает отлично, но делает ли он то же, что и для уникального IP: PORT?

Ответ 1

Ответ на ваш последний вопрос - в nginx директива listen разрешена только в контексте server (что означает для виртуального хоста).

В соответствии с руководство:

Директива listen может иметь несколько дополнительных параметров к системным вызовам сокета. Эти параметры могут быть указаны в любая директива listen, но только один раз для данного адреса: пара портов.

Итак, если у вас более 1 виртуального хоста (определение server в конфигурации nginx), вы можете использовать опцию reuseport в любом из 1 из них. Параметры, не связанные с сокетом (например, ssl или spdy), могут быть установлены для более чем 1 директивы listen.


ПРИМЕЧАНИЕ SIDE: Что действительно делает директива reuseport:

Nginx версии 1.9.1 поддерживает установку параметра SO_REUSEPORT TCP socket. В современной ОС (ядро Linux с 3.9) это позволяет ядру иметь больше сокетов для каждого сокета (ip: порт).

Без него при поступлении нового соединения ядро ​​уведомляет об этом всех работников nginx, и все они пытаются accept его.

Если этот параметр включен, у каждого рабочего есть свой собственный слуховой сокет, и в каждом новом соединении ядро ​​выбирает один из них, который получит его - поэтому нет никаких утверждений.

Подробнее о преимуществах, недостатках и тестах reuseport можно прочитать на этом сообщении в блоге Nginx

Ответ 2

Только одна директива listen для пары port/ip должна иметь параметр reuseport.

Поэтому просто удалите reuseport из server2 vhost.