不确定如何快速总结这个问题,所以我将把我的情况分成几点:
- 常规基本 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