1. download websocket.js https://github.com/Clloz/network-note/blob/master/WebSocket/websocket.js
  2. yum install –y nodejs
  3. 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;

 }

}

 

 

 

 

 

 

实验结果:


Websocket搭建教程_html

Websocket搭建教程_客户端_02

或者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头是不会被反向代理服务器直接转发到后端服务的(这就是逐跳标头),后端服务获取不到这两个头信息自然也不会主动去切换协议。

因此,需要在反向代理服务器转发上游时带上客户端原来的请求头,才可以完成协议的升级或切换