Nginx 未使用 systemctl 监听新端口,在添加新端口配置后重新加载 nginx

Nginx 未使用 systemctl 监听新端口,在添加新端口配置后重新加载 nginx

不确定如何快速总结这个问题,所以我将把我的情况分成几点:

  • 常规基本 nginx 安装
  • 我只使用 https(443),所以我删除了所有 http(80) 配置
  • 当你启动 nginx(或restart它)时,该进程似乎也在监听端口 80(ss -tulp
  • /etc/nginx/sites-enabled当我在 http(80) 上添加一个监听器的配置时;
  • 重新加载 nginx,使用systemctl reload nginx(注意:重新加载,而不是重新启动)
  • 它不起作用,好像 nginx 仍然没有监听端口 80 上的流量
  • 如果我运行systemctl restart nginx它确实有效。

我注意到了这一点,因为 LetsEncrypt 无法续订我的证书。在调查了这个问题之后,我注意到了上面描述的行为。
因为我没有在 http(80) 上监听的 nginx 配置,所以我认为当我启动 nginx 时,nginx 不会添加任何监听器或其他东西(尽管 nginx 已声明端口 80)
并且如果 Certbot 随后尝试续订我的证书,它会将临​​时 http(80) 配置添加到 nginx 配置目录,大概随后会“重新加载”nginx,而不是重新启动(这是预期的,也是应该的)
但由于 nginx开始如果没有 http(80) 配置,它就不会处理从 LetsEncrypt 到该临时质询配置的流量。
我的解决方案很简单,只需向 nginx 添加一个基本的 http(80) 配置块,只需return 404;一个重新启动nginx。之后,Certbot 运行良好,可以更新我的所有证书。

我想知道这是否是预期的行为,或者这是否是 Nginx 中的一个(已知)错误。

谢谢

更新:

nginx version: nginx/1.18.0
Debian 11 (Bullseye)

答案1

我不认为这是一个错误,我认为这是你那边出了问题。我无法重现你的问题。

我已经使用 Amazon Linux 启动了一个新的 EC2 实例并安装了 nginx。

注释掉 http 服务器,取消注释 https,并生成证书:

#    server {
#        listen       80;
#        listen       [::]:80;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#        location = /404.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#        }
#    }

    server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  _;
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/pki/nginx/cert.pem";
        ssl_certificate_key "/etc/pki/nginx/key.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        # ssl_ciphers PROFILE=SYSTEM;
        # ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

证书:

[root@ip-10-0-0-110 nginx]# ls -l /etc/pki/nginx/
total 8
-rw-r--r-- 1 nginx nginx 2155 Feb  4 09:28 cert.pem
-rw-r--r-- 1 nginx nginx 3272 Feb  4 09:28 key.pem

启动服务器,端口 80 未被使用,但 443 被使用:

[root@ip-10-0-0-110 nginx]# ss -plunt | grep ':80'
[root@ip-10-0-0-110 nginx]# ss -plunt | grep ':443'
tcp  LISTEN 0      511                            0.0.0.0:443       0.0.0.0:*    users:(("nginx",pid=32264,fd=6),("nginx",pid=32262,fd=6),("nginx",pid=32205,fd=6))
tcp  LISTEN 0      511                               [::]:443          [::]:*    users:(("nginx",pid=32264,fd=7),("nginx",pid=32262,fd=7),("nginx",pid=32205,fd=7))

取消注释 HTTP 并执行systemctl reload nginx,两者都正在使用:

[root@ip-10-0-0-110 nginx]# vim /etc/nginx/nginx.conf
[root@ip-10-0-0-110 nginx]# systemctl reload nginx
[root@ip-10-0-0-110 nginx]# ss -plunt | grep ':443'
tcp  LISTEN 0      511                            0.0.0.0:443       0.0.0.0:*    users:(("nginx",pid=32288,fd=6),("nginx",pid=32287,fd=6),("nginx",pid=32205,fd=6))
tcp  LISTEN 0      511                               [::]:443          [::]:*    users:(("nginx",pid=32288,fd=7),("nginx",pid=32287,fd=7),("nginx",pid=32205,fd=7))
[root@ip-10-0-0-110 nginx]# ss -plunt | grep ':80'
tcp  LISTEN 0      511                            0.0.0.0:80        0.0.0.0:*    users:(("nginx",pid=32288,fd=13),("nginx",pid=32287,fd=13),("nginx",pid=32205,fd=13))
tcp  LISTEN 0      511                               [::]:80           [::]:*    users:(("nginx",pid=32288,fd=14),("nginx",pid=32287,fd=14),("nginx",pid=32205,fd=14))
[root@ip-10-0-0-110 nginx]#

将其注释掉并重新加载,只有 443 正在监听。

安装的版本:

[root@ip-10-0-0-110 nginx]# yum list nginx
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
nginx.x86_64                               1:1.20.0-2.amzn2.0.4

相关内容