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

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 环境配置文件单独管理

如果你的环境变量比较多,或者想和服务配置分离,可以创建一个单独的环境配置文件:

  1. 创建 systemd 服务的额外配置目录(如果不存在的话):
mkdir -p /etc/systemd/system/gunicorn.service.d
  1. 在该目录下创建 env.conf 文件,内容如下:
[Service]
Environment="PROD=1"
  1. 同样执行重载和重启命令:
systemctl daemon-reload
systemctl restart gunicorn.service

验证环境变量是否生效

修改后可以验证一下 gunicorn 进程是否真的拿到了 PROD 变量:

  1. 找到 gunicorn 的主进程 PID:
ps aux | grep gunicorn
  1. 查看该进程的环境变量:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:28:08