Nginx容器无法读取Certbot共享卷证书问题求助
问题排查:Nginx无法加载Certbot生成的证书(Docker Compose环境)
已完成操作
- 通过Certbot容器成功生成单域名+通配符证书,执行命令:
sudo docker run -it --rm --name certbot -v certbot_certs:/etc/letsencrypt -v /var/www/certbot:/var/www/certbot -v ~/.secrets/certbot:/.secrets/certbot certbot/dns-digitalocean certonly --dns-digitalocean --dns-digitalocean-credentials /.secrets/certbot/do.ini --server https://acme-v02.api.letsencrypt.org/directory --email xxxxxxxxxxxxxxxxxxxx --agree-tos --no-eff-email -d <domain> -d *.<domain>
- 证书已确认存储在
certbot_certs卷的/etc/letsencrypt/live/<domain>/路径下
当前配置
Docker Compose中Nginx挂载配置
volumes: - certbot_certs:/etc/nginx/ssl:ro - /var/www/certbot:/var/www/certbot:ro
Nginx配置文件nginx.conf
server { listen 443 ssl http2; server_name geokotze.dev www.geokotze.dev; ssl_certificate /etc/nginx/ssl/live/<domain>/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/live/<domain>/privkey.pem; location / { root /usr/share/nginx/html; index index.html; } }
错误信息
启动Nginx时抛出:
[emerg] 1#1: cannot load certificate "/etc/nginx/ssl/live/<domain>/fullchain.pem": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/etc/nginx/ssl/live/<domain>/fullchain.pem, r) error:10000080:BIO routines::no such file)
排查方案与解决步骤
1. 替换配置中的占位符
你的Nginx配置里ssl_certificate路径使用了<domain>占位符,但实际域名是geokotze.dev,必须将占位符替换为真实域名:
ssl_certificate /etc/nginx/ssl/live/geokotze.dev/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/live/geokotze.dev/privkey.pem;
这是最常见的错误,优先排查。
2. 验证证书路径是否存在
进入Nginx容器,检查证书路径是否真实存在:
# 替换<nginx-container-name>为你的容器名 docker exec -it <nginx-container-name> /bin/bash # 执行以下命令查看目录内容 ls -l /etc/nginx/ssl/live/geokotze.dev/
如果目录不存在,说明:
- Certbot生成证书时的域名与
geokotze.dev不符,可通过以下命令确认:docker run -it --rm -v certbot_certs:/etc/letsencrypt certbot/dns-digitalocean ls -l /etc/letsencrypt/live/ - 或Docker卷挂载存在问题,检查Compose中卷名称是否与Certbot命令中的
certbot_certs完全一致。
3. 检查文件权限
Certbot生成的证书默认权限为root:root,而Nginx容器通常以nginx用户运行,可能无读取权限:
- 临时测试:在Docker Compose的Nginx服务中添加
user: root,重启容器。若能正常启动,说明是权限问题。 - 永久解决:调整Nginx容器的用户组,使其能读取证书文件,或在Certbot生成证书时指定宽松权限(优先前者)。
4. 确认软链接有效性
live目录下的证书文件是指向archive目录的软链接,进入容器检查软链接是否有效:
docker exec -it <nginx-container-name> ls -l /etc/nginx/ssl/live/geokotze.dev/fullchain.pem
若软链接指向的文件不存在,说明Certbot生成证书时出现异常,需重新生成证书。
内容的提问来源于stack exchange,提问作者GeorgeTheFool
相关产品推荐
相关产品推荐

