部署node.js的应用
by mashihua
at 2011-10-14 18:45:00
original http://www.f2eskills.com/2011/10/deploy-nodejs-app/
先吐槽一下:-) 。这个博客基本上归于月经帖了,主要是我碰上了“火星恐惧症”,症状表现为:担心要写的东西太老土太平常太小白或是已经被人看过写过,怕被别人说一点都没有体现在档的领导下应有的先进生产力的。国庆这些天在家做了反省,如果老是担心这种事的发生,就没办法在博客上交流了。什么别人的眼光,那都是浮云。
==========================华丽的分割线============================
最近Node.js很火,让很多的前端看到了可以直接从前端写到后端的希望。但是每次部署一个Node.js的应用却让前端苦恼不已。每次登陆服务器,用自己不熟悉的方式从版本控制仓库中拖下源代码,kill掉应用的进程,重起一个应用的守护进程。如果能够自动化的部署一个Node.js应用,而不需要去接触这些前端不太熟悉的Unix系统命令和管理。对于大家来说就是提升了生产力。Capistrano是一个强大的自动化部署工具,所以我们选用他来做自动化部署。并且我已经把做好了的一个部署脚本Nodebot提交到github上去,供大家参考。
首先我们需要一个环境,分为两个环境:部署客户端环境和服务器环境。
部署客户端系统需求:
你可以用任何系统了,系统只要具备下面的4个软件就可。
- 安装ruby。去http://www.ruby-lang.org/en/downloads/下载适合你系统的ruby版本。
- 安装rubygem。去http://rubyforge.org/projects/rubygems/下载最新版的RubyGems,解压后运行以下命令安装。 sudo ruby setup.rb
- 安装Capistrano和Capistrano-etx。运行以下的命令安装。sudo gem install capistrano capistrano-ext
这样你就拥有了在机器部署node.js应用的软件。然后你需要能够不使用密码直接登陆到服务器上。运行下面的命令:
-
ssh-keygen
-
#Copy key to server
-
cat ~/.ssh/id_rsa.pub | ssh user@domain.com "cat >> .ssh/authorized_keys"
这样你就可以不需要密码直接登陆到服务器。
服务器端系统需求:
当然要Unix一类的系统了,Nodebot需要具备upstart的系统(一个基于事件的守护进程管理系统)。虽然Node.js能跑在window上,但是那只适合开发环境,不适合生产环境。还要有下面的软件,你也可以下载Nodebot并在部署客户端运行命令cap nodebot:setup 来自动化安装。
- 安装scm软件。比如git,svn或hg,取决于你的node.js应用源代码管理软件。
- 安装Node.js。没什么好说的,地球人都知道这是什么。
- 安装npm。Node.js的一个包管理软件
- 安装node-jake。一个javascript的代码构建工具,有点像make和rake。用来安装应用的依赖。
- 具备upstart的系统,比如Ubantu。来做应用的守护进程。参看 http://upstart.ubuntu.com/
部署的登陆用户需要sudo权限,并且不需要提示输入密码。参考命令:
-
sudo useradd -m foo
-
#edit sudoer privilege
-
sudo visudo
出现编辑器时,插入下面一行,foo就是你新建的用户:
foo ALL=(ALL) NOPASSWD: ALL
然后在deploy.rb文件(下面会提到)里配置foo为部署用户。
部署客户端脚本
环境有了,那就要开工了。我们希望在服务器上的Node.js应用运行几个不同的环境:测试环境,开发环境,产品环境等。运行capify .
命令会在当前的目录下产生一个文件和一个目录。在目录里有个deploy.rb,这是我们需要修改的文件。由于我们需要多个环境,所以我们引入了Capistrano-etx。
-
set :default_stage, 'staging'
-
require 'capistrano/ext/multistage'
我们设定了两个环境:staging和production,默认是staging环境。我们再在config目录下建一个deploy目录,里面放的两个.rb文件对应不同的环境配置.最后部署环境的目录下是这样的一个结构:
. ├── Capfile └── config ├── deploy │ ├── production.rb │ └── staging.rb ├── deploy.rb └── node.rb
deploy.rb文件看起来像这样。你需要设定host, repository,user和admin_user :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
|
staging.rb环境文件看起来像这样。设定了应用的环境,git的branch,应用的监听端口和部署目录:
1 2 3 4 5 6 7 |
|
production.rb环境文件看起来像这样:
1 2 3 4 5 6 7 |
|
主要命令:
- cap -T 查看所有的task
- cap deploy:setup 设置staging环境,比如创建部署的目录等。staging是默认环境,命令等同于cap staging deploy:setup。调用production环境的命令cap production deploy:setup,第一个参数是环境名,第二个参数是任务名。
- cap nodebot:setup 安装系统一些软件和配置守护进程。上面已经介绍过。
- cap production deploy 部署 production环境的Node.js应用。包括从仓库取最新的代码,链接最新的代码到一个目录。重起应用的Server。
- cap deploy:stop, cap deploy:start和cap deploy:restart 停止,启动和重起staging环境的Server。
简单的Node.js应用:
我们用一个简单的Node.js应用来说明实际的效果,应用的目录结构就像这样:
. ├── Jakefile.js ├── app.js ├── config │ └── requirements.json └── log
app.js 就是应用的启动脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Jakefile.js jake构建工具调用的脚本,在本例子中用来安装express
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
config/requirements.json 应用依赖的定义
1 |
|
log 应用日志的输出
实际部署的效果: staging环境, production环境
结论:
使用Nodebot你可以轻松的部署你的Node.js应用。把你的焦点放到实际的需求中,而不用关心部署环境的建立和部署应用的麻烦,只许在部署客户端轻松的输入简单的命令。
你或许喜欢
- 2011 年 12 月 13 日 -- 如何使用NPM来管理你的依赖
- 2012 年 01 月 11 日 -- V8的Hash冲突问题
- 2010 年 11 月 05 日 -- Data URI和MHTML的另类方法