Здравствуйте.
Есть три контейнера:
- Node.js — фронтовое приложение на Vue.js, собранное с помощью Webpack (+ Express.js сервер для SSR и HMR)
- Nginx — веб-сервер, при открытии "/" проксирует запросы на Node.js, а "/api/" на PHP-FPM
- PHP-FPM — API на Symfony
Вопроса три:
- Как лучше настроить, чтобы все файлы из папки /assets/uploads контейнера php-fpm отдавались не через PHP, а через Nginx, а все остальные через PHP?
- И как лучше настроить, чтобы все файлы из папки /dist контейнера nodejs, чьи расширения равны: js, css и png, отдавались тоже через Nginx, а не Node.js?
- Сейчас содержимое backend приложения получают в качестве volumes два контейнера: php-fpm и nginx, т.е. по сути происходит дублирование (или я ошибаюсь?) не только php файлов, но и содержимого /assets/uploads, которое содержит сотни тысяч файлов (изображения и видео)
Как можно это обойти? Как грамотно настроить volumes?
Или проблема в неправильной логике между приложениями?
docker-compose.yml:
version: "3.5"
services:
nodejs:
container_name: nodejs
build:
context: .
dockerfile: docker/nodejs/Dockerfile
volumes:
- ./front:/app
ports:
- "3000:3000"
networks:
- test-network
php-fpm:
container_name: php-fpm
build:
context: .
dockerfile: docker/php-fpm/Dockerfile
volumes:
- ./back:/app
networks:
- test-network
nginx:
container_name: nginx
build:
context: .
dockerfile: docker/nginx/Dockerfile
volumes:
- ./back:/app
ports:
- "80:80"
depends_on:
- nodejs
- php-fpm
networks:
- test-network
networks:
test-network:
name: test-network
driver: bridge
nginx.config:
events {}
http {
include /etc/nginx/mime.types;
server {
listen 80;
server_name test.work;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 1m;
proxy_connect_timeout 1m;
proxy_pass http://nodejs:3000;
}
location /api/ {
rewrite ^/api/(.*)$ /$1 break;
include fastcgi_params;
fastcgi_param REQUEST_URI $document_uri;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param SCRIPT_FILENAME /app/web/index.php;
fastcgi_pass php-fpm:9000;
}
location /uploads {
root /app/web;
try_files $uri =404;
}
}
}
nginx/Dockerfile:
FROM node:lts-alpine
WORKDIR /app
COPY ./front/package*.json ./
RUN npm config set registry http://registry.npmjs.org/ && npm install && \
npm i webpack -g && \
npm i webpack-cli -g && \
npm i webpack-hot-middleware -g && \
npm i cross-env -g
COPY ./front ./app
EXPOSE 3000
CMD ["npm", "run", "server"]
------------
Если есть какие-то советы по оптимизации и улучшению всего этого - пожалуйста, делитесь, только развиваюсь в настройке серверов, поэтому буду рад любым замечаниям и тем более помощи!
Спасибо.