Nano Hash - криптовалюты, майнинг, программирование

Будет ли работать проверка работоспособности Nginx, когда восходящие серверы снова будут проксироваться?

У меня есть следующая настройка Nginx:


# nginx load balancer
upstream web_app {
    server localhost:7021; # nginx1
    server localhost:7031; # nginx2
}

server {
  listen 7777 ssl;
  server_name localhost 0.0.0.0;;

  client_max_body_size 25m;
  gzip on;
  gzip_vary on;
  gzip_min_length 10240;
  gzip_proxied expired no-cache no-store private auth;
  gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
  gzip_disable "MSIE [1-6]\.";

 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             $http_host;

    proxy_pass https://web_app;
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
    proxy_connect_timeout 600s;
    send_timeout 600s;
  }

}



# nginx1
server {
  listen 7021 ssl;
  server_name localhost 0.0.0.0;


  client_max_body_size 25m;
  gzip on;
  gzip_vary on;
  gzip_min_length 10240;
  gzip_proxied expired no-cache no-store private auth;
  gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
  gzip_disable "MSIE [1-6]\.";

  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_pass http://localhost:7001; # process1
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
    proxy_connect_timeout 600s;
    send_timeout 600s;
  }
}


# nginx2
server {
  listen 7031 ssl;
  server_name localhost 0.0.0.0;


  client_max_body_size 25m;
  gzip on;
  gzip_vary on;
  gzip_min_length 10240;
  gzip_proxied expired no-cache no-store private auth;
  gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
  gzip_disable "MSIE [1-6]\.";

  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             $http_host;

    proxy_pass http://localhost:7011; # process2
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
    proxy_connect_timeout 600s;
    send_timeout 600s;
  }
}

Балансировщик нагрузки имеет восходящую группу, которая снова является процессами Nginx. Каждый процесс Nginx проксирует процесс приложения.

                   Nginx Load Balancer
                           /     \
                          /       \
                       Nginx1   Nginx2
                         |         |
                       Process1   Process2

Проблема здесь в том, что даже когда один из процессов не запущен, балансировщик нагрузки отправляет запросы на этот вышестоящий сервер, вызывая проблемы. Я предполагаю, что это происходит, поскольку проверка работоспособности Nginx выполняет проверки только для непосредственно вышестоящего сервера, а не для каких-либо прокси.

т. е. если процесс2 остановлен, балансировщик нагрузки проверяет только работоспособность процесса Nginx на локальном хосте: 7031, а не какие-либо прокси с локального хоста: 7031.

Я хочу, чтобы проверка работоспособности выполнялась на уровне процесса приложения, т.е. @ localhost: 7001 и localhost: 7011.


Ответы:


1

Разобрался с вопросом. Проверка работоспособности не происходила, как я ожидал, поскольку в моем случае процесс приложения возвращал 502.

Мне пришлось установить proxy_next_upstream error timeout http_502 для обработки 502

https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

Финальная конфа Nginx LB

# nginx load balancer
upstream web_app {
    server localhost:7021; # nginx1
    server localhost:7031; # nginx2
}

server {
  listen 7777 ssl;
  server_name localhost 0.0.0.0;;

  client_max_body_size 25m;
  gzip on;
  gzip_vary on;
  gzip_min_length 10240;
  gzip_proxied expired no-cache no-store private auth;
  gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/javascript application/xml;
  gzip_disable "MSIE [1-6]\.";

 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             $http_host;

    proxy_pass https://web_app;
    proxy_next_upstream error timeout http_502;
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
    proxy_connect_timeout 600s;
    send_timeout 600s;
  }

}
11.01.2021
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..