Nginx在不同虚拟主机上对相同IP:PORT对的"reuseport"



我正确地理解,在不同的虚拟主机上对相同的IP:PORT对使用"reuseport"是错误的:

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对?

在同一时间服务器范围内"listen 80 reuseport;"工作得很好,但是它是否与每个唯一的IP:PORT相同?

回答你的最后一个问题-在nginx中,listen指令只允许在server上下文中(这意味着每个虚拟主机)。

根据手册:

listen指令可以有几个额外的参数特定到套接字相关的系统调用。这些参数可以在中指定任何listen指令,但只有一个给定的地址:端口对。

所以如果你有超过1个虚拟主机(server定义在nginx配置),那么你可以使用reuseport选项中的任何一个。非套接字相关选项(如sslspdy)仍然可以为多个listen指令设置。


旁注: reuseport 指令的真正作用:

Nginx 1.9.1版本支持设置SO_REUSEPORT TCP套接字参数。在现代操作系统(Linux内核3.9起)中,这使得内核可以为每个套接字(ip:port)拥有更多的套接字侦听器。

如果没有它,当新的连接到达时,内核通知所有的nginx工作器,所有的工作器都尝试accept它。

启用此选项后,每个worker都有自己的侦听套接字,并且在每个新连接上,内核选择其中一个来接收它-因此没有争用。

关于reuseport选项的优点,缺点和基准测试的更多信息可以阅读Nginx博客文章

每个port/ip对只有一个监听指令应该有reuseport选项。

所以只要从server2 vhost中删除reuseport

最新更新