我正在使用Nginx
作为网络服务器并在Gunicorn
中安装virtualenv
,在我的VPS上部署Django应用。 (我将virtualenv
与virtualenvwrapper
一起使用。)
当我像这样运行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
时,我需要做些什么才能找到我的环境变量?第一种和第二种方式有什么区别?感谢。
答案 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变量。