#1232: Конфигурация с несколькими балансировщиками

Отредактирована: 110 дней назад

Симптомы

Необходимо настроить две и более витрины, которые будут находиться в разных географических точках и с разными доменными именами, которые будут ходить в один и тот же инстанс Swarmica. Как это сделать?

Решение

В данной статье приводится решение для двух внешних балансировщиков nginx, по аналогии можно применять решение и для другого количества и типов балансировщиков.

Подготовка Swarmica

1. В файле /root/swarmica/.env добавьте адреса балансировщиков в переменную DJANGO_ALLOWED_HOSTS:

DJANGO_ALLOWED_HOSTS=my.swarmica.tld,balancer1.swarmica.tld,balancer2.swarmica.tld

2. В файле /root/swarmica/docker-compose.yml везде, где используется директива Host, добавьте адреса балансировщиков, например, так:

services:

  frontend:
    image: reg.gl.swd.im/swarmica/frontend:${SW_FRONTEND_VERSION}
    depends_on:
      - django
    restart: always
    volumes:
      - ./robots.txt:/robots.txt:ro
      - swarmica_static:/admin_static:ro
      - swarmica_ugc:/attachments:ro
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nginx.entrypoints=web-secure"
      - "traefik.http.routers.nginx.rule=Host(`${SW_HOSTNAME}`) || Host(`balancer1.swarmica.tld`) || Host(`balancer2.swarmica.tld`)"
      - "traefik.http.routers.nginx.tls.certresolver=letsencrypt"
      - "traefik.http.routers.nginx.middlewares=secure-headers,compression"
      - "traefik.http.routers.nginx.priority=10"

Как правило, это необходимо сделать для сервисов frontend, django, django-websocket, helpcenter.

3. Перезагрузите сервисы:

sudo su -
cd /root/swarmica
docker compose down
docker compose up -d

Настройки балансировщиков (nginx)

1. Предварительно, установите и настройте nginx на каждом балансировщике

2. Получите SSL сертификаты для доменных имен и добавьте их в конфигурацию nginx

3. В директиве server сайта (виртуального хоста), который отвечает за обслуживание доменного имени балансировщика, замените секцию, отвечающую за location /, так, чтобы получилась такая конфигурация:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        listen 443 ssl;
        server_name balancer1.swarmica.tld;

        ssl_certificate /etc/nginx/ssl/balancer1.swarmica.tld.crt;
        ssl_certificate_key /etc/nginx/ssl/balancer1.swarmica.tld.key;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                proxy_pass              https://my.swarmica.tld;
                proxy_set_header        Host    $host;
                proxy_set_header        X-Forwarded-For $remote_addr;
                add_header              X-Upstream      $upstream_addr;
        }
}

4. Перезагрузите nginx

invoke-rc.d nginx restart

5. Если необходимо использование различных брендов, то в балансировщики можно добавить указание бренда через заголовок:

proxy_set_header     X-Swarmica-Brand: UID