Docker jrcs/letsencrypt-nginx-proxy-companion无法正常生成SSL证书求助
问题排查方案
核心问题定位
你当前遇到的问题核心是Let's Encrypt证书未成功生成,从你提供的目录结构可以看到两个子域名对应的证书目录都是空的,nginx只能调用默认的自签证书,所以浏览器会提示不安全,找不到对应域名的证书配置也会触发500错误。
具体排查步骤
- 第一步:查看letsencrypt companion容器日志获取报错信息
执行命令docker ps | grep letsencrypt找到对应容器名,再执行docker logs 容器名,可以直接看到证书申请失败的具体原因。 - 第二步:检查端口放行规则
服务器的安全组、本地防火墙(ufw/iptables)必须开放80、443端口的公网入站权限,Let's Encrypt的HTTP-01验证依赖80端口,端口被屏蔽会直接导致申请失败。 - 第三步:验证域名解析配置
两个子域名必须都解析到当前部署服务器的公网IP,解析记录不能有代理、CDN转发,确保公网可以直接通过域名访问到服务器的80端口。 - 第四步:核对容器环境变量
检查WordPress、phpMyAdmin容器的配置,必须完整配置三个环境变量:VIRTUAL_HOST(你的子域名)、LETSENCRYPT_HOST(和VIRTUAL_HOST一致)、LETSENCRYPT_EMAIL(你填写的有效邮箱),缺少任意一个都不会触发证书申请。 - 第五步:调整容器启动顺序
必须先完整启动nginx-proxy和letsencrypt companion容器,等待1分钟左右服务完全就绪后,再启动WordPress和phpMyAdmin容器,否则companion无法检测到新的域名申请,不会生成证书。
你可以先执行docker stop $(docker ps -aq)停掉所有容器,先进入nginx-proxy目录执行docker-compose up -d,等待30秒后再进入站点目录执行docker-compose up -d即可。 - 第六步:排查权限与限额问题
- 确认nginx-proxy/certs目录的权限允许容器写入,可以临时执行
sudo chmod -R 777 /srv/www/nginx-proxy/certs测试。 - 如果你近期反复测试同一个域名的证书申请,可能触发Let's Encrypt的周申请限额(同一域名每周最多5次),可以换子域名测试或者等待7天后再尝试。
- 确认nginx-proxy/certs目录的权限允许容器写入,可以临时执行
验证修复结果
修复完成后,查看nginx-proxy/certs下的子域名目录,会生成对应的.crt和.key文件,此时访问HTTPS站点就不会提示证书错误,500问题也会同步解决。
内容的提问来源于stack exchange,提问作者Jacobo
相关产品推荐
相关产品推荐

