我正在尝试路由请求,以便那些需要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
}
.
.
.
}
事实证明,非 websocket 代理块不应该设置各种代理和升级标头:
location / {
proxy_pass http://localhost:8082;
proxy_set_header Host $host;
}