PHP на сервере Linux, PHP-FPM (версия уточняется)

PHP на сервере: PHP не видит переменную окружения при запуске через FPM

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

PHP-FPM по умолчанию очищает часть переменных окружения перед запуском обработчиков, когда используется clear_env=yes. Поэтому getenv() в веб-приложении может вернуть false, хотя в интерактивном SSH или cron переменная есть. Решение — явно передать только нужные значения и не раскрыть секреты посетителям.

В этой статье
  1. Что происходит и когда применима инструкция
  2. Причины и диагностические признаки
  3. Подробная пошаговая инструкция
  4. Как проверить, что проблема исправлена
  5. Если не помогло — дальнейшая диагностика и откат

#Что происходит и когда применима инструкция

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.

#Подробная пошаговая инструкция

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

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. Проверьте изменение только внутри нужного приложенияПовторите закрытую проверку getenv() и убедитесь в результате «есть». Проверьте работу ровно того функционала, которому нужен параметр, например исходящий запрос к собственному API в тестовом режиме; не выводите и не передавайте значения.
  1. Если всё ещё false, проверьте имя и окружение службыРегистр имени переменной важен; также проверьте, действительно ли systemd-сервис получил переменную, а сайт использует выбранный пул. При Fastpanel и специальных сборках PHP настройки могут храниться вне стандартных /etc/php, поэтому используйте предусмотренный интерфейс.

#Как проверить, что проблема исправлена

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

#Если не помогло — дальнейшая диагностика и откат

Если значение есть в терминале, но нет в FPM, причина обычно в разном окружении служб или в clear_env; не копируйте секрет в общедоступный файл .env в корне сайта.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.