Fork me on GitHub

Linux(CentOS)nodejs项目部署

系统:CentOS 64位(查看系统位数请执行命令:getconf LONG_BIT)

1、到http://nodejs.org/download/找到系统对应的安装文件

执行如下命令:

wget http://nodejs.org/dist/v0.8.7/node-v0.8.7.tar.gz (稳定版)

//wget http://nodejs.org/dist/v0.10.22/node-v0.10.22.tar.gz (最新版)

2、解压

tar -xvf node-v0.10.22-linux-x64.tar.gz

cd node_xxx

3、安装

yum install gcc-c++(if has no c compiler)

./configure

4、安装nodejs

make install

如果python版本过低,可能会报错,请先升级http://gavinshaw.blog.51cto.com/385947/610585

这个一定有用:http://www.cyberciti.biz/faq/wget-example-download-from-https-web-sites/

5、安装完毕,接下来就可以利用node命令启动服务了。

cd /$app_path/

node /nodejs/app.js

值得注意的是,我们使用node命令启动后,服务会因为我们关闭这个操作窗口而挂断,解决办法是使用nohup命令不挂断执行。

以下为我在项目中使用的发布脚本:

rm -rf /data/webapps/bds_nodejs

cd /data/trunk/bds_nodejs
svn update .
svn export /data/trunk/bds_nodejs /data/webapps/bds_nodejs

kill -9 ‘netstat -nlp | grep 3000 |awk ‘{print $7}’ | awk -F/ ‘{print $1}’’
cd /data/webapps/bds_nodejs
nohup node app.js &

如果遇到编码问题,请把这段shell脚本保存为ANSI格式再上传到svn服务器上,或者直接在linux上使用vi编写。


make install 以后,有点系统直接执行node -v会报命令不存在的错误,

这个时候就要配置一下node的环境变量。

1、先找到node安装在哪里

whereis node

找到node命令的路径。

2、打开配置文件,并增加path

vi /etc/profile

增加:

export PATH = /usr/local/bin

3、修改完以后执行 source profile即可生效。

附:

环境变量的查看
(1)使用echo命令查看单个环境变量。例如:
echo $PATH
(2)使用env查看所有环境变量。例如:
env
(3)使用set查看所有本地定义的环境变量。例如:
set
另外,unset可以删除指定的环境变量。

常用的环境变量
PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户Shell类型
LANGUGE  语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符,对于root用户是#,对于普通用户是$

针对生产环境中express应用安装部署上需要注意的问题。

设置NODE_ENV为“production”
确保应用的自动重启
将应用部署一个集群中
缓存请求结果
使用负载均衡
使用反向代理

  1. 设置运行环境变量

一般我们设置node环境变量有两种,分别是 development 和 production。设置环境变量为production将会使得express应用

缓存视图模板
缓存css文件
生成更少的冗余错误信息
另外如果大家感兴趣的话可以查看这篇文章环境变量测试,这里作者对于设置该变量前后做了一些性能上的对比,非常详细。

如果我们使用upstart来管理应用的话我们需要配置文件中加入环境变量

#/etc/init/env.conf
env NODE_ENV=production
如果是使用systemd来管理的话,则修改配置文件如下:

#/etc/systemd/system/myservice.service
Environment=NODE_ENV=production
2.确保自启动

这里自启动不仅仅指的是如何在程序异常终止之后启动而且还要保证程序在操作系统重启之后能自启动。这里我们分别介绍下两种情况。

使用一个进程管理器
进程管理器一般可以帮助我们,获得进程的运行性能和资源的消耗,动态的修改配置提升性能,集群控制。这里我么推荐的一般可以使用strongloop process manager或者pm2还有forever,同样详细的参考如下链接进程管理器比较
通过上述的比较我们可以看出,strongloop的进程管理器支持的特性更丰富一些,特别是查看cpu占用堆占用,集成操作系统脚本,远程管理集群等等。

随系统启动的程序自启动
随系统启动的程序,我们可以使用之前的进程管理器,forever应该是不支持的。其他的都可以生成对应的启动脚本,当操作系统启动的时候,进程管理器启动,并带动程序的启动。或者我们可以直接配置使用systemd等方式来管理进程的开机启动。
我们这里简单的通过介绍systemd的方式来介绍如何设置程序的随系统启动。systemd是一个linux系统的服务管理器。一个systemd的配置文件被称作为unit file.以.service为后缀。

[Unit]
Description=Awesome Express App

[Service]
Type=simple
ExecStart=/usr/local/bin/node /projects/myapp/index.js
WorkingDirectory=/projects/myapp

User=nobody
Group=nogroup

#Environment variables:
Environment=NODE_ENV=production

#Allow many incoming connections
LimitNOFILE=infinity

#Allow core dumps for debugging
LimitCORE=infinity

StandardInput=null
StandardOutput=syslog
StandardError=syslog
Restart=always

[Install]
WantedBy=multi-user.target

  1. 将app运行在一个集群中

在多核心处理上运行的应用,可以通过使用cluster模块启动多个实例运行在不同的处理器上。并在多个实例上实现“负载均衡”。
image
但是对于不同的实例,由于内存空间的隔离,导致所有的程序对象都是本地的,无法实现共享,但是我们可以借助于redis这样的工具实现对象的共享。并且对于某个进程的终端不会影响其他进程的处理,只需要在编写代码的时候记录此次终端并生成一个新的实例即可。

我们可以使用node的cluster模块(需要编写代码实现)或者是strongloop的进程管理器来处理,并且不需要修改代码。strongloop PM将根据cpu的数目自动的生成多个进程,并且可以手动调整该值。

  1. 缓存请求

使用缓存,可以极大的提升响应速度,而不需要对于重复的请求做重复的操作。我们可以使用nginx缓存配置来配置缓存

  1. 使用负载均衡

单一的express进程服务,不管如何优化都无法达到一个很高的性能需求,特别是对于一个拥有很多用户的web应用。我们可以通过使用一个负载均衡器来完成应用的水平的扩展。比如使用nginx或者HAProxy来完成负载均衡。在使用负载均衡的时候,我们可能需要确保每一个请求关联相对应的会话ID落到同一个进程上。这里有一篇文章可以供参考,了解如何配置负载均衡socket.io配置负载均衡

另外strongloop pm可以很好的与nginx配合设置负载均衡。

  1. 反向代理服务

反向代理服务器一般设置在请求入口处,完成错误页面处理,压缩处理,缓存和静态文件处理,负载均衡操作等等。具体的可参考nginx或者HAProxy的配置来完成反向代理服务的搭建。