#Что происходит и когда применима инструкция
PHP-FPM по умолчанию очищает часть переменных окружения перед запуском обработчиков, когда используется clear_env=yes. Поэтому getenv() в веб-приложении может вернуть false, хотя в интерактивном SSH или cron переменная есть. Решение — явно передать только нужные значения и не раскрыть секреты посетителям.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Переменная существует только в интерактивной оболочкеПеременная существует только в интерактивной оболочке. В SSH echo значение есть, веб-запрос его не получает. | В SSH echo значение есть, веб-запрос его не получает. | Отделить окружение shell от systemd/FPM. |
| clear_env удаляет непереданные значенияclear_env удаляет непереданные значения. В pool.d clear_env=yes и отсутствует env[NAME]. | В pool.d clear_env=yes и отсутствует env[NAME]. | Явно задать нужную переменную в конфигурации пула. |
| Переменная задана не для того экземпляраПеременная задана не для того экземпляра. Системная служба и сайт используют разные версии/pool.d. | Системная служба и сайт используют разные версии/pool.d. | Найти реальный пул через listen. |
#Подробная пошаговая инструкция
- Проверьте отсутствие переменной, не печатая секретВ локальном тестовом маршруте, доступном только администратору, используйте getenv("APP_SETTING") !== false и выводите только «есть/нет». Не отображайте сам ключ API, пароль, токен или содержимое $_ENV через публичный phpinfo.
- Сверьте реальный пул и его настройкиПо конфигурации виртуального хоста найдите fastcgi_pass (или Apache proxy:fcgi), затем в pool.d найдите такой же listen. Обратите внимание на clear_env: при значении yes доступно только явно переданное окружение; при no оно может включать лишние секреты — не отключайте эту защиту ради одной переменной.
- Дополнительная команда по темеLinux · Терминал (Bash)КомандаНужен sudoSSH, администратор, читает настройку; вывод env может содержать секретные имена и значения. Не публикуйте его и не сохраняйте в доступный каталог.
sudo grep -R -nE "^\s*(\[|listen\s*=|clear_env\s*=|env\[)" /etc/php/*/fpm/pool.d/*.conf
- Установите источник значения, понятный системной службеПеременная, заданная в ~/.bashrc вашего SSH-пользователя, не становится автоматически частью окружения systemd. Если значение задаётся через EnvironmentFile службы или секреты контейнера, проверьте документацию своей установки и права доступа, не выводя сам секрет в терминал.
- Передайте строго указанную переменную в пулПосле копии pool.d используйте правило env[APP_SETTING] = $APP_SETTING, если переменная действительно присутствует в окружении управляющего процесса FPM, либо разрешённую администратором схему хранения секрета. Пример env[PATH] = /usr/local/bin:/usr/bin:/bin годится для несекретного пути, но не заменяет безопасный менеджер секретов.
- Не допускайте попадания секрета в журналы и веб-ответыЗначение из env[...] может попасть в аварийные дампы, вывод phpinfo или логи при неосторожной диагностике. Проверьте, что файл с секретами закрыт для обычных пользователей, а сайт не печатает переменную в шаблон. Не делайте clear_env=no только ради передачи всего окружения.
- SSH, администратор, пример PHP 8.2Linux · Терминал (Bash)С осторожностьюНужен sudoSSH, администратор, пример PHP 8.2. Изменения применяются после успешного теста; если переменная хранится в окружении самой службы, понадобится корректная процедура её обновления.
sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpmКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Проверьте изменение только внутри нужного приложенияПовторите закрытую проверку getenv() и убедитесь в результате «есть». Проверьте работу ровно того функционала, которому нужен параметр, например исходящий запрос к собственному API в тестовом режиме; не выводите и не передавайте значения.
- Если всё ещё false, проверьте имя и окружение службыРегистр имени переменной важен; также проверьте, действительно ли systemd-сервис получил переменную, а сайт использует выбранный пул. При Fastpanel и специальных сборках PHP настройки могут храниться вне стандартных /etc/php, поэтому используйте предусмотренный интерфейс.
#Как проверить, что проблема исправлена
Внутри нужного FPM-пула наличие переменной подтверждается без раскрытия значения, зависимая функция приложения работает, другие сайты не получили доступ к секрету.
#Если не помогло — дальнейшая диагностика и откат
Если значение есть в терминале, но нет в FPM, причина обычно в разном окружении служб или в clear_env; не копируйте секрет в общедоступный файл .env в корне сайта.