亚马逊EC2上node.js配置与开发的入门经验

标签: 学习 未分类 apache EC2 express.js | 发表时间:2011-12-10 19:48 | 作者:zhangxi
出处:http://cnodejs.org/blog

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了,算了别折腾了……

总结

我弄这个主要是为了学点新东西。程序员永远要赶时髦,其实是个时尚行业呀,跟什么爱马仕,驴包是一挂的。

您可能也喜欢:

在EC2 中搭建node.js 环境

[实践经验+代码]用node.js和express.js和jade搭建轻型cms系统

多核单服务器各种配置和业务压力下的node.js性能测试

node.js源码研究—模块组织加载

单服务器node.js和php性能测试
无觅

相关 [亚马逊 ec2 node] 推荐:

亚马逊EC2上node.js配置与开发的入门经验

- - CNode社区
node.js现在挺火的,我也赶时髦捯饬了一下. 写了一个to-do list式的小程序, ListDid.me,还有Web移动版的 http://listdid.me/m. 在这里把我遇到的问题和解决的方法写下来,希望对后来人有帮助. 我是第一次用Linux和node.js,说错的地方还请指正.

什么是Node?

- We_Get - 博客园新闻频道
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料.   译文全文:http://jayli.github.com/whatisnode/index.html.   作者:Brett McLaughlin ,原文:What is Node?.

Node入门

- - CSDN博客编程语言推荐文章
作者:  Manuel Kiessling. 翻译:  goddyzhao &  GrayZhang &  MondayChen. 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识. 本书绝不是一本“Hello World”的教程. 你正在阅读的已经是本书的最终版.

浅析Hadoop Secondary NameNode,CheckPoint Node,Backup Node

- - CSDN博客云计算推荐文章
Hadoop SecondaryNameNode并不是Hadoop 第二个NameNode,它不提供NameNode服务,而仅仅是NameNode的一个工具. 这个工具帮助NameNode管理Metadata数据. NameNode的HDFS文件信息(即Metadata)记录在内存中,client的文件写操作直接修改内存中的Metadata,同时也会记录到硬盘的Edits文件,这是一个Log文件.

[译]什么是Node?

- blacktulip - Taobao UED Team
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料. 译文全文:http://jayli.github.com/whatisnode/index.html. 作者:Brett McLaughlin ,原文:What is Node?.

AzureとApp Engine、EC2徹底比較!

- Larry Li - スラッシュドット・ジャパン
利用者が自由にアプリケーションを実行できるクラウドサービスとして有名なのがGoogle App EngineやAmazon EC2だろう. それでは、Windows Azureはこれらのクラウドサービスと比べてどう違うのだろうか. また、読者の皆様が気になるポイントはどこだろうか. Windows AzureとGoogle App Engineはアプリケーションを実行するプラットフォームを提供する「PaaS(Platform as a Service)」、Amazon EC2はOSを実行する仮想環境を提供する「IaaS(Infrastructure as a Service)」となる.

用node作桌面开发

- InterMa - CNode社区
node的定位是,server-side javascript. 但程序员最爱做的事,就是把一个东西用在不该用的地方. 那么,可以把node用在桌面开发上吗. 把Javascript用在桌面开发上,早有先例,比如GTK+的gjs,还有Qt的QML(顺带一提,QML代表着桌面开发的另一个方向,a promising way),GNOME3中,也用javascript作为桌面插件的开发语言.

node js 断点调试

- - Web前端 - ITeye博客
大部分基于 Node.js 的应用都是运行在浏览器中的,. 例如强大的调试工具 node-inspector. node-inspector 是一个完全基于 Node.js 的开源在线调试工具,提供了强大的调试功能和友好. 的用户界面,它的使用方法十分简便. 首先,使用 npm install -g node-inspector 命令安装 node-inspector,然后在终.

Vercel 部署 Node 服务

- - 掘金 前端
之前在写 面试常客:HTTP 缓存时,曾经就强缓存和协商缓存写过两个demo,但缓存要在服务端做,只能贴上代码,不能在网页上感受(虽然我贴了gif). 笔者的所有 demo 例子都放在 github page 上,其特点是不需要服务器即可部署静态资源,但它不具备部署服务端应用能力. 最近笔者在了解 CI/CD 方面的知识点,想起了 Vercel,就想着能否将服务端应用架在 vercel 上呢.