Назад | Перейти на главную страницу

Установка переменной среды Apache2 PATH

Как можно установить PATH переменная окружения для Apache2? Я пробовал установить это в /usr/sbin/envvars и в httpd.conf с SetEnv PATH (и передавая его SSI с помощью PassEnv), но это просто не распространяется.

Как говорили другие, вы делаете это с помощью файла переменных среды. Я предоставлю более подробную информацию в этом ответе и покажу доказательства того, что это работает.

Этот файл переменных среды должен быть источником apachectl. На моем компьютере с Ubuntu этот файл находится по адресу /etc/apache2/envvars. На RedHat это по адресу /etc/sysconfig/httpd. В FreeBSD это установлено в /etc/rc.conf (Думаю). В качестве альтернативы вы также можете указать эту информацию в сценарии запуска (/etc/init.d/httpd или apachectl, и т.д.). Однако я думаю, что лучше оставить скрипты запуска, если это возможно. Лучшее место - в назначенном скрипте переменных среды.

  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 к моему ПУТЬ. В некоторых случаях может потребоваться 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 переменную среды PATH нельзя установить с помощью Setenv.

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
}

Создайте сценарий 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

В RedHat с Apache 2.4.x скомпилирован из исходников с --prefix=/usr --enable-layout=RedHat файл envvars находится по адресу /usr/sbin/envvars. Я могу подтвердить, что установка соответствующего PATH в этом файле делает так, чтобы Apache и PHP знали об этом.

Я использовал тот же подход, что и Стефан Ласевски, чтобы определить это. Для Apache 2.4.12, то /usr/sbin/envvars файл находится в строке 49 /usr/sbin/apachectl.

Отредактируйте файл 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>

NB: для Mac OSX 10.11 (EL Capitan) или выше вам необходимо запустить команду csrutil disable в Терминале после перезагрузки и нажатия CMD + R, и тогда вы сможете редактировать этот файл.

Перезагрузите Apache2

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

В моей системе Apache2 я обнаружил, что многие посетители хотели только разграбить мою тщательно подобранную коллекцию смайлов / смайлов (серьезно!), Поэтому я решил использовать случайно сгенерированную символическую ссылку на путь к каталогу, который будет выбран как Переменная Apache2, и делиться ссылками было практически невозможно.

Итак, каждые 30 минут cron запускал Perl-скрипт, который перезаписывал файл .htaccess и включал SetEnv, как вы можете видеть ниже:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Затем в верхней части моих PHP-страниц я читал переменную вот так, а позже на странице эта переменная использовалась для построения пути к подходящему смайлу:

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

У меня работает, надеюсь, вам поможет!