我得到一个项目,其中外部websocket反向代理由nginx流实现。
但是,steam 仅意味着“TCP”,并且它失去了 http 功能,例如在路由中单独写入 IP。
SSL 加密外层配置如下:
stream{
upstream mysvr {
server 10.3.3.7:1111;
}
server {
listen 3331;
ssl_preread on;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass mysvr;
}
......
该proxy_set_header
子句必须被注释掉,因为 nginx 不允许在这里使用它:
"proxy_set_header" directive is not allowed here
以下是10.3.3.7机器上的nginx配置:
http{
server {
listen 1111 ssl;
server_name localhost;
ssl_certificate /etc/nginx/cert/server.crt;
ssl_certificate_key /etc/nginx/cert/server.key;
ssl_session_timeout 5m;
ssl_verify_client off;
location / {
proxy_pass http://10.3.3.5:8888;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
......
因此,我尝试将第一个外部反向代理重写为 http 1.1 类型,即真正的 websocket 代理,而不是 TCP 或“流”连接。我将所有内容从括号中移出stream
并放入http
括号中,并删除之前的注释proxy_set_header
,最后在第二个内部反向代理的末尾添加三个 websocket 特定子句:
http {
upstream mysvr {
server 10.3.3.7:1111;
}
server {
listen 3331;
ssl_preread on;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass mysvr;
}
......
但这次 nginx 抛出一个错误:[emerg] "ssl_preread" directive is not allowed
因此冲突是:
在steam下我无法使用proxy_set_header
;而在http 1.1下我无法使用ssl_preread
。
但它们都是此场景中的重要特征:
真正的后端服务器需要知道真正的客户端的 IP,因此需要将外部服务器的 IP 标记到标头中;外部代理服务器被禁止读取透明流量,但允许内部反向代理使用 SSL 对其进行解码。因此,真正的后端 10.3.3.5 和内部反向代理 10.3.3.7 之间的流量是透明的,而从内部反向代理通过外部反向代理到客户端的流量由内部反向代理上的 nginx 使用相同的 SSL 进行编码。
附加功能是,真实后端 10.3.3.5 通过 10.3.3.7 内部反向代理进行路由,而内部反向代理通过外部反向代理进行路由。因此,代理 VPN 和反向代理路由是一致的。
在这种设置下,有没有办法同时实现这2个功能?谢谢阅读。