nodejs+ws+forever做websocket服务器
现在web应用越来越多,大多数利用HTML5技术结合后台API就可以完成。但是有一些场景却需要socket长连接的支持,比如在线即时对话(客服系统),比如游戏在线对战,这两类需求,如果利用ajax轮训机制,服务器负担将随人数增加成倍增长,而且另一方面来说,响应速度也得不到保障(轮训1秒钟一次就很频繁了,而1秒钟的延迟对用户来说体验并不好)!
针对要求及时响应的场景,或者需要服务器通知浏览器的场景,还是用websocket技术解决比较完美,毕竟对于服务器来说,创建1000个socket连接并不难,但1秒钟响应1千次api请求却很吃力,况且大多数时候api根本不会返回有效数据,比如在线对话吧,两个人交流两句话的时间完全可能是数十秒。
websocket可以利用c++实现,当然利用java,python等都可以做到,但对于网站开发人员来说,用nodejs无疑是技术门槛最低的一种方案。话说前头,服务器使用nodejs技术的时候,内存要给够,一个服务器4GB内存不可少吧?如果服务的人数多,给8GB内存甚至更高都是可以的,这是以硬件来换取技术解决的成本。1GB~2GB内存就别跑这么多费内存的服务啦。
先看看nodejs在linux上的部署方法吧,我只说centos上的,因为大多数公司用这个操作系统。操作当然都复制自网上,但我负责任的讲,都是我成功部署的命令:
1、安装nodejs,利用yum
来自:http://blog.csdn.net/xiao_jun_0820/article/details/50838185
64位:
rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
32位:
rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
导入 key(64位,32位都一样):
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
##添加 remi 源并导入 key(64位,32位都一样):
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi
安装完成后,执行:
curl --silent --location https://rpm.nodesource.com/setup_5.x | bash -
yum -y install nodejs
2、安装ws模块到全局:
3、npm安装forever到全局:
至此,nodejs,ws模块和forever的环境安装完成。
写一个测试的服务器脚本server.js:
var WebSocketServer = require('ws').Server; var wss = new WebSocketServer({ port: 8080 }); wss.on('connection', function(ws) { ws.on('message', function(message) { console.log(message.code); ws.send('Server Received: [' + message.code + ']' + message.content); }); ws.send('Welcome to rungo node js server!'); });
用nodejs直接运行server.js,由于ws模块安装到全局了,所以运行前必须设置环境变量NODE_PATH:
当然用这种方式运行的话,安装forever就没有意义了,我们要用forever来运行nodejs代码,这样有3个好处:1、程序如果出错自动重启;2、代码如果有变更自动重新加载;3、可以以守护进程方式让程序后台运行。
那么我们利用forever启动server.js吧:
启动相关
// 1. 简单的启动
forever start app.js
// 2. 指定forever信息输出文件,当然,默认它会放到~/.forever/forever.log
forever start -l forever.log app.js
// 3. 指定app.js中的日志信息和错误日志输出文件,
// -o 就是console.log输出的信息,-e 就是console.error输出的信息
forever start -o out.log -e err.log app.js
// 4. 追加日志,forever默认是不能覆盖上次的启动日志,
// 所以如果第二次启动不加-a,则会不让运行
forever start -l forever.log -a app.js
// 5. 监听当前文件夹下的所有文件改动
forever start -w app.js
显示所有运行的服务
forever list
停止操作
// 1. 停止所有运行的node App
forever stopall
// 2. 停止其中一个node App
forever stop app.js
// 当然还可以这样
// forever list 找到对应的id,然后:
forever stop [id]
重启操作
重启操作跟停止操作保持一致。
// 1. 启动所有
forever restartall
在项目中上线运行时,应该用如下命令运行(输出普通日志和错误日志):
forever start -l forever.log -o out.log -e err.log app.js