Прокси-трафик NGINX на вторичный прокси с включенным Proxy_Protocol

Я пытаюсь перенаправить запросы так, чтобы те, кому требуются веб-сокеты, направлялись в долгоживущий процесс nginx, а все остальные переходили на общий обратный прокси-сервер, который обрабатывает весь остальной трафик. Эти процессы nginx существуют в нашем облаке AWS за ELB, который был настроен на использование протокола Proxy. Обратите внимание, что все это правильно работает с нашей текущей установкой, которая использует только один процесс nginx, настроенный для использования proxy_protocol.

Изменение в этой настройке заключается в следующем:

Первый сервер nginx, обрабатывающий все входы, использует proxy_protocol и локально пересылает запросы на серверы nginx websocket или не websocket:

server {
listen 8080 proxy_protocol;
real_ip_header proxy_protocol;
charset utf-8;
client_max_body_size 20M;

#send to websocket process
location /client {   
  proxy_pass http://localhost:8084;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Real-IP $proxy_protocol_addr;
  proxy_set_header X-NginX-Proxy true;
  proxy_set_header X-Proxy-Scheme $scheme;
  proxy_set_header X-Proxy-Port $proxy_port;
  proxy_set_header X-ELB-Proxy-Scheme "https";
  proxy_set_header X-ELB-Proxy-Port "443";

  # Always support web socket connection upgrades
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
}

#send to non-websocket process
location / {
      proxy_pass http://localhost:8082;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Real-IP $proxy_protocol_addr;
      proxy_set_header X-NginX-Proxy true;
      proxy_set_header X-Proxy-Scheme $scheme;
      proxy_set_header X-Proxy-Port $proxy_port;
      proxy_set_header X-ELB-Proxy-Scheme "https";
      proxy_set_header X-ELB-Proxy-Port "443";

      # Always support web socket connection upgrades
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
}

Когда на localhost:8082 отправляется любой запрос без websocket, я получаю пустой ответ. Если я удалю proxy_protocol с первого сервера, я получу ответ, как и ожидалось. Очевидно, мне нужен proxy_protocol для поддержки входа из нашего ELB, поэтому удаление его не вариант. Тем не менее, я хотел бы знать, какие части мне не хватает, чтобы правильно маршрутизировать трафик - и я также хотел бы знать, почему проксирование запроса локально с сервера с включенным proxy_protocol на другой процесс nginx (независимо от того, использует ли этот второй процесс proxy_protocol или нет) выходит из строя.

Для справки, базовая конфигурация этого вторичного процесса nginx приведена ниже:

upstream console {
   server localhost:3000 max_fails=3 fail_timeout=60 weight=1;
}

server {
listen 8082;
client_max_body_size 20M;

location /console {
 proxy_pass http://console
}

.
.
.


}

1 ответ

Оказывается, блок прокси, не являющийся websocket, не должен устанавливать различные заголовки прокси и обновления:

location / {
  proxy_pass http://localhost:8082;
  proxy_set_header Host $host;
}
Другие вопросы по тегам