我使用nginx作为一个反向代理,并使用gunicorn应用服务器(Django应用程序)。
在我的nginx虚拟主机文件中,有两个server块。前者将www流量重定向到后者(后者处理non-www、https流量)。
具体而言,前一个位置块是:
server {
server_name www.example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
return 301 https://example.com$request_uri;
}后一个位置块是:
server {
server_name example.com;
listen 443 ssl http2 reuseport;
listen [::]:443 ssl http2 reuseport;
# other directives here
}注意,在后一个块中使用了reuseport。
如果我将reuseport放在两个块中,就会得到一个错误:nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/vhost:62。
如果我只将它插入前一个块中,它就能工作。我不知道该把它放在哪里,前一块还是后一块。有人能澄清吗?
我了解到,reuseport参数指示nginx为每个辅助进程创建一个单独的侦听套接字,允许内核在工作进程之间分发传入连接(处理在客户端和服务器之间发送的多个数据包)。
但是,这并不能帮助我理解为什么我不能在前面提到的两个块中使用reuseport,或者我应该在哪个块中使用它(考虑到我只能在一个块中使用它)。
发布于 2020-01-26 09:15:14
在NGINX中,您只在配置中指定一次网络套接字的侦听选项,它们“应用”于在同一套接字(端口)上侦听的所有其他配置的servers。引用文档:
have指令可以有几个特定于套接字相关系统调用的附加参数。这些参数可以在任何侦听指令中指定,但对于给定的地址,只能指定一次:端口对。
因此,您必须从错误消息中解密,您应该只为每个唯一的reuseport address+port指定一次。
在哪个server中这样做取决于您的偏好。但作为一项规则,为了清晰起见,我建议用servers的default_server指令指定其中一人:
如果存在,将导致服务器成为指定地址的默认服务器:端口对。如果没有一个指令具有default_server参数,那么第一个具有address:Port结对的服务器将是此对的默认服务器。
然后将侦听选项放在服务器块中(在其中指定了default_server)。
例如。
server {
server_name www.example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
return 301 https://example.com$request_uri;
}
server {
server_name example.com;
listen 443 ssl http2 default_server reuseport;
listen [::]:443 ssl http2 default_server reuseport;
# other directives here
}https://serverfault.com/questions/1000365
复制相似问题