设置Apache2 PATH环境variables

你如何设置Apache2的PATH环境variables? 我已经尝试使用SetEnv SetEnv PATH将其设置在/usr/sbin/envvars和httpd.conf中(并将它传递给SSI和PassEnv),但是它不会被携带。

正如其他人所说,你通过使用环境variables文件来做到这一点。 我会在这个答案中提供更多的细节,并certificate它的工作。

这个环境variables文件必须来自apachectl 。 在我的Ubuntu上,这个文件位于/etc/apache2/envvars 。 在RedHat上,这是在/etc/sysconfig/httpd 。 在FreeBSD上,这是在/etc/rc.conf设置的(我想)。 或者,您也可以在启动脚本( /etc/init.d/httpdapachectl等)中设置此信息。 不过,如果可能的话,我认为最好保留独立的启动脚本。 最好的地方是在指定的环境variables脚本中。

  1. validation这个envvars文件的位置。 在Ubuntu上, /etc/apache2/envvars /etc/init.d/apache2ctl /etc/apache2/envvars显示它来源/etc/apache2/envvars

     # the path to the environment variable file test -z "$APACHE_ENVVARS" && APACHE_ENVVARS='/etc/apache2/envvars' # pick up any necessary environment variables if test -f $APACHE_ENVVARS; then . $APACHE_ENVVARS fi 
  2. 要查看这些variables,我正在使用一个Perl printenv.cgi脚本 ,并在http://example.org/cgi-bin/printenv.cgi上提供它。 该脚本向我显示以下path:

     PATH = /usr/local/bin:/usr/bin:/bin 
  3. 要更改这些variables,我编辑envvars文件:

     $ sudo vim /etc/apache2/envvars 
  4. 在这个文件中修改你的PATH。 在这个例子中,我将把/opt/local/bin附加到我的PATH中。 在某些情况下,您可能需要使用export PATH ,而不仅仅是PATH

     export PATH=$PATH:/opt/local/bin 
  5. 重新启动Apache

     $ sudo service apache2 restart * Restarting web server apache2 ... waiting ...done. $ 
  6. http://example.org/cgi-bin/printenv.cgi上查看结果,现在显示PATH现在包含一个新的元素:

     PATH = /usr/local/bin:/usr/bin:/bin:/opt/local/bin 

如果上述不起作用,可能会发生不寻常的事情。 也许你的脚本忽略或覆盖PATH。

在2.2上,不能使用Setenv来设置PATH环境variables。

http://httpd.apache.org/docs/2.2/mod/mod_env.html#setenv

在我的系统上是/etc/apache2/envvars

确保你已经加载了mod_env。

正确的语法是(示例):

 SetEnv LD_LIBRARY_PATH /usr/local/lib 

这对我有效。

您可以在初始化脚本的start()函数中设置它,如下所示:

 start() { echo -n $"Starting $prog: " check13 || exit 1 export PATH=${PATH}:/var/ossec/bin LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } 

创build一个Perl脚本来列出所有的环境variables:

 #!/usr/bin/perl -wT print "Content-type: text/html\n\n"; foreach $key (sort keys(%ENV)) { print "$key = $ENV{$key}<p>"; } 

把它放到/var/www/cgi-bin ,然后检查http://domain.com/cgi-bin/env.cgi ,你会看到下面的内容:

 PATH = /sbin:/usr/sbin:/bin:/usr/bin:/var/ossec/bin 

在RedHat的Apache 2.4.x上编译源代码--prefix=/usr --enable-layout=RedHat envvars文件位于/usr/sbin/envvars 。 我可以确认在该文件中设置适当的PATH使Apache和PHP知道它。

我使用了与Stefan Lasiewski相同的方法来确定这一点。 对于Apache 2.4.12/usr/sbin/envvars文件来自/usr/sbin/apachectl第49行。

用你喜欢的任何编辑器编辑Apache2 plist文件(使用vim的示例):

 $ sudo vim /System/Library/LaunchDaemons/org.apache.httpd.plist 

将以下内容添加到plist文件中:

 <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string> </dict> 

如果EnvironmentVariables键已经存在,只需添加

 <key>PATH</key> <string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string> 

<dict>

注意:对于Mac OS X 10.11(EL Capitan)或更高版本,在重新启动CMD + R后,需要在terminal中运行命令csrutil disable ,然后才能编辑该文件。

重新启动Apache2

 $ sudo /usr/sbin/apachectl stop $ sudo /usr/sbin/apachectl start 

在我的Apache2系统上,我发现很多访问者只想掠夺精心编辑的表情符号集合(认真!),所以我决定使用一个随机生成的符号链接到目录path, Apache2variables,实际上不可能共享链接。

所以,每隔30分钟,cron运行一个perl脚本来重写.htaccess文件,并包含一个SetEnv,如下所示:

 .... SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ" 

然后,在我的PHP页面的顶部,我会像这样读取variables,稍后在页面中将会有该variables用于构build适当的笑脸的path:

 $SMILEYDIR = apache_getenv("SMILEYDIR"); .... .... echo '<img src="/'.$SMILEYDIR.'//SMILEY_yay!.gif" border="0" hspace="3">'; 

为我工作,并希望它可以帮助你!