Gunicorn启动提示找不到Let's Encrypt证书文件该如何处理
问题根因
报错的核心原因是Let's Encrypt证书默认存储目录/etc/letsencrypt/只有root用户有读写权限,运行Gunicorn的普通用户没有权限读取证书文件。直接修改文件/目录权限会在certbot自动续期后被重置,必须使用持久化的权限配置方案才能永久解决问题。
解决方案
方案1:配置certbot续期钩子自动设置权限(永久生效)
该方案适配直接用Gunicorn对外提供HTTPS服务的场景,配置后证书续期不会重置权限:
- 首先创建专门的证书访问用户组,把Gunicorn的运行用户加入组(示例中运行用户为
ubuntu,你可以替换为自己的实际运行用户):
# 创建证书访问组 sudo groupadd cert-users # 将Gunicorn运行用户加入组 sudo usermod -aG cert-users ubuntu
- 修改certbot全局配置文件
/etc/letsencrypt/cli.ini,在末尾添加续期后自动执行的权限设置钩子:
post-hook = chown -R root:cert-users /etc/letsencrypt/archive /etc/letsencrypt/live && chmod -R 750 /etc/letsencrypt/archive /etc/letsencrypt/live && chmod 640 /etc/letsencrypt/archive/*/*
- 手动执行一次钩子让权限立即生效:
sudo certbot renew --force-renewal --post-hook "chown -R root:cert-users /etc/letsencrypt/archive /etc/letsencrypt/live && chmod -R 750 /etc/letsencrypt/archive /etc/letsencrypt/live && chmod 640 /etc/letsencrypt/archive/*/*"
方案2:添加Nginx反向代理(生产环境更推荐)
不需要修改任何证书权限,架构也更合理:
- 让Gunicorn只监听本地127.0.0.1的端口(比如8000),启动时去掉所有SSL证书相关参数
- 部署Nginx作为前置反向代理,由Nginx处理HTTPS证书解析、静态资源分发、流量限制等逻辑,再把动态请求转发给本地的Gunicorn服务即可。Nginx默认运行用户有权限访问Let's Encrypt证书,不需要额外调整权限。
验证配置
切换到Gunicorn运行用户,执行以下命令确认可以正常读取证书:
sudo su - ubuntu cat /etc/letsencrypt/live/api.redrebelgames.com/cert.pem
如果能正常输出证书内容,说明权限配置生效,重新启动Gunicorn即可正常运行。
内容的提问来源于stack exchange,提问作者Ryan Glenn
相关产品推荐
相关产品推荐

