Мое приложение Symfony аварийно завершает работу в производственной среде, потому что не может найти WebProfilerBundle, как мне заставить его работать?

У меня есть приложение, разработанное с помощью Symfony 5, которое отлично работает в моей локальной среде (Vagrant, работающий с Laravel Homestead box), но когда я развертываю его на живом сервере, оно вылетает с пустой белой страницей и отвечает 500 Internal Server Error.

Когда я подключаюсь к серверу по SSH и вручную меняю значение переменной APP_ENV на dev с prod внутри моего файла .env, я вижу ошибку:

Попытка загрузить класс WebProfilerBundle из пространства имен Symfony \ Bundle \ WebProfilerBundle. Вы забыли инструкцию использования для другого пространства имен?

введите описание изображения здесь

Я использую Github Actions для развертывания своего приложения, и в своем действии я устанавливаю такие зависимости PHP

  - name: Install dependencies
    run: |
      export APP_ENV=prod
      composer install --no-dev --optimize-autoloader

Поэтому я не хочу, чтобы на моем производственном сервере зависели только разработки, отсюда и флаг --no-dev, и, если я правильно понимаю, WebProfilerBundle используется для проверки запроса в процессе разработки, поэтому он имеет отступ для использования только в среде dev.

Почему Symfony считает, что нужно загрузить этот пакет? Кроме того, я должен был настроить свои пользовательские страницы ошибок для ошибок 404 и 500 (добавление файла bundles/TwigBundle/Exception/error.html.twig в папку templates), почему не отображается моя страница пользовательских ошибок? Почему у меня пустая белая страница?

Я подозреваю, что это что-то с тем, как я развертываю (поскольку он работает на моей локальной машине).

Я устал убирать флаги из установки композитора (так что просто запускал composer install как есть), но это также привело к ошибке.

Вы можете просмотреть мои действия по развертыванию здесь </ а>. Также вот ссылка на репозиторий.

Приложение должно работать в этом домене: https://thebedechkacase.com/

См. также:  Symfony 4 Doctrine не может подключиться к Docker MySQL

Взгляните на это? stackoverflow.com/questions/58593872/   —  person Cooty    schedule 23.09.2020

why isn't my custom error page shown? Просто предположение, но, скорее всего, потому, что эта ошибка возникает до загрузки вашей пользовательской логики страницы.   —  person Cooty    schedule 23.09.2020

Скорее всего, в вашем файле composer.json есть что-то в post-install-cmd, которое пытается использовать этот класс   —  person Cooty    schedule 23.09.2020

На ум приходят несколько вещей: Во-первых, вам очень важно знать, что полученная вами ошибка не имеет ничего общего с проблемой, с которой вы столкнулись. Вы устанавливаете приложение с флагом —no-dev, и поэтому профилировщик не устанавливается. Когда вы переключаетесь на dev env, он требуется, но еще не установлен, поэтому возникает ошибка. В вашем случае я предполагаю, что вы пропустили некоторые настройки перезаписи на своем сервере. Взгляните на это: symfony.com/doc/current/setup/web_server_configuration.html Сообщите мне, решит ли это вашу проблему   —  person Cooty    schedule 24.09.2020

@floGalen правильно объясняет, что вызывает это конкретное сообщение об ошибке. Если вы все еще застряли, подумайте о том, чтобы остаться в разработке, просто используя простую «установку композитора». Это может указать вам на настоящую проблему (проблемы) развертывания. Как только проблемы будут решены, вернитесь в исходный рабочий режим. Вы можете просто начать с проверки журналов вашего сервера.   —  person Cooty    schedule 24.09.2020

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Cooty

    Проверьте свой config/bundles.php и обязательно установите Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true]. Если я правильно понял, ваше приложение пытается загрузить класс, которого нет в композиторе. Также не забудьте очистить кеш на продукте (php bin/console cache:clear). Также убедитесь, что на вашем рабочем сервере нет .env.local файла (или APP_ENV также должен быть prod)

  2. Cooty

    И комментарий @floGalen, и ответ @Gordy указали мне в правильном направлении, так что спасибо за это. Но точный ответ пришел из чтения руководства Symfony по развертыванию.

    Если на этом этапе вы получаете сообщение об ошибке «класс не найден», вам может потребоваться выполнить export APP_ENV = prod (или export SYMFONY_ENV = prod, если вы не используете Symfony Flex) перед выполнением этой команды, чтобы команда post-install-cmd скрипты запускаются в среде prod.

    Поскольку я не использовал Symfony Flex, мне также нужно было установить для переменной SYMFONY_ENV значение prod.

    Вдобавок у меня был мой .env в репозитории, который на самом деле был только файлом с данными разработки и APP_ENV=dev, настоящий .env файл был создан во время процессов развертывания на раннере, получая его значение из секретного хранилища Github. Теперь дополнительная проблема заключалась в том, что я сначала проверил свой код в runner, затем запустил composer install, а затем создал рабочий .env (перезаписав тот, который был извлечен из репозитория), поэтому composer install фактически работал с настройками dev. Чтобы исправить это, я переместил создание моего файла env прямо перед запуском composer install --no-dev --optimize-autoloader, затем также сделал export SYMFONY_ENV=prod.

    Комбинация этих двух решила мою проблему!

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: