Контейнер Docker — NGINX перенаправляется в контейнер PHP-FPM

#php #laravel #docker #nginx

#php #laravel #docker #nginx

Вопрос:

Я использую NGINX, PHP-FPM и DB в отдельном контейнере.

Docker

Внутри PHP-FPM монтируется проект Laravel с моего локального компьютера.

Я успешно переслал запрос PHP в контейнер PHP-FPM (порт 9000) при доступе к 127.0.0.1: 8000. К сожалению, запросы с расширением ресурсов (например, .css, .js) столкнулись с 403 запрещенными.

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

Ниже приведен мой сценарий настройки NGINX.

 server {
    listen 80;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ .php$ {
        fastcgi_pass fpm:9000;
        fastcgi_param SCRIPT_FILENAME /app/public$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~* .(css|js|gif|ico|jpeg|jpg|png)$ {
        fastcgi_pass fpm:9000;
        fastcgi_param SCRIPT_FILENAME /app/public$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}
  

Заголовок запроса и ответа для файла app.css.
введите описание изображения здесь
введите описание изображения здесь

Не уверен, сталкивался ли кто-нибудь с подобными проблемами и есть ли у него решение для этого?

Комментарии:

1. Можете ли вы добавить скриншот с полным списком заголовков ответов для любого из этих 403 запросов?

2. @IvanShatsky добавлен согласно запросу.

Ответ №1:

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

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

Итак, здесь у вас есть 2 решения

Решение 1. сопоставьте исходный код вашего проекта с контейнером, в котором вы используете Nginx, вот так:

 # docker-compose.yml

webserver:
    image: nginx:1.17-alpine
    restart: unless-stopped
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www/html
  

Делая это, Nginx может легко находить ваши статические файлы и обслуживать их. Обратите внимание, что /var/www/html это ваш корневой путь к проекту, который вы определили в своем конфигурационном файле Nginx. Например, конфигурационный файл Nginx для проекта Laravel обычно выглядит так:

 server {
    listen 80;
    index index.php index.html;

    root /var/www/html/public;
    ...
  

Решение 2. добавьте .css, .js в файл конфигурации процесса PHP-FPM, с помощью этого решения вы переопределите файл конфигурации PHP-FPM и добавите свои статические файлы в список расширений файлов, разрешенных PHP-FPM. Проверьте мою демонстрацию здесь. Это решение не потребует от вас сопоставления вашего проекта с контейнером Nginx. Но на самом деле это не подходит для производства, как решение 1

Комментарии:

1. Рабочее решение для этого 🙂 Единственным недостатком этого является необходимость определения всех расширений, которые требуются от вашего веб-сервера. Будет еще лучше, если он сможет выполнять автоматическую пересылку для content-type.