我理解在同一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?
答案 0 :(得分:4)
回答你的上一个问题 - 在nginx中,listen
指令只允许在server
上下文中(这意味着每个虚拟主机)。
根据manual:
listen
指令可以有几个额外的参数 与套接字相关的系统调用。这些参数可以在中指定 任何listen
指令,但对于给定的地址只有一次:端口对。
因此,如果您在nginx配置中有多个虚拟主机(server
定义),那么您可以在其中任何一个中使用reuseport
选项。非套接字相关选项(如ssl
或spdy
)仍可设置为超过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
。