我一直在运行一个大约有 60 个网站的 nginx 网络服务器,我注意到运行以下命令非常慢:
systemctl reload nginx
大约需要20秒。systemctl restart nginx
需要30多秒。
我在尝试使用 certbot 颁发或更新 SSL 证书时也遇到了问题。它失败了,因为它找不到质询文件。在解决了这个次要问题后,我发现使用这些标志 - --debug-challenges -v
- 运行 certbot 命令会导致在尝试颁发证书之前暂停。如果我等待 25 秒然后继续该过程,它会正常工作而不会出现错误。我已经确认质询文件需要 25 秒才能通过提供的 URL 访问。我相信质询文件正在加载到 nginx 配置中,但无法立即通过 URL 获得,因为 nginx 需要很长时间才能重新加载配置。
这导致的最大问题是 certbot 自动续订失败,所以我目前必须手动运行续订。
简而言之,我需要帮助来解决这个问题。
编辑 - 我进行了一些故障排除。我删除了所有符号链接/etc/nginx/sites-enabled/
,然后逐个添加回来。我注意到每个站点都会使 nginx 解析站点的时间增加 (大约) 0.1 秒。
我使用以下命令检查了这一点:
time nginx -t
当我添加所有站点(大约 60 个站点)时,上述命令运行所需的时间大约为 7 秒。
我也尝试过只添加一个站点,并使站点文件尽可能简单,但运行仍然需要大约相同的时间nginx -t
。因此,我认为问题不在于配置文件本身。
您对故障排除还有其他想法吗?这可能与 IPv6 有关吗?我认为我的服务器没有 IPv6 地址,所以我不知道这是否会导致问题。
答案1
我已将我的评论整理成答案,以方便将来搜索。
问题的核心
这导致的最大问题是自动 certbot 续订失败,所以我目前必须手动运行续订。
我的答案
您可以通过这些方式让 certbot 等待 nginx 重新加载。
使用命令行选项
Certbot > 用户指南 > Certbot 命令行选项
--nginx-sleep-seconds NGINX_SLEEP_SECONDS
Number of seconds to wait for nginx configuration
changes to apply when reloading. (default: 1)
使用配置文件
Certbot 接受一个全局配置文件,该文件将其选项应用于 Certbot 的所有调用。
默认情况下不会创建 cli.ini 文件(但如果您通过包管理器安装了 Certbot,它可能已经存在)。
您还可以输入:
nginx-sleep-seconds = 30
转化为
/etc/letsencrypt/cli.ini
,使其成为全球化的。
我的原始帖子如下:
在下面的示例单元文件中,nginx -s reload
设置为ExecReload
。
https://www.nginx.com/resources/wiki/start/topics/examples/systemd/
ExecReload=/usr/sbin/nginx -s 重新加载
该选项似乎可以正常关机。
https://nginx.org/en/docs/switches.html
reload — 重新加载配置,使用新配置启动新的工作进程,正常关闭旧的工作进程。
https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/
然而,更有趣的选项是能够动态更改 NGINX 配置
如果您的环境中设置了该选项或类似选项,那么这种行为是否可能导致延迟?