nginx 不会两次监听 80 端口?

Wol*_*'08 4 nginx nginx-config

编辑:首先阅读此内容:

\n\n

除了已接受的答案之外,这些错误在没有systemd 的情况下启动 nginx 时也会发生。杀死 nginx: ps -ax | grep nginx\xe2\x86\x92 找到nginx master pid\xe2\x86\x92 kill ###使用systemd运行 nginx : systemctl start nginx

\n\n

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

\n\n

关于我的设置:

\n\n

我使用的是 Debian 10,Buster,有一个实时服务器。我已经测试了这两个域名,它们使用这些配置文件自行广播,但当两个配置文件都处于活动状态时它们不会广播。

\n\n

我正在努力实现的目标:

\n\n

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

\n\n

错误消息:

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

配置文件(注释已删除):

\n\n

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

\n\n

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

\n\n
server {\n    listen 80 default_server;\n    listen [::]:80 default_server ipv6only=on;\n\n    root /var/www/example.com; #example.com is different in both files.\n    index index.html index.htm index.nginx-debian.html;\n\n    server_name example.com www.example.com; #example.com is different in both files.\n\n    location / {\n        try_files $uri $uri/ =404;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要不和谐音:

\n\n

另一个堆栈问题要求重写这些行或注释掉其中一行。重写要么无法解决错误,要么导致文件无法公开提供的情况(example.com 无处可去)。

\n\n

概括:

\n\n

这个问题好像是关于第2行,第3行,或者第2行和第3行。

\n\n

本质上,所有主要的操作方法要么明确告诉读者使用上面的代码,要么没有提及这些行。

\n

Iva*_*sky 7

当您在指令上指定default_server标志时listen,nginx 将使用该server块来服务任何 HTTPHost标头与任何其他服务器块中的标头不匹配的请求server_name(或请求Host根本缺少标头)。default_server您只能在作为指令参数给出的任何特定 IP:端口组合上使用listen一次标志。但是您可以在不同的 IP:端口组合上多次使用此标志。

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

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
    ...
}
Run Code Online (Sandbox Code Playgroud)

工作示例:

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

站点 1 配置文件

server {
    listen 80;
    server_name example1.com www.example1.com;
    ...
}
Run Code Online (Sandbox Code Playgroud)

站点2配置文件

server {
    listen 80;
    server_name example2.com www.example2.com;
    ...
}
Run Code Online (Sandbox Code Playgroud)

默认服务器配置文件

server {
    listen 80 default_server;
    server_name _;
    return 444;
}
Run Code Online (Sandbox Code Playgroud)

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