问: cnode社区在程序挂掉后,是如何自动重启的呢
发布于 10 年前 作者 nqdy666 5997 次浏览 最后一次编辑是 8 年前 来自 问答

自己在使用cnode源代码在阿里云上搭建了服务(代码稍有改动), 在某些情况下, 程序会异常崩溃, 导致无法访问. 每次都要远程登入重启程序. 不知cnode社区是怎么应对这种情况, 是否后台有守护进程在跑么, 在服务挂掉的时候,能够重启服务. 如果有的话,能否提供下守护进程的源代码,学习一下.

14 回复

cluster可以解决你的烦恼,多进程,某个进程死掉,自动fork出一个顶上。

@coordcn cluster还处于实验状态,而且在nginx反向代理下有一些问题。 nodejs有foreverpm2两个常用daemon模块,可以使用一下。

@coordcn 你讲的cluster是nodejs自带的多核处理模块cluster是吧. 可我的服务器是单核的. 能有效么?

@dayuoba 恩,forever和pm2研究看看.

@nqdy666 服务器是单核的话,虽然无法利用多 cpu,但是还是可以用 cluster 保证自动重启。pm2 内部也是用了 cluster

@dayuoba 内部实现原理都是一样的,cluster也是child_porcess的封装,forever和pm2也不会例外的。

子进程监控本质上SIGCHLD信号的处理,当主进程收到子进程的SIGCHLD信号,就说明子进程挂掉了,我们可以重新fork一个进程出来顶上。

不知道你说的反向代理是什么问题?能详细说下么?

看看Makefile就知

我也使用了这套框架,目前没有出现状况呢 自豪地采用 CNodeJS ionic

@coordcn cluster确实是对child_process的封装,但是cluster模块为了实现共享监听端口额外做了一些工作 cluster重表象理解可以理解为 nginx(shared port)->processes(different ports) 可控性不如拆分出来做高。

nginx下用cluster的问题是我在用socket.io时候遇到的,nginx 用upstream iphash ,cluster 用sticky-socket,这两个一起用的时候连接异常的紊乱。就是websocket的链接不断的断开重连。。。

@luoyjx 多谢提点,看到了。

@dayuoba cluster的确存在处理进程的不确定性问题,如果进程内不保持状态的话,是没有问题的,游戏,聊天服务器容易出问题。碰到这种问题,多进程监听不同的端口(做反向代理),或者将链接固定到某个进程上都是可行的。

cluster和nginx都会存在这样的问题,这个是共享端口多进程最大的问题,做web没什么问题,其他的就不保险了。

我跟楼主推荐cluster主要原因是简单,几句代码立竿见影,细节上没有你考虑的周到。

(五年过去了) pm2真香

回到顶部