Я пытаюсь настроить php webapp с помощью докера. Идея состоит в том, чтобы запустить приложение, используя php-fpm
в автономном контейнере и иметь другой контейнер, который будет запускать nginx. Идея этой настройки состоит в том, чтобы использовать тот же контейнер nginx для прокси-запросов к другим веб-приложениям, которые уже работают на той же машине. Проблема в том, что я не могу получить nginx
для правильной обработки статических файлов (js, css и т. д.), поскольку запросы к ним продолжают поступать fpm
.
Вот как выглядит файловая система:
/
├── Makefile
├── config
│ └── webapp.config
└── webapp
└── web
├── index.php
└── static.js
Я управляю всем этим, используя Makefile
это выглядит так (не интересует docker-compose
для этого):
PWD:=$(shell pwd)
CONFIG:='/config'
WEBAPP:='/webapp'
run: | run-network run-webapp run-nginx
run-network:
docker network create internal-net
run-webapp:
docker run --rm \
--name=webapp \
--net=internal-net \
--volume=$(PWD)$(WEBAPP):/var/www/webapp:ro \
-p 9000:9000 \
php:5.6.22-fpm-alpine
run-nginx:
docker run --rm \
--name=nginx \
--net=internal-net \
--volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
-p 80:80 \
nginx:1.11.0-alpine
Это то, что у меня config/webapp.conf
выглядит как.
server {
listen 80;
server_name webapp.domain.com;
# This is where the index.php file is located in the webapp container
# This folder will contain an index.php file and some static files that should be accessed directly
root /var/www/webapp/web;
location / {
try_files $uri $uri/ @webapp;
}
location @webapp {
rewrite ^(.*)$ /index.php$1 last;
}
location ~ ^/index\.php(/|$) {
include fastcgi_params;
fastcgi_pass webapp:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
Любое действие, которое нужно обработать с помощью этого index.php
файл будет работать. Однако статические файлы не будут обслуживаться, что приведет к неприятным 404
ошибки (поскольку в php webapp на самом деле не настроены маршруты для них). Я считаю, что nginx пытается загрузить их из своей файловой системы контейнера, когда они фактически находятся в webapp
контейнер, возвращаясь в @webapp
.
Есть ли способ настроить nginx
для обслуживания тех файлов, которые находятся в другом контейнере?
Мне удалось решить проблему, установив webapp
объем в nginx
контейнер. Это то, что run-nginx
работа выглядит сейчас:
run-nginx:
docker run --rm \
--name=nginx \
--net=internal-net \
--volume=$(PWD)$(CONFIG)/webapp.conf:/etc/nginx/conf.d/webapp.domain.com.conf:ro \
--volume=$(PWD)$(WEBAPP)/web:/var/www/webapp/web:ro \
-p 80:80 \
nginx:1.11.0-alpine
И это webapp.conf
файл, который попытается загрузить статические файлы из контейнера и, если это невозможно, проксирует запрос на fpm
рабочий:
server {
listen 80;
server_name webapp.domain.com;
root /var/www/webapp/web;
location ~ \.(js|css|png) {
try_files $uri $uri/;
}
location / {
rewrite ^(.*)$ /index.php$1 last;
}
location ~ ^/index\.php(/|$) {
include fastcgi_params;
fastcgi_pass webapp:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
Однако я хотел бы знать, есть ли лучший способ сделать это вместо того, чтобы делить один и тот же том дважды. Большое спасибо!
У меня есть два предложенных варианта: первый - поместить ваши статические активы, например. / static и проинструктируйте nginx вызвать для них другую серверную службу. Шаги:
1) Обновите свои веб-сайты, чтобы они указывали на / static / * для любых статических ресурсов, например /styles.css становится /static/styles.css
2) Поместите свои активы в отдельный контейнер, обслуживаемый, возможно, другим nginx (чтобы вы могли повторно использовать контейнер для нескольких сайтов)
3) Отредактируйте nginx.conf, чтобы отправлять все запросы в / static / * в новый контейнер:
location /static/ {
proxy_pass http://static-container;
}
Второй вариант - просто переместить ваши статические ресурсы в CDN, поэтому вам просто нужно обновить свой веб-сайт, чтобы загружать каждый статический ресурс с внешнего URL-адреса (https: //cdnwebsite/asdsadasda/styles.css вместо /styles.css или /static/styles.css)
Второй вариант имеет несколько преимуществ по сравнению с другими, в основном в отношении производительности. CDN будет обслуживать их быстрее, и вы также работаете над ограничение одновременного подключения браузер может использовать каждое полное доменное имя, поэтому ваша страница может загружаться быстрее из-за большего количества одновременных подключений, используемых для загрузки вашего сайта.
Возможно, этого можно было бы достичь, используя NFS
Один докер-контейнер с NFS может быть создан там, где находится код, который может быть связан с контейнерами, на которых запущены nginx и php. Файлы будут храниться только в одном контейнере. Это также может обеспечить еще один уровень изоляции.