Kubernetes с Symfony и PHP-FPM

Я прошу помощи с тем, что я считаю нетривиальным вопросом, который я пытаюсь решить уже несколько недель.

Недавно я обновил свой проект до Symfony 5.4. Однако после развертывания проекта в кластере Kubernetes php-fpm перестал работать в подах. Подробнее об этом процессе я писала здесь. Меня сразу отправили смотреть логи, конфиги и прочее, но я убедился, что с этим проблем нет. И вот почему:

Дело в том, что для воспроизведения проблемы ВСЕГДА(!) нужны два условия:

  1. Пакеты Symfony 5.4
  2. Удаленный кластер Kubernetes.

Во всех остальных случаях проблема НЕ(!) воспроизводится.

Это значит, что если я, находясь в кластере Kubernetes, откатываю пакеты до версии 4.4 и все работает нормально. С другой стороны, на моей локальной машине, где нет кластера Kubernetes, после обновления проекта до версии 5.4 php-fpm тоже работает нормально. Оба конфига одинаковые, версии php-fpm одинаковые. Все буквально идентично. Отсюда делаю вывод, что удаленные конфиги настроены правильно и принципиальной несовместимости пакетов Symfony с установленным fpm нет.

Я думал, что может не хватить ресурсов для запуска/обновления системы, но:

  1. Composer обновил проект на этапе сборки, но проблема возникает на этапе развертывания.
  2. Я не думаю, что кластер Kubernetes настолько загружен, что не может справиться с той простой задачей, с которой справится мой ноутбук.
  3. Нет никаких сигналов от Kubernetes, что не хватает памяти или чего-то еще. Кластер просто игнорирует запуск php-fpm без единого сообщения.

Итак, в чем может быть проблема?

УПД:

Я могу смотреть журналы модуля и видеть, как выполняется мой файл entrypoint, следующим образом:

  1. После выполнения всех миграций в файле журнала отображается запись [OK] Already at the latest version ("App\Migrations\Version20230427064413"). Из этого я делаю вывод, что миграции сработали успешно и не сломали мое приложение.

  2. Прогрев кеша прошел успешно, о чем свидетельствует строчка в логах [OK] Cache for the "prod" environment (debug=false) was successfully warmed.

  3. В точке входа, указанной здесь, я действительно не использую команду $ php-fpm --test, однако могу заверить вас, что я запускал команду с флагом -t и флагом --debug раньше, и ошибок не было. Журналы показывают NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful.

  4. Это моя проблема, да.

  5. Мой проект Symfony 4.4 работает на том же базовом образе php:8.0-fpm-alpine3.16 в точно такой же конфигурации пода Kubernetes, из чего я делаю вывод, что OPcache совместим с PHP версии 8.0. Однако для большей уверенности я закомментировал строчки ;opcache.preload=/var/www/app/var/cache/prod/srcCimple_KernelProdContainer.preload.php ;opcache.preload_user=www-data в своем php.ini и проблема не исчезла

УПД 2

  1. Я попытался распечатать код, который возвращает команда php-fpm -F. Результатом является 0, что указывает на успешное выполнение команды без ошибок.

  2. Что я и пытался сделать, я сначала отдельно обновляю рецепты, готовлю код и слежу за тем, чтобы на каждом шагу проект запускался. Проблема в том, что проект работает локально даже с полностью обновленным Symfony. Проблема с php-fpm возникает, как только я обновляю composer update "symfony/*" с 4.4 до 5.1 или выше. Или я должен попытаться обновить пакеты один за другим? Является ли это возможным ?

  3. Я оставил только одну строку в index.php - require dirname(__DIR__).'/vendor/autoload.php; и проблема осталась.

Мне удалось узнать больше информации об этой ошибке: в файле entrypoint есть строки

php-fpm -F &

nginx -g 'daemon off;' &

Итак, я закомментировал строку с nginx и обнаружил, что php-fpm в данном случае работает корректно. Следовательно, никаких проблем с PHP FPM как таковым нет, проблема в том, что команда nginx -g 'daemon off;' & каким-то образом блокирует мой fpm. Может ли это быть связано с новыми правилами для конфигурации nginx в Symfony 5.4?

Я создал новый вопрос.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Вы запускаете app:migrations:migrate, что может привести к сбою скрипта (это должно быть сделано в initContainer).

  2. Вы запускаете cache:warmup, что может привести к сбою скрипта.

  3. Вы не запускаете $ php-fpm --test, чтобы убедиться, что ваша конфигурация действительно действительна.

  4. Вы обновляете symfony, который может содержать ошибки, проявляющиеся только на облачном оборудовании.

  5. Вы используете JIT (OPcache), и он просто не работает (проблема 8.0, 8.1). Вы можете попробовать отключить расширение opcache.


Попробуйте подключиться к модулю и запустить проект через встроенный сервер php, а не через php-fpm, если он все еще не запускается, то попробуйте изменить версию php.

Большое спасибо за Ваш ответ. Пожалуйста, смотрите раздел UPD в моем вопросе.

Roman Zagday 06.05.2023 22:49

1. Попробуйте вывести код выхода из php-fpm -F

Фарид Ахмедов 07.05.2023 05:20

2. Попробуйте обновить symfony постепенно

Фарид Ахмедов 07.05.2023 05:21

3. Попробуйте другую среду выполнения. Модуль Nginx или Roadrunner

Фарид Ахмедов 07.05.2023 05:21

4. убедитесь, что ваш каталог «vendor» не кэшируется из предыдущих сборок

Фарид Ахмедов 07.05.2023 05:23

5. Попробуйте оставить в index.php только одну строчку, которая включает в себя vendor/autoload.php и подтвердите, что проблема осталась.

Фарид Ахмедов 07.05.2023 05:26

Спасибо за помощь, пожалуйста, смотрите раздел UPD 2.

Roman Zagday 08.05.2023 10:48
Ответ принят как подходящий

Проблема заключалась в том, что OPcache был настроен неправильно.

Однако при проверке следует быть осторожным. Когда мне сказали отключить JIT (OPcache), я просто закомментировал настройки в php.ini:

;opcache.preload=/var/www/app/var/cache/prod/srcCimple_KernelProdContainer.preload.php
;opcache.preload_user=www-data

Но этого недостаточно. Мне тоже пришлось переделывать проект.

Другие вопросы по теме