【发布时间】:2011-02-13 18:52:25
【问题描述】:
我正在寻找解决方案,我无法将 /etc/profile 中定义的变量传递给 apache。
这是我要设置的内容:
我有一个 django 应用程序,通过 WGSI 接口通过 Apache/Passenger (modrails) 部署。
在我的 settings.py 中,我正在使用这个 python 命令: 环境 = os.getenv('ENV', 'PROD') 因此,如果未定义 ENVIRONMENT 变量,则默认情况下会进入生产设置。
这有助于我管理我连接到的数据库并激活调试工具。
它在生产中工作,因为它是默认值,当我在 DEV 服务器上时,我无法从 /etc/profile 获取环境变量。
它在 Ubuntu 10.04 服务器上
所以这是我做的一些测试:
1) 放入 /etc/profile -> 环境='开发' 导出 ENV
2) 在 /etc/profile.d/environment.sh -> #!/bin/sh 环境='开发' 导出 ENV
3) 在我的虚拟主机配置文件中 -> PassEnv ENV
4) 仍在我的虚拟主机配置文件中 -> SetEnv ENV DEV
5) 如果我强制在此文件中,乘客需要乘客 wgsi.py 来注册您的应用程序 viron['ENV'] = 'DEV' 这已经成功了,但我不能这样做
ENVIRONMENT = os.getenv('ENV', 'PROD')
os.environ['ENV'] = ENVIRONMENT
知道为什么或如何解决这个问题吗?
谢谢你!
@Josh
感谢您的回复。但我还有一些问题。
对于Passenger,我唯一需要在虚拟主机文件中设置的东西 是我的 python/django 应用程序中公共文件夹的位置。 所以我的虚拟主机文件看起来像这样。
DocumentRoot path_to_my_public_folder # /home/user/workspace/myapp/public
然后在 myapp 文件夹中有passenger_wsgi.py
像你说的那样定义很少:
import sys, os
sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = "myapp.settings"
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
在这些设置之后,应用程序正在运行。 因此,当您说我们必须指定时,我可能会错过您的指示 我们使用了哪个 wsgi 文件。我虽然它会直接找到passenger_wsgi.py并默认加载它看起来 目前正在做。
您应该知道的另一件事是我们的项目驻留在 SVN 存储库中,并且 我想为很多用户设置这个文件,所以我们没有不同的设置。
但是我明天要测试的是拥有一个包含公共信息的基本 wsgi 文件的想法 并基于计算机的主机名,我将从 dev_wsgi.py 或 prod_wsgi.py 等导入其他设置
我应该能够用 python 检索这个名字,并根据这个名字设置我需要使用的变量。
感谢您的想法,非常感谢。
【问题讨论】:
-
抱歉,我之前没有和Passenger合作过。我唯一的经验是使用 Apache,我们必须在 httpd.conf 中定义
/path/to/production.wsgi。如果 env 变量仍然不起作用,听起来你正朝着正确的方向前进。
标签: django apache2 environment-variables passenger setenv