Nginx通过http_header分流Websocket

Nginx 转发 Websocket

今天介绍两种通过http_header分流某V姓软件的Websocket协议的方法:

通过定义两个server分流

只需要在原来配置文件的基础上在底部再添加一个server块,同样监听在443端口,同样地,也共用前者的证书来认证,第一处不同就是在第二者的server块内的server_name处填写自定义的Host值,通过此值来分流;第二处不同就是需要将传入到后端的数据的Host值改回正常值,以保证连接成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server{
listen 443;
server_name "伪装域名";
ssl on;
ssl_certificate /etc/v2ray/v2ray.crt;
ssl_certificate_key /etc/v2ray/v2ray.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
proxy_redirect off;
proxy_pass http://127.0.0.10000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host "真实域名";
proxy_intercept_errors on;
limit_rate 0;
}
}

通过条件语句进行分流

这种方式比上一种要更加灵活,上一种方式不仅需要手动填入用于伪装的server_name,客户端只要填入非域名的任何域名都可以被分流;对配置文件的改动也是最小的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
location / {
if ( $http_host != $server_name ){
proxy_pass http://127.0.0.1:10000;
}
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $server_name;
root /data/www;
index index.html;
}