nginx 不会两次监听 80 端口?

Posted

技术标签:

【中文标题】nginx 不会两次监听 80 端口?【英文标题】:nginx doesn't listen on port 80 twice? 【发布时间】:2020-06-07 07:11:22 【问题描述】:

编辑:首先阅读:

除了接受的答案之外,这些错误是在 没有 systemd 的情况下启动 nginx 时发生的。杀死nginx:ps -ax | grep nginx→找到nginx master pidkill ###;运行 nginx with systemd: systemctl start nginx.

如果不使用 systemctl 启动 nginx,systemctl stop nginx 似乎不起作用(至少在我的服务器上);因此,systemctl restart nginx 在第二次尝试启动 nginx 时会出现此错误。

关于我的设置:

我使用的是 Debian 10,Buster,有一个实时服务器。两个域名我都测试过了,都是用这些配置文件自己广播的,但是两个配置文件都激活的时候就不会广播了。

我要完成的工作:

如何使用 nginx 在一个 ip 地址上设置两个网站?

错误信息:

nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-enabled/example.com:22 第 2 行。

nginx: [emerg] a duplicate default server for 0.0.0.0:443 in /etc/nginx/sites-enabled/example.com:22 第 2 行。default_server 用于端口 443。

nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/example.com:23 第 3 行。default_server 在一个文件中尝试为 http2,并使用端口 443。

nginx: [emerg] duplicate listen options for [::]:80 in /etc/nginx/sites-enabled/example.com:23 第 3 行。default_server 在一个文件中尝试为 http2

nginx: [emerg] invalid parameter "example.com" in /etc/nginx/sites-enabled/example.com:23 第 3 行:default_server 尝试为 example.com

配置文件(cmets 剥离):

其中有两个文件(代码如下所示)。我的配置文件与下面的代码块完全相同,只有一个区别:在两个文件中,example.com 是我拥有的真实、唯一的域名。

我的配置文件位于/etc/nginx/sites-available,它们被符号链接到/etc/nginx/sites-enabled

server 
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /var/www/example.com; #example.com is different in both files.
    index index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com; #example.com is different in both files.

    location / 
        try_files $uri $uri/ =404;
    

主要失调:

Another stack question 表示要重写这些行或将其中的一行注释掉。重写要么无法解决错误,要么导致文件未公开提供的情况(example.com 无处可去)。

总结:

这个问题似乎是关于第 2 行、第 3 行或第 2 行和第 3 行的。

基本上,所有主要的操作指南要么明确告诉读者使用上面的代码-要么-他们没有提及这些行。

【问题讨论】:

您想在同一个端口 80 上运行您的两个应用程序吗? 【参考方案1】:

正如错误消息所示,您不能在同一 IP 地址和端口上拥有两个默认侦听器。从您的一个或两个服务器块中的 listen 声明中删除 default_server

    listen 80;
    listen [::]:80 ipv6only=on;

【讨论】:

Calum,您愿意添加有关 default_server 可以接受哪些替换的信息吗?我还收到错误消息,指出 example.com 不是可接受的替代品(请参阅编辑)。 你不需要用任何东西替换它。 default_server 选项意味着对该 ip:port 对的任何与您的server_names 之一不匹配的请求都应由该侦听器提供服务。你不能用两个监听器来做这件事,因为 nginx 不知道使用哪个。 Calum,但事情是这样的:example.com 是server_name 之一。那么,使用example.com 时出现错误不是很奇怪吗? 不,您没有将您的服务器名称放入 listen 指令中。这就是为什么您在 /etc/nginx/sites-enabled/example.com:23 中得到“nginx:[emerg] 无效参数“example.com”的原因。见nginx.org/en/docs/http/ngx_http_core_module.html#listen。 您可以使用 server_name 指令指定服务器块应该用于的服务器名称,就像您已经拥有的那样。【参考方案2】:

当您在 listen 指令上指定 default_server 标志时,nginx 将使用该 server 块来处理 HTTP Host 标头与任何其他服务器块中的 server_name 不匹配的任何请求(或请求完全缺少 Host 标头)。您可以在任何特定的 IP:port 组合上使用 default_server 标志作为 listen 指令的参数仅给出一次。但是你可以在不同的 IP:port 组合上多次使用这个标志。

一些示例,假设您的服务器有多个网络接口:

server 
    listen 1.2.3.4:80 default_server; # this will be default server block for any request coming to 1.2.3.4 IP address on port 80
    ...

server 
    listen 5.6.7.8:80 default_server; # this will be default server block for any request coming to 5.6.7.8 IP address on port 80
    ...

server 
    listen 80 default_server; # this will be default server block for any request coming to any other IP address (except 1.2.3.4 and 5.6.7.8) on port 80
    ...

工作示例:

通常,当我需要在同一台服务器上为多个站点提供服务时,我使用以下配置(当然这是简化的,现在我们通常使用带有http://example.comhttps://example.com 重定向的HTTPS):

站点 1 配置文件

server 
    listen 80;
    server_name example1.com www.example1.com;
    ...

站点 2 配置文件

server 
    listen 80;
    server_name example2.com www.example2.com;
    ...

默认服务器配置文件

server 
    listen 80 default_server;
    server_name _;
    return 444;

由于listen 指令上的default_server 标志,当请求的Host 标头不包含我的站点名称之一(或请求根本没有Host 标头)时,使用第三个服务器块。我不希望访问者不知道他们正在访问哪个站点(这些通常是端口扫描器、漏洞搜索器等),因此我为他们使用了特殊的 nginx 444 代码(关闭连接而没有任何响应)。

【讨论】:

Ivan,您愿意发布步骤来验证我的服务器是否能够支持多个网络接口以及如何启用它们(如果有能力)? 您可以使用ifconfig 命令(或现代Linux 发行版中的ip addr)查看所有已配置的网络接口。但事实上,您只需要在 DNS 配置中为您的域指定的 IP 地址提供请求。我只是尝试更详细地解释 devault_server 标志的行为,而不是其他答案。 是的,我用ip link show,发现2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 @Wolfpack'08 添加了另一个default_server标志用法示例,看看吧。 我可以在您的答案中添加一个补充,因为您的答案被接受并且会引起最多的关注吗?我意识到这个问题与我们在这里讨论的内容并不完全相关。【参考方案3】:

你不能在同一个地址和同一个端口上运行两个应用程序。

您需要做的只是将应用程序的端口更改为 80,将其他应用程序的端口更改为 3000。

如果您希望您的应用程序仅使用 80 端口运行,而不仅仅是从

中删除默认文件

/etc/nginx/sites-available/default

可选也来自

/etc/nginx/sites-enabled/default

你可以运行

sudo rm -rf /etc/nginx/sites-available/default

sudo rm -rf /etc/nginx/sites-enabled/default

现在您将能够在端口 80 上运行您的应用程序之一

【讨论】:

我想保留启用站点的默认文件的备份....但是它已从可用站点中删除(我认为如果从已启用站点中删除它没有效果)。实际上,在这种情况下,我可以在 80 端口上运行其中一个。 明确一点,nginx 是端口 80/443 上唯一的东西(尽管它不应该出现两次)。除非有人在地址栏中键入 example.com:3000(例如),否则端口 80 和端口 443 不是我可以用来广播网站的唯一端口吗? Wolfpack,我想你混淆了sites-availablesites-enabledsites-enabled 通常用于正在服务的网站。 @Wolfpack'08 80 端口用于 HTTP,443 用于 https(带有 SSL 证书) 那么您目前面临的问题是什么?【参考方案4】:

我在一个 IP 上配置三个主机名时遇到了这个问题。

我使用只能在一个主机名上签名的免费 ssl 证书。所以我申请了三个 ssl 证书。

server 
    listen      443 backlog=50000;
    server_name example1.com;
server 
    listen       443;
    server_name  example2.com;
server 
    listen       443  backlog=50000;
    server_name  example3.com;

当我使用nginx -t 测试配置文件时,它显示

nginx:[emerg] 中 0.0.0.0:443 的重复侦听选项 /etc/nginx/conf.d/example1_https.conf:2

nginx:配置文件/etc/nginx/nginx.conf测试失败

我通过从 example3.com 中删除 backlog=50000 来修复它

【讨论】:

以上是关于nginx 不会两次监听 80 端口?的主要内容,如果未能解决你的问题,请参考以下文章

nginx 监听非标准端口80,重定向端口丢失问题解决

关于Nginx默认监听端口不是80而造成程序出错的简单问题

配置tomcat监听80端口,配置tomcat的虚拟主机

Nginx如何配置多个服务域名解析共用80端口详解

58.配置Tomcat监听80端口 配置Tomcat虚拟主机Tomcat日志

Nginx拒绝监听端口443