发布于: 2025-12-24最后更新: 2025-12-24字数 809阅读时长 3 分钟

type
status
date
slug
summary
tags
category
icon
password
Property
Dec 24, 2025 12:25 PM
URL
page icon
Notion AI 总结: 本文记录了 certbot 使用 standalone 模式续期 SSL 证书时,因 nginx 占用 80 端口导致失败的问题排查与解决过程——核心方案是将 certbot 切换为 nginx 模式完成验证。

1. 起因

之前用 3x-ui 搭建了一个个人的机场,并且配置了上了域名,配置了 SSL 证书,我使用的是 cerbot 创建的 SSL 证书,之前也用创建过定时续期的功能,但是这个功能老报错,之前每次都是问 ChatGPT 来解决,都没记录下来,今天记录一下。
 
通过命令
notion image
 
报错信息是:
certbot.service 每次都失败在同一个点:80 端口被其他程序占用了,而且使用的是 standalone 模式续签。
 
standalone 的工作方式是:
certbot 临时启动一个 HTTP server→ 监听 0.0.0.0:80→ 等待 Let's Encrypt 访问验证→ 验证完成后立刻退出
所以只有 standalone 模式才会出现:
如果 80 端口被占用,续签就会失败。
此外
说明:
  • certbot 进程自己直接失败
  • 不是 nginx reload 失败
  • 不是配置文件解析失败
这也排除了 nginx / apache 插件路径。

2. 解决办法

2.1 查看端口占用

既然我们知道是 80 端口的问题,我们首先使用命令
 
notion image
可知是 nginx 管理着 80 端口
这一步的意义是:
  • certbot 不是“随便选模式”
  • 续期方式必须和当前 web server 完全一致
  • 否则自动续期一定失败
既然 nginx 是占用 80 端口的,那 certbot 就必须改用 nginx 模式。
 

2.2 certbot 改成 nginx 模式

我们需要自动续期的域名是 hw-xjp10.wxyhgk.com
重新以 nginx 模式签发证书
执行这个命令后 certbot 会:
  • 扫描 /etc/nginx/sites-enabled/
  • 找到 server_name hw-xjp10.wxyhgk.com
  • 确认这是一个 nginx 正在服务的域名
如果找不到,命令会直接失败

2.3 验证是否使用了 nginx 模式

使用
notion image
 
可以看到这里的
说明以后已经是用 nginx 模式的
 
检查dry-run 是否彻底不再报 bind 80
 
结果:
 
并且 日志中不再出现

2.4 注意事项

Certbot 生成/续期证书时,会把每个证书的相关参数都记录在独立的配置文件里
这个文件保存的就是:
  • 用的 ACME plugin/验证方式(standalone/nginx/webroot 等)
  • certbot 当时怎么签发的
  • 之后续期要用什么方式
 
如果你的服务器上不止一个域名,每个都有自己的 renewal 配置文件。
即便服务器只有一个 nginx 在跑,certbot 也不会把 nginx 模式“自动复制到每个证书配置上”,需要你对每个域名分别指定 nginx 插件重新生成/迁移。
 
为了看到我们的这种模式是否真的可以正确的运行,我们使用下面的命令,立即执行 timer
notion image
我们看到了文字 Congratulations, all simulated renewals succeeded ,说明我们大功告成了!
 

Loading...
公告
公告
博客重大更新,更换为matery主题,阅读体验更加好了。
和博主联系
notion image