我使用 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
在上述两个块中使用它,或者我应该在哪一个块中使用它(因为我只能在一个块中使用它)。
答案1
在 NGINX 中,您只需在配置中指定一次网络套接字的侦听选项,它们就会“应用”到server
侦听同一套接字(端口)的所有其他配置。引用文档:
listen 指令可以包含多个特定于套接字相关系统调用的附加参数。这些参数可以在任何 listen 指令中指定,但对于给定的地址:端口对只能指定一次。
因此,您必须从错误消息中解读出,您应该reuseport
为每个唯一的listen
地址+端口只指定一次。
执行此操作的方式server
取决于您的偏好。但作为一项规则,为了清晰起见,我建议指定其中一个server
withdefault_server
指令,它:
如果存在,将导致服务器成为指定地址:端口对的默认服务器。如果所有指令均不包含 default_server 参数,则具有地址:端口对的第一个服务器将成为该对的默认服务器。
然后将您的监听选项放在该服务器块中(您已在其中指定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
}