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)
[...] http://cnodejs.org/blog/?p=4581 [...]
关于 “多个node.js程序和Apache2共存的问题”
比如用你的配置,访问 http://apache.example.com/abc 时
会导致浏览器重定向到 http://apache.example.com:8100/abc
这个问题 大家是怎么解决的?
[...] CNodeJS [...]
我写的时候还不知道NAE呀 请问NAE国外访问速度快吗?
为什么不用NAE呢?
有可以支持socket的主机吗?网上看到的基本上都是基于http的,想部署一个基于socket的服务@@