如果我更新我的安全证书,是否需要重新启动 Nginx?

Har*_*ikk 51 ssl nginx certificates

所以我正在设置一个启用了 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;

    ...
}
Run Code Online (Sandbox Code Playgroud)

你明白了(请原谅任何错别字)。

无论如何,我想知道的是;如果我更新我的证书,有没有办法安装它们而不必重新启动 nginx?

例如,如果我要使用来自/path/to/public/certificate和 的符号链接/path/to/private/key,指向我当前的证书,nginx如果我只是将它们更改为指向新的(更新的)证书,我是否还需要重新启动?有替代品吗?

rub*_*ils 41

您需要重新加载Nginx 才能使更新的证书显示正确的到期日期(请阅读下面的说明和其他注释,以了解重新加载重新启动Nginx之间的区别)。

重新加载 Nginx 后,简单的缓存清除和浏览应该允许您查看 SSL 证书上更新的到期日期。

或者,如果您更喜欢 cli,则始终可以使用旧的可信赖的 OpenSSL 命令:

echo | openssl s_client -connect your.domain.com:443 | openssl x509 -noout -dates
Run Code Online (Sandbox Code Playgroud)

这将为您提供证书上的当前日期。

在您的情况下,端口将是 80 而不是 443(OP 后来表示问题中的端口 80 实际上应该是 443,但是 Nginx 将在您提供的任何端口上侦听 HTTP 或 HTTPS,只要它们当前未被其他进程使用)。

很多时候nginx -s reload没有按预期工作。在许多系统(Debian 等)上,您需要使用/etc/init.d/nginx reload.

编辑以更新和澄清此答案:

在带有 的现代系统上systemd,您还可以运行systemctl reload nginxservice nginx reload

所有这些reload方法的不同之处restart在于它们发送一个SIGHUP信号告诉 Nginx 重新加载其配置而不终止现有连接(这会在完全重启时发生,并且几乎肯定会影响用户)。

如果由于某种原因,Nginx 没有重新加载您的证书,您可以重新加载restart,但请注意,它比reload.

重新启动Nginx,您只需运行systemctl restart nginx,或者在没有 的系统上systemd,您将执行nginx -s stop && nginx -s start.

如果所有其他方法都失败(无论出于何种原因),只需终止 Nginx PID,并且您始终可以通过直接使用nginx -c /path/to/nginx.conf.

  • 是的。发送 SIGHUP 将导致 nginx 切换到更新的证书。 (15认同)
  • `nginx reload` 和重启 Nginx 是两件不同的事情:`reload` 不会重启 Nginx 而只是向它发送 SIGHUP 信号。SIGHUP 信号够吗? (12认同)

san*_*mai 30

收到SIGHUPnginx 后,将重新加载更新的配置,在打开日志文件和读取 SSL 证书时对其进行验证,然后根据先前的配置正常关闭工作进程。

如果 nginx 无法读取某些 SSL 证书,我将继续使用旧配置运行。否则,无论您对配置文件做了什么,它都会继续运行并处理请求。即使它们坏了,您的网站仍会打开。

所以是的,如果您希望 nginx 看到更新的证书,您不必重新启动 nginx 并冒着使服务器脱机超过几秒钟的风险。应该足以:

sudo service nginx reload
Run Code Online (Sandbox Code Playgroud)

在大多数默认使用 systemd 的当前发行版中,您还可以使用以下命令重新加载 nginx:

sudo systemctl reload nginx
Run Code Online (Sandbox Code Playgroud)

  • 在 **Ubuntu 16**、**CentOS 7** 和其他支持 `systemd` 的系统上你也可以执行 `sudo systemctl reload nginx`(上面提到的 `sudo service nginx reload` 的别名)。 (3认同)