Коммуникация контейнеров Docker через Nginx
Имеется фронт и бэк завернутый в докер, nuxt.js и laravel соотвественно.
В docker-compose.yml описаны nginx, nuxt.js, laravel
Nginx конфиг в docker-compose выглядит следующим образом
nginx:
image: 'nginx:1.19.6-alpine'
restart: always
container_name: '${DOCKER_PREFIX}_nginx'
ports:
- '${NGINX_HOST_HTTP_PORT}:80'
- '${NGINX_HOST_HTTPS_PORT}:443'
environment:
- APP_SERVER_DOMAIN=${APP_SERVER_DOMAIN}
- APP_CLIENT_DOMAIN=${APP_CLIENT_DOMAIN}
volumes:
- './src:/var/www'
- './.docker/nginx/nginx.conf:/etc/nginx/nginx.conf'
- './.docker/nginx/templates:/etc/nginx/templates'
- './.docker/nginx/log:/var/log/nginx'
depends_on:
- laravel
- nuxt
networks:
- application
И два шаблона:
- для laravel - server.conf.template
- для nuxt.js - client.conf.template
Вот их содержимое:
server.conf.template
server {
listen 80;
server_name ${APP_SERVER_DOMAIN};
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location / {
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_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://nginx:8080;
}
}
server {
listen 8080;
server_name _;
root /var/www/server/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass laravel:9000;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 600;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location /.well-known/acme-challenge/ {
root /var/www/server/letsencrypt/;
log_not_found off;
}
error_log /var/log/nginx/app_error.log;
access_log /var/log/nginx/app_access.log;
}
client.conf.template
map $sent_http_content_type $expires {
"text/html" epoch;
"text/html; charset=utf-8" epoch;
default off;
}
server {
listen 80;
server_name ${APP_CLIENT_DOMAIN};
root /var/www/client;
charset utf-8;
gzip on;
gzip_types text/plain application/xml text/css application/javascript;
gzip_min_length 1000;
location / {
expires $expires;
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://nuxt:3000;
}
}
Теперь по вводным, APP_CLIENT_DOMAIN - наш главный домен, конечный для пользователя, для примера возьмем project.local, APP_SERVER_DOMAIN - это поддомен project.local на котором крутится сервер, для примера server.project.local
Окей, что имеем, пользователь приходит на project.local и nginx отдает nuxt.js, в свою очередь, наксту нужные некие данные из сервера, так как он лежит на локальной машине, он не знает про существование домена server.project.local, но знает про контейнер nginx, где мы открыли внутренний порт 8080, по которомy лежит наш laravel.
Для того, чтоб по апи забрать данные, мы указываем nuxt`у, что наш сервер лежит по урле http://nginx:8080 он стучиться и получает, что ему нужно.
Общение между контейнерами настроено, но мне кажется, что у меня получилась какая то кривая реализация, возможно есть решение красивее или правильнее?
Спасибо.