Установка переменной окружения Apache2 PATH


13

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


1
Нужно больше информации. Это зависит от рассматриваемой ОС. Windows работает не так, как Un * xes. FreeBSD, RedHat и Ubuntu обрабатывают это в разных файлах.
Стефан Ласевский

Вы говорите, что некоторые подходы "не работают для PATH". Вы должны показать нам, как вы это тестируете.

Ответы:


15

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

Этот файл переменной среды должен быть источником 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. Измените ваш путь в этом файле. В этом примере я добавлю /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, и это не привело к изменениям вступили в силу.
бойкот SE для Моники Челлио

На fedora 23: «Этот файл больше не используется для настройки дополнительных переменных среды для процесса httpd. Он был заменен на systemd. » paste.debian.net/361218
Немо



1

Убедитесь, что вы загрузили mod_env.

Правильный синтаксис (пример):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Это сработало для меня.


Это работает, но не дляPATH
Маттео

Как вы загружаете mod_env? Разве он не загружается по умолчанию, поскольку он встроен и статически скомпилирован?
Погоня Т.

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

В 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.


Вместо этого в fedora 23 /usr/sbin/apachectlупоминается следующее /etc/sysconfig/httpd: «Этот файл больше не используется для настройки дополнительных переменных среды для процесса httpd. Он был заменен на systemd. » paste.debian.net/361218
Немо

1

Отредактируйте plist-файл Apache2 любым редактором, который вам нравится (например, с помощью 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, и тогда вы сможете редактировать этот файл.

Перезапустите Apache2

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

0

В моей системе 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">';

Работает на меня, и надеюсь, что это поможет вам!


Это работает, но не дляPATH
Маттео
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.