Коммуникация контейнеров 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

И два шаблона:

  1. для laravel - server.conf.template
  2. для 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 он стучиться и получает, что ему нужно.

Общение между контейнерами настроено, но мне кажется, что у меня получилась какая то кривая реализация, возможно есть решение красивее или правильнее?

Спасибо.


Ответы (0 шт):