Gunicorn未正确加载Django配置文件问题求助
问题原因分析
嘿,我一眼就看穿问题所在了——systemd 管理的服务默认不会读取 /etc/profile、~/.bashrc 这类登录/交互式 Shell 的环境变量配置文件!你把 PROD 变量写在 /etc/profile 里,但 gunicorn 是被 systemd 直接启动的,它的进程环境里根本拿不到这个变量,自然触发不了 wsgi.py 里的生产环境配置分支。
解决方案
下面给你几个靠谱的解决办法,按优先级排序:
方法1:直接在 gunicorn.service 中定义环境变量
这是最简单直接的方式,把 PROD 变量直接写到 systemd 服务配置里:
[Unit] Description=gunicorn daemon After=network.target [Service] User=root Group=www-data WorkingDirectory=/home/myproject/myproject # 新增这行,直接设置环境变量 Environment="PROD=1" ExecStart=/usr/local/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/myproject/myproject/myproject.sock myproject.wsgi:application [Install] WantedBy=multi-user.target
修改完成后,执行以下命令让 systemd 重新加载配置并重启服务:
systemctl daemon-reload systemctl restart gunicorn.service
方法2:用 systemd 环境配置文件单独管理
如果你的环境变量比较多,或者想和服务配置分离,可以创建一个单独的环境配置文件:
- 创建 systemd 服务的额外配置目录(如果不存在的话):
mkdir -p /etc/systemd/system/gunicorn.service.d
- 在该目录下创建
env.conf文件,内容如下:
[Service] Environment="PROD=1"
- 同样执行重载和重启命令:
systemctl daemon-reload systemctl restart gunicorn.service
验证环境变量是否生效
修改后可以验证一下 gunicorn 进程是否真的拿到了 PROD 变量:
- 找到 gunicorn 的主进程 PID:
ps aux | grep gunicorn
- 查看该进程的环境变量:
cat /proc/<你的PID>/environ | tr '\0' '\n'
如果能看到 PROD=1,就说明配置生效了,此时 wsgi.py 里的条件判断应该能正确加载生产环境配置了。
补充说明
为什么 /etc/profile 没用?因为 systemd 启动服务时,是在一个非交互式、非登录的 Shell 环境下运行的,这类环境不会自动读取 /etc/profile、~/.bash_profile 这类针对登录 Shell 的配置文件。所以你之前在 /etc/profile 里设置的变量,根本传不到 gunicorn 进程中。
内容的提问来源于stack exchange,提问作者Coderaemon
相关产品推荐
相关产品推荐

