Как можно установить 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
, и т.д.). Однако я думаю, что лучше оставить скрипты запуска, если это возможно. Лучшее место - в назначенном скрипте переменных среды.
Проверьте расположение этого файла 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
Для просмотра переменных я использую Perl-скрипт printenv.cgi, и сделал его доступным по адресу http://example.org/cgi-bin/printenv.cgi . Скрипт показывает мне следующий ПУТЬ:
PATH = /usr/local/bin:/usr/bin:/bin
Чтобы изменить эти переменные, я редактирую файл envvars:
$ sudo vim /etc/apache2/envvars
Измените свой PATH в этом файле. В этом примере я добавлю /opt/local/bin
к моему ПУТЬ. В некоторых случаях может потребоваться 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 переменную среды PATH нельзя установить с помощью 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">';
У меня работает, надеюсь, вам поможет!