NPM как балансировщик

Многие из новичков используют NPM из-за его GUI, удобства и простоты использования.

Но настроить балансировщик в GUI NPM.. мягко говоря не очень понятная и прозрачная задача..

Чуть позже я расскажу “как?” и главное “зачем?” это может пригодиться дома..

Ну а тем временем - делитесь своим опытом и примерами реализаци.

ОБНОВЛЕНО:

Ролик вышел на канале
А тут ниже добавлена инстркция

2 лайка

Я расписывал про свой опыт тут. Начал городить такую схему в том числе по причине неудобства точечной настройки NPM через веб интерфейс (по сути, приходится просто прописывать свой конфиг nginx в Advanced, который будет игнорировать то, что прописано в Details, но об этом вы сами все узнаете в следующем видео от @admin

Кстати, по поводу балансировки, не знаю, будет ли в видео описано и умеет ли NPM из коробки, но очень полезно включить липкие печеньки/sticky cookie для ряда сервисов, иначе round robin балансировка может только повредить (у меня были проблемы с consul и консолью в pve)

P.S.
В ближайшие дни обновлю свою схему (ссылка выше) т.к. добавил и успешно работает authentication proxy by authentik тоже в кластерном исполнении

1 лайк

И так, краткая сопроводительная справка к видео:

  1. Зачем нужен балансировщик?
нажмите, чтобы развернуть детали

Случаев, вариантов и причин применения может быть множество.
В домашнем самохостинге - я бы говорил о тех случаях, когда:

  • Вам критична отказоустойчивость сервиса. Например, чтобы Ваш основной DNS сервер, блокировщик рекламы, сервис хранения паролей - дублировался.
  • Нагрузка на одной физической машине критически высока, нужно ее распределеить на несколько серверов.
  1. Как настроить балансировку в NPM
нажмите, чтобы развернуть детали

2.1 создать папку mkdir /data/nginx/custom/ в lxc или docker контейнере
2.2 создать файл конфигурации для баналсировщика: НАЗВАНИЕ.conf
например nano http.conf или nano balancer1.conf
содержащий адрес-порт серверов для балансировки:

upstream backend1 {
 server ip:port weight=1;
 server ip2:port2 weight=10;
}

где

  • weight - это вес для балансировки. в этом примере лишь каждый 10 запрос будет уходить на второй сервер
  • backend1 - название для апстрима, не привязанное к названию файла конфигурации, но может быть идентичным

2.3 Добавить блок #Custom в nano /etc/nginx/conf/nginx.conf
указав, что конфигруации nginx нужно смотреть на созданный Вами файл
/data/custom/balancer1.conf

include /data/nginx/custom/balancer1[.]conf;

2.4 В веб панели npm добавить proxy host


где

  • loadtest.lan - ваш целевой ресурс, требующий балансировки
  • balancerovshik - любое название латиницей(не влияет ни на что), порт любой

вкладка Advanced

location / {
add_header       X-Served-By $host;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto  $scheme;
proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP          $remote_addr;
proxy_pass       http://balancer1;
}

где balancer1 это название апстрима, которое вы указали в файле конфигурации балансировки.

  1. Дополнительные материалы по видео
нажмите, чтобы развернуть детали

3.1 Вместо реальных сервисов исользовались демо nginx-hello контейнеры

services:
  nginx-hello:
    image: nginxdemos/hello
    ports:
      - 80:80

3.2 NPM можно равернуть:
- как LXC контейнер в Proxmox VE
- как docker app

  1. Полезные статьи по данной тематике:
нажмите, чтобы развернуть детали

4.1 How to load balance your servers using Nginx Proxy Manager and Cloudflare - Silicon's blog
4.2 NGINX as sticky balancer for HA using cookies
4.3 Как настроить Nginx в качестве балансировщика нагрузки / Хабр

2 лайка

Какое же это убожество, конечно. Чуть в сторону и все, все удобство от использования NPM теряется.

Это была одна из причин ухода с NPM на traefik не смотря на минусы самого traefik по сравнению с nginx.

---
loadBalancer:
  serversTransport: insecure-backend@file
  sticky:
    cookie:
      name: traefik_sticky_cookie
      httpOnly: true
      secure: true
      sameSite: "Lax"

  healthCheck:
    path: /
    interval: 10s
    timeout: 3s

  servers:
    - url: https://pve-01.lan:8006
      weight: 1
    - url: https://pve-02.lan:8006
      weight: 2
    - url: https://pve-03.lan:8006
      weight: 1
    - url: https://pve-04.lan:8006
      weight: 1

А еще traefik умеет healh check с извлечением неактивных бекендов из очереди запросов + отображение статуса каждого бекенда

Nginx же будет пытаться долбиться в неработающий сервер как не в себя, angie в этом плане уже прилично подтянули

1 лайк

Как бы странно не звучало в теме про NPM, но он хорош ровно под те простые задачи для которых он автором был написан.

А если во время обеда пришел аппетит..
пора изучать инструменты мощнее и не то, чтобы сильно сложнее, когда мы говорим о yaml конфиграции(как выше) VS набора conf файлов.. просто иные

Но тут каждый сделает выбор сам.

PS
спасибо, что поделился примером настройки в альтернативном варианте

Ну вот я его рекомендую новичкам усиленно, кому не надо 100500 вариантов сложной конфигурации + он сам получает LE сертификаты, а на моей практике еще ни разу новичок не настроил связку docker + nginx + certbot с первой попытки

Спасибо за видео, в единичных случаях проще один раз подпилить NPM, чем переезжать на другое решение.

А еще в NPM давно не было каких-то значительных изменений, продукт явно достиг своего предела в развитии.

1 лайк

Решение не для всех и применяется точечно.

  • TTL приходится снижать минимально. При этом перед каждым подключением будет уходить запрос на сервер (у меня дома и без этого более 1.5 млн запросов в сутки), что повышает латентность и нагрузку на сервер
  • Работает в рамках одного сегмента сети, с учетом кеширующих DNS серверов время реакции порядка 5 минут является очень хорошим
  • DNS сервер тоже надо дублировать т.к. он становится бутылочным горлышком т.к. см. пункт 1
  • Редко применяется за пределами service discovery

Ну и если брать только браузер, то можно иметь 2 DNS записи и браузер будет перебирать все значения пока не получится открыть страницу