Прокси-трафик 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;
}