Прокси-сервер Nginx к внешним API — 502 Bad Gateway

avatar
user61092
1 июля 2021 в 18:02
431
0
1

Проблема: у меня установлен обратный прокси-сервер nginx на сервере ubuntu только с частным IP-адресом. Целью этого обратного прокси-сервера является маршрутизация входящего запроса к различным сторонним веб-сокетам и RestAPI. Кроме того, для распределения нагрузки у меня есть http loadbalancer, сидящий за прокси-сервером nginx.

Так вот как это выглядит технически:
IncomingRequest --> InternalLoadBalancer(Port:80) --> NginxReverseProxyServer(80) --> ThirdParyAPIs(Port:443) & WebSockets(443)

Проблема заключается в том, что Nginx неправильно выполняет reverse_proxy для RestAPI и выдает ошибку 502, но успешно работает с веб-сокетами.
Ниже приведен мой файл конфигурации /etc/nginx/sites-available/default: (в других местах никаких изменений не делалось)

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}
server {
  listen 80;
  location /binance-ws/ {
      # Web Socket Connection
      ####################### THIS WORKS FINE
      proxy_pass https://stream.binance.com:9443/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_set_header Host $host;
  }
  location /binance-api/ {
      # Rest API Connection
      ##################### THIS FAILS WITH 502 ERROR
      proxy_pass https://api.binance.com/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_set_header Host $host;
  }  
} 

Я даже пытался добавить https://api.binance.com:443/, но безуспешно.

Подключение через веб-сокет работает нормально:
wscat -c ws://LOADBALANCER-DNS/binance-ws/ws/btcusdt@aggTrade

Однако следующий вариант не работает:
curl http://LOADBALANCER-DNS/binance-api/api/v3/time

Когда я вижу журналы nginx для ошибки 502, я вижу следующее:
[error] 14339#14339: *20 SSL_do_handshake() failed (SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number) while SSL handshaking to upstream, client: 10.5.2.187, server: , request: "GET /binance-api/api/v3/time HTTP/1.1", upstream: "https://52.84.150.34:443/api/v3/time", host: "internal-prod-nginx-proxy-xxxxxx.xxxxx.elb.amazonaws.com"

Это реальный вызов RestAPI, который я пытаюсь смоделировать из nginx:
curl https://api.binance.com/api/v3/time

Я просмотрел много почти похожих сообщений, но не смог найти, что/где я иду не так. Ценю твою помощь!

Источник

Ответы (0)