我正在尝试路由请求,以便那些需要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
}
.
.
.
}
答案 0 :(得分:0)
结果是非websocket代理块不应设置各种代理和升级标头:
location / {
proxy_pass http://localhost:8082;
proxy_set_header Host $host;
}