我有一台使用 certbot 设置了 SSL 的 nginx 服务器。最初是其他人设置的服务器。主要文件在域的根目录下提供,并且有一个节点 api 在端口 4040 上运行。问题是,虽然根域的 SSL 证书工作正常(例如https://example.com/some/path),API 的 SSL 证书已过期(https://example.com:4040/api/route)。我甚至不知道可以通过这种方式设置 SSL,在查看了我的 nginx 配置后,我不知道它是如何以这种方式运行的。这是我的 nginx 配置(在 /etc/nginx/sites-enabled/default 中)
server {
root /var/www/myapp/current/dist;
server_name example.com;
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
try_files $uri $uri/ /index.html;
}
}
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
return 404; # managed by Certbot
}
使用此设置一切都运行良好,直到今天 :4040 端口提供的 SSL 证书过期。我想让为根域提供的证书也为 :4040 端口提供服务,但我不知道该怎么做。
答案1
我搞清楚了,确实应该早点发现这个问题。我为 api 运行的节点服务器通过 https 模块自行处理 SSL 证书。由于证书由 certbot 更新后应用程序没有重新启动,因此它仍在提供旧证书。重新启动节点应用程序解决了这个问题。
处理此问题的正确方法是结合使用--pre-hook
和--post-hook
certbot 的更新功能。因为我使用 pm2 管理我的节点应用程序,所以我需要将我的 certbot cron 作业更新为:
@monthly /path/to/certbot-auto renew --standalone --post-hook "pm2 restart myapp"