更正 gunicorn.conf 以获取 Django 使用的环境变量

Correct gunicorn.conf to get environmental variables for Django use

我正在我的 VPS 上部署一个 Django 应用程序,使用 Nginx 作为 Web 服务器,Gunicorn 安装在 virtualenv 中。 (我正在使用 virtualenvvirtualenvwrapper。)

当我这样运行Gunicorn时,可以查到环境变量(如数据库密码,名称):

workon virtual_env_name
# from my_project's root path
gunicorn my_project.wsgi --bind localhost:9000 --daemon
# this works

我是这样导出环境变量的:

# /home/user_name/Envs/virtual_env_name/bin/postactivate
export DATABASE_PASSWORD="secret_password"

然而下面的方式没有(无论是否激活virtual_env_name):

sudo service gunicorn start
# env variables can't be found - KeyError thrown

这是我的 gunicorn.conf 脚本的样子:

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

# If the process quits unexpectadly trigger a respawn
respawn

setuid user_name
setgid www-data
chdir /home/user_name/my_project

exec /home/user_name/Envs/virtual_env_name/bin/gunicorn \
    --name=my_project \
    --pythonpath=/home/user_name/my_project \
    --bind=127.0.0.1:9000 \
    my_project.wsgi:application

如果我将所有密码硬编码到我的 Django 的 settings.py 而不是使用 os.environ[..].

,我可以确认这个 gunicorn.conf 有效

当我用 sudo service start 启动 Gunicorn 时,我需要做什么才能找到我的环境变量?第一种方式和第二种方式有什么区别?谢谢。

您需要在 gunicorn.conf 中定义这些变量。

env DATABASE_PASSWORD="secret_password"

您没有 运行 virtualenv 中的代码。

而不是 exec 使用

pre-start script
    workon virtual_env_name
end script

script
    gunicorn \
        --name=my_project \
        --pythonpath=/home/user_name/my_project \
        --bind=127.0.0.1:9000 \
        my_project.wsgi:application
end script

workon 更新您的 $PATH 环境变量。