Nginx 转发 Websocket
今天介绍两种通过http_header分流某V姓软件的Websocket协议的方法:
通过定义两个server分流
只需要在原来配置文件的基础上在底部再添加一个server
块,同样监听在443端口,同样地,也共用前者的证书来认证,第一处不同就是在第二者的server
块内的server_name
处填写自定义的Host
值,通过此值来分流;第二处不同就是需要将传入到后端的数据的Host值改回正常值,以保证连接成功。
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
,客户端只要填入非域名的任何域名都可以被分流;对配置文件的改动也是最小的。
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;
}