首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在nginx虚拟主机中使用重用端口的正确方法

在nginx虚拟主机中使用重用端口的正确方法
EN

Server Fault用户
提问于 2020-01-25 16:48:04
回答 1查看 7.4K关注 0票数 5

我使用nginx作为一个反向代理,并使用gunicorn应用服务器(Django应用程序)。

在我的nginx虚拟主机文件中,有两个server块。前者将www流量重定向到后者(后者处理non-wwwhttps流量)。

具体而言,前一个位置块是:

代码语言:javascript
复制
server {

    server_name www.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    return 301 https://example.com$request_uri;
}

后一个位置块是:

代码语言:javascript
复制
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,或者我应该在哪个块中使用它(考虑到我只能在一个块中使用它)。

EN

回答 1

Server Fault用户

回答已采纳

发布于 2020-01-26 09:15:14

在NGINX中,您只在配置中指定一次网络套接字的侦听选项,它们“应用”于在同一套接字(端口)上侦听的所有其他配置的servers。引用文档

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

因此,您必须从错误消息中解密,您应该只为每个唯一的reuseport address+port指定一次。

在哪个server中这样做取决于您的偏好。但作为一项规则,为了清晰起见,我建议用servers的default_server指令指定其中一人:

如果存在,将导致服务器成为指定地址的默认服务器:端口对。如果没有一个指令具有default_server参数,那么第一个具有address:Port结对的服务器将是此对的默认服务器。

然后将侦听选项放在服务器块中(在其中指定了default_server)。

例如。

代码语言:javascript
复制
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
}
票数 4
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1000365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档