在启用Proxy_Protocol的情况下将NGINX流量代理到辅助代理

时间:2018-08-22 15:12:55

标签: nginx amazon-elb proxy-protocol

我正在尝试路由请求,以便那些需要websocket的请求将路由到一个长期存在的nginx进程,而所有其他请求都将转到处理所有其他流量的通用反向代理。这些nginx流程存在于我们的AWS云中,位于已配置为使用代理协议的ELB后面。请注意,所有这些操作都能在我们当前的设置中正常运行,该设置仅使用一个配置为使用proxy_protocol的nginx进程。

对此设置的更改如下:

处理所有入口的第一台nginx服务器使用proxy_protocol并将请求转发到本地的websocket或非websocket nginx服务器:

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";
}

当任何非websocket请求发送到localhost:8082时,我得到一个空答复。如果我从第一台服务器上删除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 个答案:

答案 0 :(得分:0)

结果是非websocket代理块不应设置各种代理和升级标头:

location / {
  proxy_pass http://localhost:8082;
  proxy_set_header Host $host;
}