Docker Compose无法读取本地证书,Django后端SSL配置失败
解决Gunicorn找不到SSL证书的问题
核心问题定位
Gunicorn报错找不到/etc/letsencrypt/live/api.my-table.it/fullchain.pem,但你的VPS证书实际路径是/etc/letsencrypt/live/domain.it/,且Docker卷映射存在以下关键问题:
- 容器内证书路径与Gunicorn配置不匹配
- 仅映射
live目录下单个文件,忽略了Let's Encrypt证书的符号链接依赖 - 容器内证书文件权限不足
具体修复步骤
1. 统一证书路径配置
更新Gunicorn配置(gunicorn.conf.py)
确保配置中的证书路径和容器内映射的路径完全一致:
- 如果你的VPS证书对应域名是
domain.it,修改Gunicorn配置:
# gunicorn.conf.py bind = "0.0.0.0:443" certfile = "/etc/letsencrypt/live/domain.it/fullchain.pem" keyfile = "/etc/letsencrypt/live/domain.it/privkey.pem"
- 如果服务实际域名是
api.my-table.it,需先在VPS上为该子域名生成对应的Let's Encrypt证书,再同步调整路径。
2. 修正Docker Compose卷映射
Let's Encrypt的live目录下证书是符号链接,指向/etc/letsencrypt/archive/内的实际文件,仅映射单个文件会导致链接失效。需挂载整个/etc/letsencrypt目录:
# docker-compose.yml services: my_table: # 其他原有配置... volumes: - /etc/letsencrypt:/etc/letsencrypt:ro ports: - "443:443"
添加:ro以只读模式挂载,提升容器安全性。
3. 解决容器内权限问题
Let's Encrypt证书目录默认权限为root:root(权限值700),容器内Gunicorn进程可能无读取权限,可通过以下方式修复:
- 临时测试方案:以root用户运行容器
在docker-compose.yml中添加:services: my_table: user: root # 其他配置... - 生产环境方案:调整VPS证书目录权限
给其他用户添加读取和执行权限:
或修改Dockerfile,将容器运行用户加入root组:sudo chmod -R o+r /etc/letsencrypt/live/ /etc/letsencrypt/archive/ sudo chmod -R o+x /etc/letsencrypt/live/ /etc/letsencrypt/archive/RUN usermod -aG root <你的容器运行用户名>
4. 验证配置并重启服务
完成修改后,重启Docker Compose服务:
docker-compose down && docker-compose up -d
查看Gunicorn日志确认启动状态:
docker-compose logs my_table
内容的提问来源于stack exchange,提问作者Matteo Possamai
相关产品推荐
相关产品推荐

