我有这个/etc/profile.d/myfile.sh
:
export MYVAR=myval
我也在apache conf目录的<virtualhost>
部分有一个PassEnv MYVAR
行。
这让我做这样的事情:
$ echo $MYVAR myval $ python >>> import os; os.getenv('MYVAR') 'myval' $ sudo echo $MYVAR myval $ sudo -i root# echo $MYVAR myval
但是,尽pipe如此,我得到了:
root# /sbin/service httpd restart /sbin/service httpd restart Stopping httpd: [ OK ] Starting httpd: [Mon Oct 22 14:44:02 2012] [warn] PassEnv variable MYVAR was undefined [ OK ]
而我所有的从wsgi脚本中访问MYVAR的尝试都不起作用。
思考? 我在做什么明显错误?
编辑更多的细节
我有一群计算机/虚拟机和一群开发人员在一批项目上工作。 我需要一个简单的中心位置来保存环境信息,最常见的是“环境”(dev / stage / prod)。 我们得到的scheme(以编程方式修改*.wsgi
)变得比我们想要的更加脆弱。
我看到的主要选项是:
把东西放到shell环境中是最好的,因为我们不需要写更多的“我的环境是什么”代码。
Apache不会阅读全局用户configuration文件。
最大的问题是你究竟想要做什么?
你所做的一般是用Apache做错事情,但是因为不知道你正在试图解决的实际问题,所以不能说你应该做什么。
修改你的问题并说明你正在设置什么环境variables以及为什么。
更新1
不是特别的你在做什么,但是mod_wsgi中的SetEnv没有设置进程范围的环境variables。 它在WSGI environ字典中设置每个请求variables。
与SetEnv相关的PassEnv将执行相同的操作,而不是Apacheconfiguration文件中定义的键/值,它将来自Apacheinheritance的现有进程环境variables。
所以,这两个指令实际上都没有为在mod_wsgi下运行的WSGI应用程序设置一个进程范围的环境variables。 IOW,他们不会通过os.environ访问,因为你似乎想要的。
现在,对于PassEnv来说,如果你想要做的是让Apache进程环境variables也可以在mod_wsgi下的WSGI应用程序中使用,那么PassEnv实际上是多余的,因为Apache进程环境variables已经可用了。
这是因为在embedded式模式下,WSGI应用程序在Apachesubprocess中运行。 即使在守护进程模式下,守护进程也是Apache父进程的直接分支(没有任何独立应用程序的执行程序),所以在Apache内部也是有效的。
所以,不需要PassEnv,因为它们已经被设置。
要做到这一点,你只是在错误的地方做,因为Apache的init.d启动脚本不会获取全局用户loginconfiguration文件。
如果您使用的是Apache Software Foundation的Apache发行版,或者没有偏离Apache发行版的Apache发行版,则为Apache设置环境variables的正确位置位于与Apache可执行文件位于同一目录的“envvars”文件中。 在各种Linux发行版上,Apache安装程序完全忽略了这个文件,而是需要将它们与特定于系统的Apache init.d文件一起放在一些特殊的文件中。 你到底要做什么取决于Linux发行版。
正如我所说,Apache不会读取全局configuration文件。
在正确的位置做,技术上可以工作,但依靠设置影响整个Apache的环境variables将不会是我会build议。
你最好有一个WSGI脚本读取一个单独的configuration文件,它设置系统状态,然后基于这些东西。 为了达到这个目的,专门使用configuration文件并不像依赖于来自不是项目特定部分的文件的环境variables设置,而是Apache初始化脚本。