Nodejs部署再思考
发布于 6天前 作者 i5ting 610 次浏览 来自 分享

pm2

好处就不说了

今天遇到一个奇怪的问题,部署一台新的机器,无论怎么弄,什么版本都会报错

js-bson: Failed to load c++ bson extension, using pure JS version

我曾经无数次的怀疑,是mongodb的问题,于是我手动编译了bson和bson-ext,以及相关的

  • connect-mongo
  • mongoose

可是还不好使。。。。。

我觉得很奇怪,没有理由啊,我去查pm2的源码和文档,发现cluster mode必须是0.12之后才有,之前的方式都是fork模式的。

最后发现 https://github.com/Unitech/PM2/issues/957

@jorge-d commented on Mar 11

I just tested with node v0.12.0 and pm2 0.12.7 and everything seems to be working fine...
Could you do a simple test ? run pm2 kill; pm2 start app.js -i 0 and tell me whether it starts in cluster of fork mode ?

然后那货的问题就解决了,然后我试了一下

pm2 kill

是杀死pm2自己的进程,然后产生新的,相当于重启。

然后再跑就可以了

反思一下,为什么会出现这样的问题?

node的版本较多

  • nodejs(0.10 和0.12 集群模块不一样,还有就是对es6的支持)
  • iojs(目前以及2.3+)

我最开始部署的时候用的是iojs最新版本,然后我启动过pm2,克隆完源码之后,npm install的时候有模块无法编译,所以我就切换0.10了

哎,我没有想到pm2会一直存在,只要不kill就在,而且我不喜欢动不动就重启服务器,所以花了几个小时的时间才解决。

pm2 deploy

ruby 里有 capistrano 部署

node世界里也有shipit

说白点都是“Universal automation and deployment tool”,通用自动化部署工具而已。

实际上Unitech也打算给pm2增加这样的功能,让pm2成为一个全能的货

它完成了几件事儿

  • evn环境变量
  • ssh远程key配置
  • git代码以及分支切换
  • 各种回调钩子,比如post-deploy

以上特性足矣和任何ci或者其他自动化工具集成了,目前可以当小白鼠的。

部署相关,小弟们必看

部署的基本常识

NGINX+PM2组合

注意配置

server {  
  server_name your.domain.com;
  listen 80;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://127.0.0.1:3000;
    proxy_redirect off;
  }
}

如果有兴趣,也可以看一下我写的node部署

http://nodeonly.com/2015/06/02/deploy.html

这样的部署真的足够了么?

一台一台机器的部署也是醉了。。。。哥是程序员啊

复用和弹性伸缩才是真爱

所以比较好的方式是使用docker来处理,docker是lxc,里面可以部署任意linux系统 配置各种环境,完成任意弹性扩容

目前nearfarm已经有一个不错的实现

https://github.com/nearform/nscale

具体原理以及相关实践,稍后整理

全文完

欢迎关注我的公众号【node全栈】

node全栈.png

16 回复

嗯,正在学docker

使用docker更佳

出现pm2只有fork的原因

按照我目前的经验,出现pm2只有fork模式的原因只有两种

  1. 按照其官方文档说的,因为nodejs版本上(也就是代码上)的限制,pm2在基于nodejs底层代码上不好实现或者说,即使实现了bug也 是非常多。但是楼主在你的文章里有一点说的不够严谨,你的说法如下。 QQ截图20150615154805.png 可目前我看到的官方介绍是这样的: QQ截图20150615155123.png 也就是说node v0.11.16+就可以使用
  2. 第二个原因就是如果你的电脑只有一个CPU,也就是单核的,那是无法使用pm2 的cluster模式。即使在node v0.12+ 底层硬件都不支持了。那就没有后文了

@struCoder

  • 第一点,你是对的,O(∩_∩)O谢谢
  • 第二点,不太认同,pm2可以起无数个实例,但我们一般按cpu核数个数算,所以1个还是多个是一样的,不过cpu无法那么快处理而已

@i5ting 嗯,是这样的,可能是我表达的有些绝对,因该是无法高效的使用pm2的cluster模式,单核的CPU,使用 cluster反而会增加系统负担 :)

WHY U SELECT PM2? 因为你不会控制自己的CLUSTER。 –轮子王 瓜皮

@MiguelValentine 。。。就那点api有啥难呢?只是本着不重复造轮子的原则

偷点懒,干正事,哈哈

@struCoder @i5ting 之前 0.10 就可以用 cluster 了,只是用来取消支持了。

问一下小问题呢,没太看明白你写的node部署中这段 pm2的最佳实践 把启动写到json配置文件中 // 20150531071243 // https://raw.githubusercontent.com/RocketChat/Rocket.Chat/master/pm2.production.json … 部署 pm2 deploy ecosystem.json production setup 第一个傻瓜原则,你的机器有几核,你就几个实例 Start an app using all CPUs available + set a name : $ pm2 start app.js -i 0 --name “api”

我想问一下,以前我都是$ pm2 start app.js -i 0 --name "api"这种直接启动就不管了,但用上面哪个文件部署没看太明白,上面哪大段"apps":{} 就是下面 ecosystem.json吗? pm2 deploy ecosystem.json production setup运行后,还需要用$ pm2 start app.js -i 0 --name "api"再运行一次吗,我看你写在一起的没看明白。 "script": "/var/www/rocket.chat/bundle/main.js", --> app.js 这个字段是一般我们启动的哪个js文件指向吗? 谢谢

@gotolnc 是这样的

pm2.production.json和ecosystem是一样的

 pm2 start app.js -i 0 --name "api"

这种只适合一个项目启动,如果你有多个呢?就要切换到每个里面去启动,还有就是每个里面的env环境变量不一定都一样,还是写在配置文件里比较靠谱

untitled1.png 一直有这个问题但是不应影响使用

@lzxue

  npm install bson

就可以了

docker 好久讲呢,有点像Ghost一样,蛮方便的东西。

回到顶部