Nginx对同一IP的“重用端口”:不同虚拟主机上的PORT对

时间:2015-05-31 15:29:29

标签: nginx

我理解在同一IP上使用“reuseport”是错误的:不同虚拟主机上的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对吗?

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

2 个答案:

答案 0 :(得分:4)

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

根据manual

  

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

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

SIDE注意: reuseport 指令的确如此:

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

没有它,当新连接到来时,内核会通知所有nginx工作者,并且所有人都尝试accept

启用此选项后,每个工作人员都有自己的侦听套接字,并且在每个新连接上,内核会选择其中一个接收它 - 因此不存在争用。

有关reuseport选项的优惠,缺点和基准的更多信息,请参阅此Nginx blog post

答案 1 :(得分:2)

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

所以只需从reuseport vhost中删除server2