#php #laravel #docker #nginx
#php #laravel #docker #nginx
Вопрос:
Я использую NGINX, PHP-FPM и DB в отдельном контейнере.
Внутри 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.