- download websocket.js https://github.com/Clloz/network-note/blob/master/WebSocket/websocket.js
- yum install –y nodejs
- node websocket.js
nginx做反向代理,后端为IIS。8090为IIS服务端口
ws.html为iis中的一个页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket</title>
</head>
<body>
<h1>Echo Test</h1>
<input type="text" id="sendTxt">
<button id="sendBtn">send</button>
<div id="recv"></div>
<script type="text/javascript">
var websocket = new WebSocket("ws://192.168.1.32:3000/");
websocket.onopen = function(){
console.log("websocket open");
document.getElementById("recv").innerHTML = "Connected";
}
websocket.inclose = function(){
console.log('websocket close');
}
websocket.onmessage = function(e){
console.log(e.data);
document.getElementById("recv").innerHTML = e.data;
}
document.getElementById("sendBtn").onclick = function(){
var txt = document.getElementById("sendTxt").value;
websocket.send(txt);
}
</script>
</body>
</html>
##############################
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 192.168.1.17:8090;###xin6 iis server
keepalive 1000;
}
server {
listen 8020;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
}
}
实验结果:
或者nginx直接作为web容器, ws.html直接放“/usr/share/nginx/html”目录下
###map指令的作用:
根据客户端请求中$ http_upgrade 的值,来构造改变$ connection_upgrade的值
即根据变量$ http_upgrade的值创建新的变量$ connection_upgrade,
创建的规则就是{}里面的东西。其中的规则没有做匹配,因此使用默认的.
即$connection_upgrade的值会一直是upgrade。然后如果$http_upgrade为空字符串的话,那值会是close。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
}
为什么要显示指定升级头?
上面提到了反向代理和逐跳标头,客户端发起请求时是和反向代理服务器建立请求,此时客户端携带的Upgrade、Connection头是不会被反向代理服务器直接转发到后端服务的(这就是逐跳标头),后端服务获取不到这两个头信息自然也不会主动去切换协议。
因此,需要在反向代理服务器转发上游时带上客户端原来的请求头,才可以完成协议的升级或切换