丽江热线网欢迎您:) | RSS源

centos安装配置websocket ws/wss可公网运行的不坑教程

已有 273 次阅读2017-7-31 14:48 |个人分类:技术文档

网上有许多资料,但可能因年代久远,或未充分进行运营级的测试,有的连范例都跑不通。现将实测可行方案提供如下:
一、安装node。
思路:通过官方网站,下载最新稳定版的node.js和npm--解压--复制到/usr/local/src--软链到/usr/local/bin以便调用。
打开官方下载地址:https://nodejs.org/en/download/
建议下载已编译好的版本,如Linux Binaries (x86/x64)
1、wget --no-check-certificate https://nodejs.org/dist/v6.11.1/node-v6.11.1-linux-x64.tar.xz
2、解压(共两步)
2.1 xz -d ./node-v6.11.1-linux-x64.tar.xz
2.2 tar -xvf ./node-v6.11.1-linux-x64.tar
3、复制到/usr/local/src
cp -r  ./node-v6.11.1-linux-x64 /usr/local/src
4、为系统建议软链,以便在任何地方调用node和npm命令
ln -s  /usr/local/src/node-v6.11.1-linux-x64/bin/node  /usr/local/bin/npm
ln -s  /usr/local/src/node-v6.11.1-linux-x64/bin/npm  /usr/local/bin/npm
二、安装和布署websocket
1、cd /home/soft/node
2、npm ws -g
3、vi index.js  -- i 输入:
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ port: 3000 });
wss.on('connection', function (ws) {
    console.log('client connected');
    ws.on('message', function (message) {
        console.log(message);
    });
});
按esc -- : --ZZ保存(vi命令请网上查找)
4、运行node index.js不报错+另开一个远程SSH,netstat -an查看,3000端口正在监听,即为正常。
如何开机启动、后台运行,请网上查找。
三、布署到外网。
通过nginx代理本地node服务。模式和nginx通过代理php-fpm的9000端口为php提供服务是一样的。
注意:经测试,如果在CDN加速的域名下布署wss,无法正常代理。
1、释义
ws:即普通的websocket服务
wss:即启用了ssl加密的websocket服务。
如在https页面使用webwocket,必须以wss调用。可按具体情况选用。nginx安装方法略。
2、nginx配置方法:
通用配置:在http区加入以下配置:
#node websocket
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream websocket {
server 127.0.0.1:3000;
}
2.1ws配置
本配置前端调用地址为ws://domain.com/io
    server {
        listen       80;
        server_name  domain.com;
#如本主机下没有其他服务,可直接location /,不必 /io
location /io {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_read_timeout 28800;
}
#以下与nginx普通网站配置相同,如根目录、默认首页等,对于websocket来说不是必需的。
    }
2.2 wss配置
本配置前端调用地址为wss://domain.com
ssl证书申请方法略。
server {
        listen 443;
        server_name domain.com; #填写绑定证书的域名
        ssl on;
        ssl_certificate /usr/local/nginx/sc/1_domain.com_bundle.crt;
        ssl_certificate_key /usr/local/nginx/sc/2_domain.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
        ssl_prefer_server_ciphers on;
        location / {
proxy_pass http://websocket;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#top from http://blog.csdn.net/chopin407/article/details/52937645
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_read_timeout 28800s;#设置nginx超时
}
    }
以上配置亲测可用。
四、前端测试
1、服务端运行node index.js
2、把以下内容保存到.html文件并放到服务器上,用chrome或QQ浏览器访问,按F11,刷新:
浏览器控制台可见提示:Connection to server opened
服务端命令行处可见:client connected,在网页输入内容并send,服务端命令行可见test from shwan index.html。

html代码:(domain.com应改为实际布署域名)
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>WebSocket Echo Demo</title>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
<!--
    <link href="../bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" />
    <script src="../js/jquery-1.12.3.min.js"></script>
    <script src="../js/jquery-1.12.3.min.js"></script>
    <script src="../bootstrap-3.3.5/js/bootstrap.min.js"></script>
-->
    <script>
    //var ws = new WebSocket("ws://domain.com/io");
    var ws = new WebSocket("wss://domain.com");
    ws.onopen = function (e) {
        console.log('Connection to server opened');
    }
    function sendMessage() {
       // ws.send($('#message').val());
       ws.send(document.getElementById('message').value);
    }
    </script>
</head>

<body >
    <div class="vertical-center">
        <div class="container">
            <p>&nbsp;</p>
            <form role="form" id="chat_form" onsubmit="sendMessage(); return false;">
                <div class="form-group">
                    <input class="form-control" type="text" name="message" id="message"
                           placeholder="Type text to echo in here" value="" />
                </div>
                <button type="button" id="send" class="btn btn-primary"
                        onclick="sendMessage();">
                    Send!
                </button>
            </form>
        </div>
    </div>
</body>
</html>


鸡蛋

鲜花

握手

雷人

路过

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 丽江热线网注册链接

返回顶部