Docker-compose nginx не найден маршрут для ресурсов Symfony

В SO есть похожие вопросы, но не для этой конкретной проблемы.

Инструменты: docker-compose 1.21.2; symfony 3.4; nginx 1.10.3

У меня есть несколько несвязанных контейнеров («У каждого контейнера должно быть только одно беспокойство»). Все работает, кроме получения ресурсов приложения symfony (3.4) в браузере. Определенные маршруты работают, шаблоны отображаются правильно, проблема только в активах. Помимо использования той же настройки, но локального обслуживания на машине разработчика (без контейнеров), проблем нет.

С томами это сработало, но я хочу, чтобы они были в производстве, так как в документации указано https://docs.docker.com/compose/production/#modify-your-compose-file-for-production, изменение, которое вам может понадобиться:

  • Удаление любых привязок томов для кода приложения, чтобы код оставался внутри контейнера и не мог быть изменен извне

Факты:

  • В журналах контейнера nginx сообщается о 404 обращениях, но без ошибок.
  • Внутри контейнера php-symfony в журналах продуктов отображаются строки вроде request.ERROR: Uncaught .... NotFoundException for "GET /css/main.css" at ...RouterListener.php {"exception": ".../NotFoundHttpException(code: 0) ... ResourceNotFoundException"} []
  • Проверка разработчика в браузере http://<host>:<port>/app_dev.php/css/main.css nginx возвращает 404. (Я сделал среду разработки доступной извне)
  • Проверяя dev в браузере для маршрута, в примере http://<host>:<port>/app_dev.php/css появляется страница исключений Symfony Не найдено ни одного маршрута для "GET / css" с той же информацией ResourceNotFoundException > NotFoundHttpException
  • Изменение прав доступа к папке web в контейнере chmod -R a+rwx .../web не имеет значения.

Соответствующий раздел docker-compose.yml

version: "2"
services:
    site:
        ...
        working_dir:
            /var/www/html/site
    site_webserver:
        ...
        ports:
           - <port>:80
        depends_on:
           - site
        links:
           - site

Соответствующий раздел nginx.conf

server {
    listen 80;
    server_name "";
    root /var/www/html/site/web;

    location / {
        try_files $uri /app.php$is_args$args;
    }  

    location ~ ^.*/(app_dev|config)\.php(/|$) {
        fastcgi_pass lockate_site:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $document_root;
    }
}
Стоит ли изучать 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 и хотите разрабатывать...
2
0
1 406
3

Ответы 3

у вас должен быть существующий файл /var/www/html/site/web/css/main.css! У тебя есть это?

Конфигурация Nginx не должна передавать этот запрос /css/main.css в PHP-код. Он должен просто отправить существующий файл в браузер. Думаю, у вас есть этот файл, но по другому пути.

Вы должны исправить для него конфигурацию nginx или поместить файлы ресурсов в каталог / var / www / html / site / web /.

Ой! Может быть, вы забыли смонтировать каталог ресурсов в контейнер nginx?

Maxim Antonov 08.06.2018 11:51

Да, файл существует, «обслуживая локально на машине разработчика (без контейнеров), проблем нет.»; Зачем монтировать каталог ресурсов? (Удаление любых привязок томов для кода приложения, чтобы код оставался внутри контейнера и его нельзя было изменить извне docs.docker.com/compose/production/…)

Yercalamarino 08.06.2018 11:55

Можно сказать гораздо больше, но: активы были заблокированы в контейнере php-fpm (symfony).

В файле контейнера www.conf (в моем случае /usr/local/etc/php-fpm.d/www.conf) проверьте директиву security.limit_extensions и оставьте так

security.limit_extensions = 

Примечание: я обнаружил, что это прокомментировано следующим образом: ;security.limit_extensions = .php .php3 .php4 .php5

Ваша основная проблема в том, что nginx ищет файлы ресурсов в контейнере nginx. После установки ваших ресурсов с помощью (app / console assets: install) они будут скопированы в ваш контейнер php (symfony). Вы должны связать активы между контейнерами. На это есть ответ: https://stackoverflow.com/a/44284993/6279901

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