所以我正在设置一个启用 SSL 的 nginx 服务器,其服务器定义如下:
server {
listen :80;
listen [::]:80;
server_name example.org;
root /foo/bar;
ssl on;
ssl_certificate /path/to/public/certificate;
ssl_certificate_key /path/to/private/key;
...
}
你明白了(请原谅任何错别字)。
无论如何,我想知道的是;如果我更新我的证书,有没有办法安装它们而无需重新启动 nginx?
例如,如果我要使用/path/to/public/certificate
和的符号链接/path/to/private/key
指向我当前的证书,nginx
如果我只是将它们更改为指向新的(更新的)证书,我是否仍然需要重新启动?还有其他选择吗?
答案1
您将需要重新加载Nginx 以便续订的证书显示正确的到期日期(请阅读下面的说明和其他评论,了解两者之间差异的解释)重新加载和重新启动nginx)。
重新加载 Nginx 后,简单的缓存清除和浏览应该允许您查看 SSL 证书上更新的到期日期。
或者,如果您更喜欢 cli,则始终可以使用旧的可靠 OpenSSL 命令:
echo | openssl s_client -connect your.domain.com:443 | openssl x509 -noout -dates
这将为您提供证书上的当前日期。
在你的情况下,端口将是80而不是443(OP后来指出问题中的端口80实际上应该是443,但是Nginx将在你提供的任何端口上侦听HTTP或HTTPS,只要它们当前未被其他进程使用)。
很多时候nginx -s reload
并不能按预期工作。在许多系统(Debian 等)上,您需要使用/etc/init.d/nginx reload
.
编辑以更新并澄清此答案:
在现代系统上systemd
,您还可以运行systemctl reload nginx
或service nginx reload
。
所有这些reload
方法不同于restart
事实上他们发送了一个SIGHUP
告诉 Nginx 重新加载其配置而不终止现有连接的信号(这会在完全重新启动时发生,并且几乎肯定会影响用户)。
如果由于某种原因,Nginx 没有重新加载您的证书,您可以restart
这样做,但请注意,它的影响会比reload
.
到重新开始Nginx,您只需运行即可systemctl restart nginx
,或者在没有 Nginx 的系统上systemd
运行nginx -s stop && nginx -s start
。
如果所有其他方法都失败了(无论出于何种原因),只需杀死 Nginx PID,并且您始终可以通过直接使用nginx -c /path/to/nginx.conf
.
答案2
收到后SIGHUP
nginx 将重新加载更新的配置,在打开日志文件和读取 SSL 证书时进行验证,然后根据之前的配置正常关闭工作进程。
如果碰巧 nginx 无法读取某些 SSL 证书,我将继续使用旧配置运行。换句话说,无论您对配置文件做了什么,它都会继续运行并处理请求。即使它们被破坏,您的网站仍然会打开。
所以,是的,如果您希望 nginx 看到更新的证书,则不必重新启动 nginx 并冒使服务器离线超过几秒钟的风险。这应该足以:
sudo service nginx reload
在大多数当前默认使用 systemd 的发行版中,您还可以使用以下命令重新加载 nginx:
sudo systemctl reload nginx