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

Ole*_*kin 11 nginx

我理解在不同的虚拟主机上使用"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;
          …
     }
}
Run Code Online (Sandbox Code Playgroud)

这个配置给了我:

nginx: [emerg] duplicate listen options for 192.168.0.1:80 in /etc/nginx/vhosts/server1.local.conf:66
Run Code Online (Sandbox Code Playgroud)

要么

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

所以我要为每个虚拟主机使用唯一的IP:PORT对?

同时在服务器范围内"监听80重启端口"; 工作得很好,但它是否与每个独特的IP一样:PORT?

Mar*_*555 5

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

根据手册

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

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


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

Nginx 从 1.9.1 版本开始支持设置SO_REUSEPORTTCP 套接字参数。在现代操作系统(从 3.9 开始的 Linux 内核)中,这使内核能够为每个套接字(ip:port)拥有更多的套接字侦听器。

如果没有它,当新连接到达时,内核会通知所有 nginx 工作人员,并且所有工作人员都尝试使用accept它。

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

reuseport可以在此Nginx 博客文章中阅读有关选项的优点、缺点和基准的更多信息