Nginx 的 "reuseport" 用于不同虚拟主机上的相同 IP:PORT 对
Nginx's "reuseport" for same IP:PORT pair on different virtual hosts
我明白在不同的虚拟主机上对相同的 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 一样?
每 port/ip
对只有一个监听指令应该有 reuseport
选项。
所以只需从 server2
虚拟主机中删除 reuseport
。
你最后一个问题的答案 - 在 nginx 中,listen
指令只允许在 server
上下文中使用(这意味着每个虚拟主机)。
根据manual:
The listen
directive can have several additional parameters specific
to socket-related system calls. These parameters can be specified in
any listen
directive, but only once for a given address:port pair.
所以如果你有超过 1 个虚拟主机(nginx 配置中的 server
定义),那么你可以在其中任何一个中使用 reuseport
选项。非套接字相关选项(如 ssl
或 spdy
)仍然可以设置为超过 1 个 listen
指令。
旁注: reuseport
指令的真正作用:
Nginx 从 1.9.1 版本开始支持设置 SO_REUSEPORT
TCP socket 参数。在现代 OS(Linux 内核自 3.9 起),这使内核能够为每个套接字 (ip:port) 提供更多套接字侦听器。
没有它,当新连接到达时,内核会通知所有 nginx worker,并且所有 nginx worker 都会尝试 accept
它。
启用此选项后,每个工作人员都有自己的侦听套接字,并且在每个新连接上,内核都会选择其中一个来接收它 - 因此没有争用。
可以在此 Nginx blog post
上阅读有关 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 一样?
每 port/ip
对只有一个监听指令应该有 reuseport
选项。
所以只需从 server2
虚拟主机中删除 reuseport
。
你最后一个问题的答案 - 在 nginx 中,listen
指令只允许在 server
上下文中使用(这意味着每个虚拟主机)。
根据manual:
The
listen
directive can have several additional parameters specific to socket-related system calls. These parameters can be specified in anylisten
directive, but only once for a given address:port pair.
所以如果你有超过 1 个虚拟主机(nginx 配置中的 server
定义),那么你可以在其中任何一个中使用 reuseport
选项。非套接字相关选项(如 ssl
或 spdy
)仍然可以设置为超过 1 个 listen
指令。
旁注: reuseport
指令的真正作用:
Nginx 从 1.9.1 版本开始支持设置 SO_REUSEPORT
TCP socket 参数。在现代 OS(Linux 内核自 3.9 起),这使内核能够为每个套接字 (ip:port) 提供更多套接字侦听器。
没有它,当新连接到达时,内核会通知所有 nginx worker,并且所有 nginx worker 都会尝试 accept
它。
启用此选项后,每个工作人员都有自己的侦听套接字,并且在每个新连接上,内核都会选择其中一个来接收它 - 因此没有争用。
可以在此 Nginx blog post
上阅读有关reuseport
选项的优点、缺点和基准的更多信息