node.js现在挺火的,我也赶时髦捯饬了一下。写了一个to-do list式的小程序,ListDid.me,还有Web移动版的http://listdid.me/m。
在这里把我遇到的问题和解决的方法写下来,希望对后来人有帮助。我是第一次用Linux和node.js,说错的地方还请指正。
注册AWS,配置EC2
http://aws.amazon.com/ec2/
我选中EC2的原因是看中它的灵活性和可靠性。灵活性是指它像个VPS,可以做任何你想做的事情;可靠性是亚马逊的金字招牌。而且第一年还免费。EC2注册和配置这步网上教程多的是,官网文档也足够好,不多说了。有一点要注意,不要用SUSE的AMI,那个是收费的!我用的是一个Ubuntu的。
注册好了之后,下载一个密钥,然后通过ssh就可以登录服务器了。Filezilla在Ubuntu上有bug没法用SFTP,真讨厌,我找不到合适的FTP客户端,只好写脚本用scp上传。我没有安装aws的工具,只是通过网页界面来配置,也挺好。如果要把域名指定到你的EC2实例,需要先申请一个Elastic IP,然后在域名管理网站把域名指向这个IP就可以了。
亚马逊提供了一些数据服务器的产品,但不是功能不足,就是太贵了。所以我把数据库和程序安装在同一个实例上。
改变EC2 EBS大小
比如说你的网站太火了,硬盘不够用了,要让它变大:
- stop your ec2 instance
- take a snapshot
- create a volume based on the snapshot (with a different size)
- attach the volume to your instance at slot “/dev/sda1″
- start the instance, and bind IP
安装node.js
https://github.com/joyent/node
在本机上装node.js一般不会有什么困难,照着官网上一步步来就行了。不要通过apt-get之类的安装,那上面版本太落后。我用的是v0.6.3版。如果node-waf版本和node不对付,就会报“no such environment: default”,这时要手动删除node和node-waf。
EC2 Instance上安装node.js会遇到额外的问题就是,编译的时候费CPU太多,速度非常慢,有可能会被锁定。我开始装了几次都失败了,成功的关键是……多等一会儿。-_-
npm是node.js必备的工具,是管理node.js扩展用的。把官网上的安装脚本下载到EC2 instance上,然后在运行sudo sh install.sh 即可。
多个node.js程序和Apache2共存的问题
这个EC2实例上还要运行我这个博客,所以需要LAMP环境,即Apache服务器。那么就有问题了:node.js和Apache都是服务器,只有一个能绑定80端口,怎么办呢?一个解决方法是设置Apache,把特定域名的访问转向到node.js,但这样一来就完全毁了node.js的优势。我的解决方案是这样的:
- Apache运行在8100端口上
- node.js的程序,每个运行在不同端口上,8001,8002,以此类推
- EC2的Security Group上只开80端口
- 用iptables把80端口的访问转向到8000端口
- 用node-http-proxy写一个简单的反向代理(如下),运行在8000端口上,然后把访问根据域名不同转向到apache或者某个node.js程序上
var http = require(‘http’);
var httpProxy = require(‘http-proxy’);
var options = {
router: {
'apache.example.com’: '127.0.0.1:8100’,
'nodejs.example.com’: '127.0.0.1:8001’,
}
};
var proxyServer = httpProxy.createServer(options);
proxyServer.listen(8000);
node.js进程管理的问题
文章开头说过,node.js一个致命缺陷就是,一旦服务器异常退出或者锁死,就会让网站整个瘫痪。为了避免这个问题,下面是一很好的教程:
http://howtonode.org/deploying-node-upstart-monit
教程里的配置文件似乎有点问题,这是我的upstart配置文件:
description “node.js server”
author “http://chifan.appinmotion.com”
start on runlevel [2345]
stop on shutdown
respawn
script
export HOME="/root"
exec sudo -u [username] /usr/local/bin/node /your_folder/server.js 2>&1 >> /var/log/nodejs.log
end script
Monit我没配置好……算了反正能凑合用。
我应用到的node.js资源
Express.js
http://expressjs.com/
express现在是node.js上最火的开发框架了。安装express会同时安装一系列别的库比如connect.js。
CoffeeScript
http://jashkenas.github.com/coffee-script/
简洁版的JavaScript,开发速度快一点,但有两个问题:
- 无法直接拷贝粘贴网上现成的JS程序。
- 调试的时候,无法直接找到报错位置。报错,报的是JS代码的错误,而你还要多费一道事才能找到CoffeeScript中错误的位置。
其中2应该会有工具能解决,至于CoffeeScript到底能否提高开发效率就见仁见智了。另外他自动监视/编译的watch命令似乎有BUG?
CoffeeKup
http://coffeekup.org/
是网页模板,让你用CoffeeScript代替HTML。后来发现这费事真不值得,下次直接用HTML就好了。同样的还有一个Coffee-css,就是以CoffeeScript写CSS模板,我没有用。
mysql 和链接池
https://github.com/felixge/node-mysql
https://github.com/Kijewski/node-mysql-pool
啊,我开发的时候没发现这个连接池的库,写博客的时候才搜出来的。懒得改程序了,就这样吧。
express-coffee
https://github.com/twilson63/express-coffee
一个CoffeeScript和Express的模板,下载下来直接用。
nodemon
https://github.com/remy/nodemon
这个调试必备,就是当你修改代码之后,他会自动重启服务。改了代码直接刷新浏览器就行,好象PHP一样。
node-amazon-ses
https://github.com/jjenkins/node-amazon-ses
亚马逊邮件产品SES的接口,轻松发Email。
其他工具
YUI Compressor
压缩合并JS文件和CSS文件的,可以优化页面速度且稍微保密你的代码。用法请参见这篇极好的文章
http://lowfatcats.com/blog/1-tutorial/18-how-to-optimize-javascript-css-linux-using-yui-compressor.html
被我放弃的一些东西
jade
express的默认html模板。我觉着既然要用模板,何必不用coffeeKup呢?反正都是CoffeeScript
forever.js
这个也是为了监控进程的,和upstart/monit起到同样的效果。问题是……它似乎还不太稳定,我尝试了一阵之后放弃了。
亚马逊simpledb
亚马逊提供的非关系数据库,很便宜,很适合我的app,看上去觉着很美,但是应用了之后发现……限制太多,比如每个属性最大长度只有1024B,每个domain最多10GB数据。这完全抵消了它非关系型带来的优势,所以我还是改用mysql了。本来也考虑过mongodb,看网上的意思似乎mongodb和node.js是天生一对。但我转念一想,服务器上已经有mysql了,算了别折腾了……
总结
我弄这个主要是为了学点新东西。程序员永远要赶时髦,其实是个时尚行业呀,跟什么爱马仕,驴包是一挂的。
6 回复
关于 “多个node.js程序和Apache2共存的问题”
比如用你的配置,访问 http://apache.example.com/abc 时
会导致浏览器重定向到 http://apache.example.com:8100/abc
这个问题 大家是怎么解决的?