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

Установите переменные среды, специфичные для Apache, в Windows

Я использовал Apache в Ubuntu в прошлом. Eсть envvars файл содержит переменные среды, используемые службой Apache. Я не могу найти такой файл для Windows.

Я нашел два подхода, чтобы справиться с этим. Я обнаружил, что Apache читает переменные среды Windows. Но мне это не нравится, поскольку они глобальны, а не зависят от приложения.

Другой вариант, который я нашел, - это создание файла .bat, установка переменных env и запуск httpd.exe. Но проблема в том, что он не работает с Apache Service.

Другой вариант, который я нашел, - использовать nssm. Это позволяет создавать настраиваемые службы с переменными среды, специфичными для службы. Но я получаю AH00141: Could not initialize random number generator ошибка, если я его использую.

Есть ли другой альтернативный вариант, который я могу использовать?

Вы можете использовать директиву SetEnv в Apache для настройки собственных переменных среды, специфичных для вашего приложения.

Подробнее здесь https://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv Вы можете поместить эти значения в свой виртуальный хост или httpd.conf

В итоге я написал обертку, которая заменила httpd.exe. Я переименовал httpd.exe к httpd2.exe и использовал эту обертку httpd.sh выполнить это. Он в основном временно устанавливает переменные системной среды перед запуском службы apache. Как только служба запущена, она их удаляет.

#!/bin/bash

PHP_INI_SCAN_DIR="C:\Server\PHP\7.0\conf;C:\Server\Config\PHP"

if [ "stop" == "$*" ]; then
    exec /c/Server/Apache/bin/httpd2.exe -k stop
elif [ "" == "$*" ]; then
    export PHP_INI_SCAN_DIR
    echo "Starting Apache in console mode"
    /c/Server/Apache/bin/httpd2.exe
elif [ "start" == "$*" ]; then
    /bin/regtool set "/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment/PHP_INI_SCAN_DIR" "$PHP_INI_SCAN_DIR" -s
    /c/Server/Apache/bin/httpd2.exe -k start
    /bin/regtool unset "/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment/PHP_INI_SCAN_DIR"  
elif [ "restart" == "$*" ]; then
    #/bin/regtool set "/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment/PHP_INI_SCAN_DIR" "$PHP_INI_SCAN_DIR" -s
    #/c/Server/Apache/bin/httpd2.exe -k stop
    #/c/Server/Apache/bin/httpd2.exe -k start
    #/bin/regtool unset "/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment/PHP_INI_SCAN_DIR"
    /c/Server/Apache/bin/httpd2.exe -k restart # ENV don't reload this way :(
else
    /c/Server/Apache/bin/httpd2.exe "$*"
fi