PassEnv没有findENVvariables

我有这个/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环境中
  • 把东西放在其他configuration文件中

把东西放到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安装程序完全忽略了这个文件,而是需要将它们与特定于系统的Ap​​ache init.d文件一起放在一些特殊的文件中。 你到底要做什么取决于Linux发行版。

正如我所说,Apache不会读取全局configuration文件。

在正确的位置做,技术上可以工作,但依靠设置影响整个Apache的环境variables将不会是我会build议。

你最好有一个WSGI脚本读取一个单独的configuration文件,它设置系统状态,然后基于这些东西。 为了达到这个目的,专门使用configuration文件并不像依赖于来自不是项目特定部分的文件的环境variables设置,而是Apache初始化脚本。