我正在尝试路由请求,以便那些需要 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
}
.
.
.
}