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

时间:2015-11-11 14:31:44

标签: django virtualenv gunicorn

我正在使用Nginx作为网络服务器并在Gunicorn中安装virtualenv,在我的VPS上部署Django应用。 (我将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 gunicorn.conf而不是settings.py,我可以确认此os.environ[..]有效。

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

2 个答案:

答案 0 :(得分:6)

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

env DATABASE_PASSWORD="secret_password"

答案 1 :(得分:1)

您不能在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 env变量。