当前位置 主页 > 服务器问题 > nginx问题汇总 >

    使用Nginx做WebSockets代理教程(2)

    栏目:nginx问题汇总 时间:2018-10-29 16:44

    复制代码 代码如下:
    sudo npm install ws

    注意:如果你得到了一个错误:“Error: failed to fetch from registry: ws” ,那么运行下面的命令应该能解决这个问题:
    复制代码 代码如下:
    sudo npm config set registry http://registry.npmjs.org/

    接下来,你可以再次运行 sudo npm install ws

    ws模块来自/root/node_modules/ws/bin/wscat,我们会为客户端使用它,但是我们需要创建一个程序来作为我们的服务器。将下面的代码保存到一个server.js文件中:
    复制代码 代码如下:
    console.log("Server started");
    var Msg = '';
    var WebSocketServer = require('ws').Server
        , wss = new WebSocketServer({port: 8010});
        wss.on('connection', function(ws) {
            ws.on('message', function(message) {
            console.log('Received from client: %s', message);
            ws.send('Server received from client: ' + message);
        });
     });

    这个程序可以通过下面的命令执行:
    复制代码 代码如下:
    node server.js

    该程序会输出一条初始化消息“Server started”,之后监听8010端口,等待客户端的连接。它会处理收到的所有请求,并且将接收到的消息输出在控制台,之后向客户端返回一条包含该消息的消息。我们希望Nginx去代理客户端的请求,可以通过下面的配置实现:
    复制代码 代码如下:
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    upstream websocket {
        server 192.168.100.10:8010;
    }
    server {
        listen 8020;
        location / {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
        }
    }

    上面的配置会使Nginx监听8020端口,并把任何接收到的请求转发给后端的WebSocket服务器,让后端服务器更好地处理WebSocket协议。我们可以使用wscat作为客户端来测试一下:
    复制代码 代码如下:
    /root/node_modules/ws/bin/wscat –connect ws://192.168.100.20:8020

    上面的命令会通过Nginx反向代理服务器和后端WebSocket服务器建立连接,你可以向服务器发送任意消息,然后服务器会返回一条消息。每当你在客户端发送一条消息,在后端服务器上能看到该消息的输出,之后在客户端会显示一条来自服务端的消息。
    这是一个交互示例:

    Server:

    Client:

    $ node server.js

     

    Server started

     

     

    wscat –connect ws://192.168.100.20:8020