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 

yum安装nodejs 写道
##添加 epel 源
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模块到全局:

npm安装ws模块到全局 写道
npm install -g ws

3、npm安装forever到全局:

npm安装forever到全局 写道
sudo npm -g install 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:

写道
export NODE_PATH=/usr/local/lib/node_modules && node server.js

 当然用这种方式运行的话,安装forever就没有意义了,我们要用forever来运行nodejs代码,这样有3个好处:1、程序如果出错自动重启;2、代码如果有变更自动重新加载;3、可以以守护进程方式让程序后台运行。

那么我们利用forever启动server.js吧:

写道
forever start app.js
写道
forever使用说明
启动相关

// 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

相关推荐