Ubuntu18下Nginx使用Certbot续期SSL报Connection reset by peer错误
问题根因与对应解答
为什么Certbot会启动无法管控的Nginx残留进程
你混淆了Certbot不同认证插件的运行逻辑:网传“续期要停Nginx”是--standalone独立认证插件的操作要求,和你用的--nginx插件逻辑完全不兼容。--nginx插件的正常运行前提是Nginx通过系统服务管理器(Ubuntu 18上默认为systemd)正常运行,且能从nginx.conf配置的PID路径读到合法的运行进程号。你提前手动执行service nginx stop后,systemd会清空/run/nginx.pid文件,插件检测不到运行中的Nginx时,会直接调用nginx二进制文件自行拉起进程,但这个启动过程没有走systemd的服务管控逻辑,后续验证完成需要回滚配置、关闭临时进程时,插件读不到有效的PID值(对应你error.log里的invalid PID number "" in "/run/nginx.pid"报错),没法给自启动的Nginx进程发终止信号,就会留下占端口的残留进程。
你遇到的Connection reset by peer报错,本质就是这个插件私自拉起的残缺Nginx进程加载的临时验证配置不完整,对CA发来的随机验证路径请求处理异常直接断开连接——你手动创建固定test文件能正常访问,是因为残缺进程还能处理静态根目录的文件请求,但插件动态生成的验证路径规则没正确加载,CA访问自然会失败。
HTTP-01验证是否需要手动创建/.well-known/acme-challenge/路径文件
分认证模式决定,不需要默认手动创建:
- 用
--nginx插件:不需要手动建目录或文件,插件会临时在Nginx配置中注入最高优先级的location规则,直接在内存中返回CA要求的验证字符串,不会往磁盘webroot写任何文件,验证完成后自动删除临时配置。 - 用
--webroot插件:需要保证站点根目录下该路径有读写权限,插件会自动把验证文件写入对应目录,验证完自动删除,不需要手动提前创建目录。 - 用
--standalone插件:插件会自行启动临时Web服务监听端口,完全不依赖Nginx和磁盘文件,这时候才需要提前停掉占用80端口的服务。
现有Nginx配置是否干扰验证
你贴出的80端口基础server块配置本身不会干扰验证流程,但存在两个明确的干扰项:
- 执行certbot命令前手动停止系统托管的Nginx、导致PID文件丢失,是触发所有异常的核心原因。
- 如果开启了IPv6监听但服务器IPv6网络不通、或者前置了CDN/WAF拦截规则,可能出现本地IPv4访问正常、CA走IPv6或被WAF拦截时返回连接重置的问题。
正常的Certbot Nginx插件验证流程
- 插件读取系统Nginx主配置、所有站点vhost配置,匹配目标域名对应的server块,确认Nginx通过系统服务正常运行、PID文件有效。
- 生成临时Nginx配置副本,在对应域名的80端口server块中注入高优先级的
/.well-known/acme-challenge/路径规则,配置返回CA指定的验证字符串,不会修改磁盘上的原有配置文件。 - 校验临时配置语法合法后,给正在运行的Nginx主进程发重载信号加载临时配置,全程不中断现有服务、不额外启动新的Nginx进程占用端口。
- 通知CA发起HTTP-01验证请求,CA访问对应验证路径拿到匹配的字符串即判定验证通过。
- 无论验证成功或失败,插件都会自动重载回原有Nginx配置、清理临时文件,不会残留配置或进程。
问题修复步骤
- 先清理残留进程和异常文件:
pkill nginx lsof -i:80 -i:443 # 确认80、443端口无进程占用 rm -f /run/nginx.pid - 通过系统服务正常启动Nginx,确认运行状态正常:
systemctl start nginx cat /run/nginx.pid # 确认能读到合法的数字PID curl -I http://mysite.co.uk # 确认返回200 OK响应 - 不要停止Nginx服务,直接执行续期命令:
certbot renew --nginx # 如果需要重新签发指定域名证书可执行: # certbot run --nginx -d mysite.co.uk -d www.mysite.co.uk - 若仍报连接重置错误,做两项排查:
- 临时关闭域名的CDN/WAF代理,让CA请求直接回源,验证通过后再重新开启CDN。
- 若服务器未配置可用IPv6网络,注释掉Nginx配置中的
listen [::]:80;等IPv6监听规则,重载Nginx后再重试续期。
- 续期成功后执行
systemctl reload nginx加载新证书即可,后续自动续期任务不需要手动停止Nginx服务。
内容的提问来源于stack exchange,提问作者Wintermute
相关产品推荐
相关产品推荐

