You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:23:24