Nodejs部署再思考

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 部署

  • http://capistranorb.com/

node世界里也有shipit

  • https://github.com/shipitjs/shipit

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

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

  • 代码: https://github.com/Unitech/pm2-deploy
  • 文档:https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#deployment-help

它完成了几件事儿

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

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

部署相关,小弟们必看

部署的基本常识

  • https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

NGINX+PM2组合

  • https://doesnotscale.com/deploying-node-js-with-pm2-and-nginx/

注意配置

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全栈】

时间: 06-11

Nodejs部署再思考的相关文章

关于网页脚本代码结构的再思考

在很多说法中,总是建议将我们的javascript脚本加载在网页的最后,并用外部文件的形式,然而事实并不是这样,外挂的文件最好不要太多,脚本结构代码本身才是值得我们思考的问题.我们需要重新思考我们撰写的脚本的执行力,并把更优秀的javascript开发思路融入到我们的开发中. 我在读完了几篇关于javascript和jQuery的性能优化的文章之后,才恍然大悟,我以前所做的很多代码结构优化,最终只是让乌徒帮显得臃肿,于是重新设计脚本代码的结构,无论怎么样,乌徒帮现在的网页打开显得更加流畅了. 1

机房收费重构——关于上下机的再思考

有句话叫做no zuo no die,我大概就是这种人吧.why?做机房收费系统的时候,按照一般方法也能实现,但这次做上下机的时候,总感觉这么做对自己来说,没什么提高,然后就停下来,重新想想上下机还能怎么做? 后来,大致采用的思路是这样的:将上下机的读写数据的过程写成两个存储过程,负责读取和更改数据.中间的计算过程写在代码里面:中间判断时间的过程用职责链模式来实现,判断一般用户还是临时用户用策略模式实现.这样,整个上下机的过程就是这样的: 1,用上机的存储过程使学生上机,然后将学生上机信息写入表

PLC编程再思考之二:SOA

随着AMAZON云服务的成功,许多人知道了BEZOS在AMAZON内部推广WEB SERVICE的故事,从而佩服他的技术眼光和执行力. 如果说AMAZON.COM的成功是因为长尾理论,是对万货商店的技术实现,那么从某个层面来说,AWS(AMAZON WEB SERVICE)是另一种形式的长尾,只不过它销售的是IT服务而不是物理产品. BEZOS基于SOA的思想,通过网络接口和服务打通了AMAZON内部的各种子系统,他把基础设施的接口进一步对外开放,从而形成了AWS的基础功能. 那么,SOA的思想

PLC编程再思考之三:面向过程

现在的高级语言基本上都是面向对象的,但是PLC编程象较早的BASIC/FORTRAN语言一样,是面向过程的. PLC逻辑处理的基本过程为: 1) 将外部设备输入的数据写入输入映像区(I). 2) 逻辑处理,包括读I区.写Q区. 3) 将输出映像区(Q)的数据输出到外部设备. 其中,1)和3)是PLC内部处理的,所有的PLC用户程序只处理第2)部分. PLC的这种处理方式带来了下面2个特点. 特点1:OB1调用的程序不存在并发 我们知道,PLC用户程序主要运行在2个地方:中断和OB1. 一般而言,

PLC编程再思考之一:MapReduce

大家知道MapReduce是奠定GOOGLE成功基础的三大技术法宝之一(另外两个是PageRank和BigTable),现在MapReduce方法论已经在网络开发甚至在企业开发中得到广泛的应用,而本文则探讨MapReduce在MES PLC编程中的应用. 目前PLC和自动化技术在MES的应用中非常关键,通过对PLC的集成,MES得以打通执行层.控制层.设备层,在一些汽车制造公司,甚至专门搭建IT PLC或MASTER PLC,以实现PMC.ANDON.AVI.EPS等高度复杂的业务模块,以及数以

【原】关于AdaBoost的一些再思考

一.Decision Stumps: Decision Stumps称为单层分类器,主要用作Ensemble Method的组件(弱分类器).一般只进行一次判定,可以包含两个或者多个叶结点.对于离散数据,可以选取该属性的任意一个数据作为判定的分割点:对于连续数据,可以选择属性的一个阈值做为分割点进行判定(大于该阈值分配到一类,小于该阈值分配到另一类:当然也可以选取多个阈值并由此得到多个叶结点).   二.AdaBoost的理解: 1.基本流程 简单的说,AdaBoost框架就是根据指定的参数,进

PLC编程再思考之4 - 面向对象

PLC编程有诸多限制,如: 传统的西门子PLC单个DB的存储容量为64KB. 每次DB结构变更时,都需要编译并重新下载覆盖原DB. 每次DB结构变更时,OPC变量需要重新映射地址. 但有时候我们希望把DB设计得灵活一些,当给PLC增加一些小的元素时,我们不希望覆盖大量的DB. 有时我们希望PLC程序设计得模块化.产品化.基于配置. 在这些应用场景中,我们可以参考面向对象的方法进行PLC编程. 本文以质量安灯实例说明了面向对象的PLC编程方法. 业务需求为: 每个工位配置1条拉绳. 当拉绳拉下时,

loadView 再思考

如果使用代码创建view,那么就需要重写loadView方法: 在这个方法中,如果不创建view,就会循环的调用loadView. - (void)loadView { UIView *view = [[UIViewalloc]initWithFrame:[[UIScreenmainScreen]applicationFrame]]; self.view = view; UIButton *button = [UIButtonbuttonWithType:UIButtonTypeRoundedR

二分查找之再思考

一.一般的二分查找 一般的二分查找即,输出要查找元素在数组中的位置,这里的位置没有特殊限定,没有要求是数字第一次出现的位置,也没有要求是最后一次出现的位置. int getPos(vector<int> A, int n, int val) { if (A.size()==0) { return NULL; } int low=0; int high=n-1; while(low<=high) //注意这里是小于等于 { if (A[(low+high)/2]>val) { hig