Почему nginx не перераспределяет нагрузку при отключении одного из бекэндов?

Добрый день, у меня вопрос по настройки балансировки на nginx. Мне нужно было сделать балансировщик на nginx, который распределяет нагрузку между бекэндами (nginx + rails). Столкнулся с проблемой, что при отключении одного из бекэндов nginx не перераспределяет нагрузку, т.е. нагрузка на оставшихся бекэндах остается та же, а RPS на балансировщике падает. Балансировщик пытается каждый раз слать запросы на упавший сервер. Никак не могу понять в чем проблема.
Вот конфиг балансировщика:
upstream backend {
  server 10.132.0.2 max_fails=1 fail_timeout=30s;
  server 10.142.0.4 max_fails=1 fail_timeout=30s;
  server 10.142.0.5 max_fails=1 fail_timeout=30s;
  server 10.142.0.6 max_fails=1 fail_timeout=30s;
}

server {
  listen 80;
  server_name 0.0.0.0;
  root /app/public;
  allow all;

  location /nginx_status {
    stub_status;
  }

  location /assets/ {
    error_page 404 = @store;
    expires max;
  }

  location @store {
    proxy_store on;
    proxy_store_access user:rw group:rw all:r;
    proxy_pass http://backend;
    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 http;
    proxy_set_header Host $http_host;
  }

  location / {
    proxy_pass http://backend;
    proxy_next_upstream error timeout invalid_header http_502;
    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 http;
    proxy_set_header Host $http_host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_redirect off;
  }
}

График RPS на балансировщике (синий) и бекэндах (красный), отключается желтый бекэнд (на нем RPS сразу падает до 0, на графике ошибка).
5acf3917823ac967174166.png
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
@MrKrot Автор вопроса
Как я понял, на бекендах нужно было поправить конфиги: увеличить количество воркеров и выставить multi_accept on;. Сейчас все нормально работает.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@awesomer
использовать Traefik
он заточен именно на то, чтобы быстро отлавливать появление/исчезнование бэкендов и быстро их переключать
Ответ написан
Комментировать
Гляньте в логи. Куда что происходит с запросами которые вы потеряли.
Как вариант - возможно что у вас бекенд не обрабатывает запросы, но принимает новые. Или что-то подобное. Тогда нужно потюнить таймауты на проксях.

Ну ни пропали же у вас запросы с фронта? Для ответа нужно узнать их судьбу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы