0

我正在尝试路由请求,以便那些需要 websockets 的请求将路由到一个长期存在的 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
}

.
.
.


}
4

1 回答 1

0

原来非 websocket 代理块不应该设置各种代理和升级标头:

location / {
  proxy_pass http://localhost:8082;
  proxy_set_header Host $host;
}
于 2018-08-22T19:29:13.737 回答