亚马逊EC2上node.js配置与开发的入门经验
发布于 12 年前 作者 zhangxi 15009 次浏览 最后一次编辑是 8 年前

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

6 回复

为什么不用NAE呢?

我写的时候还不知道NAE呀 <br/> <br/>请问NAE国外访问速度快吗?

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

[…] CNodeJS […]

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

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

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

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

回到顶部