亚马逊EC2上node.js配置与开发的入门经验
发布于 3年前 作者 zhangxi 4955 次浏览

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大小


比如说你的网站太火了,硬盘不够用了,要让它变大:

  1. stop your ec2 instance

  2. take a snapshot

  3. create a volume based on the snapshot (with a different size)

  4. attach the volume to your instance at slot “/dev/sda1″

  5. 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的优势。我的解决方案是这样的:

  1. Apache运行在8100端口上

  2. node.js的程序,每个运行在不同端口上,8001,8002,以此类推

  3. EC2的Security Group上只开80端口

  4. 用iptables把80端口的访问转向到8000端口

  5. 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,开发速度快一点,但有两个问题:

  1. 无法直接拷贝粘贴网上现成的JS程序。

  2. 调试的时候,无法直接找到报错位置。报错,报的是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 回复

为什么不用NAE呢?

我写的时候还不知道NAE呀

请问NAE国外访问速度快吗?

有可以支持socket的主机吗?网上看到的基本上都是基于http的,想部署一个基于socket的服务@@

[…] CNodeJS […]

关于 “多个node.js程序和Apache2共存的问题”

比如用你的配置,访问 http://apache.example.com/abc

会导致浏览器重定向到 http://apache.example.com:8100/abc

这个问题 大家是怎么解决的?

回到顶部