你如何设置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/httpd或apachectl等)中设置此信息。 不过,如果可能的话,我认为最好保留独立的启动脚本。 最好的地方是在指定的环境variables脚本中。
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
要查看这些variables,我正在使用一个Perl printenv.cgi脚本 ,并在http://example.org/cgi-bin/printenv.cgi上提供它。 该脚本向我显示以下path:
PATH = /usr/local/bin:/usr/bin:/bin
要更改这些variables,我编辑envvars文件:
$ sudo vim /etc/apache2/envvars
在这个文件中修改你的PATH。 在这个例子中,我将把/opt/local/bin附加到我的PATH中。 在某些情况下,您可能需要使用export PATH ,而不仅仅是PATH :
export PATH=$PATH:/opt/local/bin
重新启动Apache
$ sudo service apache2 restart * Restarting web server apache2 ... waiting ...done. $
在http://example.org/cgi-bin/printenv.cgi上查看结果,现在显示PATH现在包含一个新的元素:
PATH = /usr/local/bin:/usr/bin:/bin:/opt/local/bin
如果上述不起作用,可能会发生不寻常的事情。 也许你的脚本忽略或覆盖PATH。
在2.2上,不能使用Setenv来设置PATH环境variables。
在我的系统上是/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">';
为我工作,并希望它可以帮助你!