设置Apache2 PATH环境变量


13

如何PATH为Apache2 设置环境变量?我试过/usr/sbin/envvars在httpd.conf 中和中进行设置SetEnv PATH(并通过PassEnv将其传递给SSI),但它并没有带来成功。


1
需要更多信息。这取决于有问题的操作系统。Windows所做的事情与Un * xes有所不同。FreeBSD,RedHat和Ubuntu都在不同的文件中处理此问题。
Stefan Lasiewski 2011年

您说某些方法“不适用于PATH”。您需要向我们展示您如何对其进行测试。

Answers:


15

正如其他人所说,您可以通过使用环境变量文件来实现。我将在此答案中提供更多详细信息,并显示其有效的证明。

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

  1. 验证此envvars文件的位置。在Ubuntu上,/etc/init.d/apache2ctl显示其来源/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. 要查看变量,我使用了Perl printenv.cgi脚本,并在http://example.org/cgi-bin/printenv.cgi上提供了该脚本。该脚本向我显示了以下路径:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. 要更改这些变量,请编辑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。


确保重新启动 httpd-我尝试使用graceful,但这并未使更改生效。
Monica Cellio的抵制SE

在fedora 23上:«该文件不再用于为httpd进程配置其他环境变量。它已由systemd代替。» paste.debian.net/361218
Nemo,



1

确保已加载mod_env。

正确的语法是(示例):

SetEnv LD_LIBRARY_PATH /usr/local/lib

这对我有用。


它有效,但不适用于PATH
Matteo

您如何加载mod_env?由于它是内置的并且是静态编译的,因此默认情况下不会加载吗?
Chase T.

1

您可以在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
}

创建一个Perl脚本以列出所有环境变量:

#!/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

1

在具有Apache 2.4.x的RedHat上,--prefix=/usr --enable-layout=RedHat该文件是通过envvars文件从源代码编译的/usr/sbin/envvars。我可以确认在该文件中设置了适当的PATH后,Apache和PHP便意识到了这一点。

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


在fedora 23中,/usr/sbin/apachectl提到的/etc/sysconfig/httpd内容包含:«该文件不再用于为httpd进程配置其他环境变量。它已由systemd代替。» paste.debian.net/361218
Nemo,

1

使用任何喜欢的编辑器编辑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 OSX 10.11(EL Capitan)或更高版本,需要csrutil disable在重新启动并单击CMD + R后在Terminal中运行命令,然后才能编辑此文件。

重新启动Apache2

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

0

在我的Apache2系统上,我发现很多访问者只想掠夺我精心编译的表情符号/表情符号集合(严重!),因此我决定使用随机生成的符号链接到目录路径,该链接将作为Apache2变量,几乎不可能共享链接。

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

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

然后,在我的PHP页面的顶部,我将像这样读取变量,然后在页面的后面,将使用该变量来构建通往适当笑脸的路径:

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

为我工作,希望对您有所帮助!


它有效,但不适用于PATH
Matteo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.