最轻量可靠的ssl证书同步方式是挂载宿主机整个live目录或其软链接,确保chmod -r o+r权限开放、selinux加标签,并在nginx配置中使用绝对路径指向挂载点,续签后需通过deploy-hook执行nginx -s reload重载。

直接挂载宿主机证书目录到 Nginx 容器,是最轻量、最可靠的 SSL 证书同步方式。关键在于路径对、权限通、重载准——证书一更新,Nginx 就能立刻读到新内容并生效。
挂载整个 live 目录,别只挂单个文件
Let’s Encrypt 默认把证书放在 /etc/letsencrypt/live/your-domain/,里面是两个符号链接:fullchain.pem 和 privkey.pem。续签后,这些链接会指向新生成的证书文件。如果只挂载这两个文件,容器内无法感知目标变更,容易导致证书过期仍被使用。
- 正确做法:挂载整个
live/your-domain目录(或其父级/etc/letsencrypt) - 更推荐:在宿主机创建统一软链接,例如
/opt/nginx/ssl → /etc/letsencrypt/live/your-domain,再挂载这个链接路径 - 启动容器时用绝对路径挂载,如
-v /opt/nginx/ssl:/etc/nginx/ssl:ro
确保容器内 nginx 用户能读取证书
Nginx 官方镜像中,worker 进程通常以 UID 101 的 nginx 用户运行。宿主机证书目录必须对其开放读权限。
- 执行
chmod -R o+r /opt/nginx/ssl(开放其他用户读权限) - 若宿主机启用了 SELinux,还需加标签:
chcon -Rt svirt_sandbox_file_t /opt/nginx/ssl - 验证是否可读:进容器执行
ls -l /etc/nginx/ssl,确认能看到fullchain.pem和privkey.pem
Nginx 配置要匹配挂载路径
配置文件里不能写相对路径或 ~,所有路径必须是容器内的绝对路径,且与挂载目标一致。
- 在
server块中明确指定:ssl_certificate /etc/nginx/ssl/fullchain.pem;ssl_certificate_key /etc/nginx/ssl/privkey.pem; - 不要写成
ssl_certificate ssl/fullchain.pem或ssl_certificate ./ssl/fullchain.pem - 建议将 SSL 配置单独抽到
/etc/nginx/conf.d/ssl.conf,便于维护
证书续签后必须主动重载 Nginx
Docker 的 bind mount 是实时同步的,但 Nginx 不会自动 reload。必须在证书更新后触发信号。
- 在 Certbot 的
--deploy-hook中调用:certbot renew --deploy-hook "docker exec nginx nginx -s reload" - 若用 docker-compose,改用:
docker-compose exec nginx nginx -s reload - 确保容器名(如
nginx)与实际一致;可加-t参数避免超时











