Перейти к содержанию

nginx

Для работы веб части за nginx нужно настроить как сам nginx, так и веб приложения

[09.03.2021] Требуется актуализация, т.к. Let's Encrypt уже не используется.

Базовая настройка nginx

В каталоге /etc/nginx/site-available под каждый сайт создается свой файл. Ниже пример default, в котором всякая всячина:

server {
    listen        80;
    server_name   devsharp.siisltd.ru;

    # LetsEnscrypt
    include acme;
}

server {
    listen        443 ssl http2;
    server_name   devsharp.siisltd.ru;

    client_max_body_size 250m;

    include snippets/ssl.conf;

    # Dummy WebAPI
    location /dummy/api/ {
        proxy_pass         http://127.0.0.1:56154/api/;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

    # Dummy WebAPI swagger
    location /dummy/api/swagger/ {
        proxy_pass         http://127.0.0.1:56154/swagger/;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Важно добавлять include acme; для поддержки проверки сертификатов.

Важно в proxy_pass в конце добавлять /, чтобы убирался location. Также нужно обязательно устанавливаться заголовки X-Forwarded-For и X-Forwarded-Proto.

Конфиги для rc и dev окружения находятся в этой директории.

Чтобы активировать сайт, нужно создать symlink на файл конфигурации сайта и поместить его в каталог sites-enaibled и выполнить systemctl reload nginx.

Для настройки https используется letsencrypt и бот для автоматического продлодления сертификатов certbot (инструкция тут).

Команда для обновления сертификатов во всех доменах:

sudo certbot certonly -d devsharp.siisltd.ru -d devdo.survey-studio.com -d devapi.survey-studio.com -d rcdo.survey-studio.com -d rcapi.survey-studio.com -d devdex1.survey-studio.com -d devdex2.survey-studio.com -d rcdex1.survey-studio.com -d rcdex2.survey-studio.com -d devwsu.survey-studio.com -d rcwsu.survey-studio.com --expand

Балансировка нагрузки

nginx - это не только proxy сервер, но и балансировщик нагрузки.

Ниже приведени пример настройки nginx с балансировкой для WebData (приведен полный кофниг с комментариями):

# Web Data (dev)

## тут нет ничего интересно по балансировки
server {
    listen        80;
    server_name   devdo.survey-studio.com;

    autoindex off;

    include /etc/nginx/global.d/*.conf;

    location ~ /\.ht {
        deny all;
    }

    access_log /var/log/nginx/devdo-ss/access;
    error_log /var/log/nginx/devdo-ss/error error;

    location / {
            return 301 https://$host$request_uri;
    }
}

# определяем список node нашего кластера и то, как распределяются запросы
upstream webdata_hosts {
   # запросы будут распределяеться по хэшу IP (используются первые 3 октета IP)
   ip_hash; 
   # еще есть:
   # - round-robin: тут все банально
   # - least_conn: отдаем тому, у кого меньше соединений 
   # - random: великий рандом  
   # - hash: можно определить свой алгоритм хэшировния на основе чего-либб
   # В платной версии есть:
   # - least_time: отдаем тому, у кого время отклика меньше и меньше соединений
   # - также есть в платной версии есть sticky - позволяет закрепить пользователя за конкретным сервером 
   # (например, если мы используем random, но нам важно, чтобы запросу от пользователя шли на один и тот же сервер)
   server 127.0.0.1:6785; # node0
   server 127.0.0.1:6786; # node1

   # если нам надо перезагрузить сервер, но не нарушать сильно распределение, то надо перед остановкой сервера добавить 
   # в конфиг команду down, чтобы запросы от остановленного сервера шли по другим сервакам, но старые запросы шли к старым сервакам
}

server {
    listen        443 ssl http2;    
    listen [::]:443 ssl http2;

    server_name   devdo.survey-studio.com;
    autoindex off;


    access_log /var/log/nginx/devdo-ss/access;
    error_log /var/log/nginx/devdo-ss/error error;

    client_max_body_size 250m;

    include /etc/nginx/snippets/ssl_common.conf;
    include /etc/nginx/snippets/ssl_surveystudio.conf;
    include /etc/nginx/global.d/*.conf; 



    location / {
        proxy_pass         http://webdata_hosts; # вот тут указываем группу серверов
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;

        # а вот тут указываем, в каких случаях нужно попробовать отправить запрос на следующий сервер
        # по умолчанию выставляется error и timeout, можно указат свои (ссылки на примеры ниже)
        proxy_next_upstream error timeout http_502;

        fastcgi_send_timeout 300s;
        fastcgi_read_timeout 300s;
    }
}

Подробнее почитать можно тут: