PM2 with socket.io

一般比较喜欢通过 PM2 来管理 node application,部署时一般也会使用 -i max 参数来打开尽可能多的进程,多数情况下这样做并不存在任何问题。

但是,socket.io 使用 XHR-Polling 方式来验证 SID,进而建立链接时,即使使用了 socket.io-redis,依然是无济于事的。因为 socket.io 需要 sticky load balance 固定到同一个进程上。官方提到一些方法 http://socket.io/docs/using-multiple-nodes,可以参考。基于此,也有另一些包,可以解决问题,比如 https://github.com/PROGrand/sticky-socket-cluster

总之,不能用简单用 PM2 来管理 cluster 了。PM2 和 socket.io 双方有一些踢皮球,所以这事儿暂时无解。哈

How to start pm2 server in a docker container

直接在 docker 的 container 中运行 PM2 可能会遇到以下问题:

1
PM2 dameon PID = 1
0 with /.pm2/pm2.log file not found

这是因为 /.pm2 目录不存在造成的。可能很多人此时会想到去创建该目录,事实上是不必要的,比较好的做法是使用官方提供的 dump 命令。

运行 PM2 的 Dockerfile ,可以参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:0.11.13
# or just node, without tag

RUN npm install -g pm2
RUN pm2 dump
# dump will start pm2 daemon and create everything needed

VOLUME ["/srv/apps", "/srv/logs", "/srv/server.json"]
# don't put the files in docker container, user -v

EXPOSE 3000

CMD ["pm2", "start", "/srv/server.json", "--no-daemon"]
# no daemon mode for docker

搞定。

NPM and node-gyp

pm2 中会使用到 fsevents,node-gyp rebuild fsevents 时,会遇到下面这样的错误:

1
user "root" does not have permission to access the dev dir

网上找到的讨论,说 node-gyp 不能用在 sudo 下,由于 Mac 上 pkg 安装的 node 需要 sudo 执行 npm,所以这样:

1
2
sudo chown -R `whoami` ~/.npm
sudo chown -R `whoami` /usr/local/lib/node_modules

之后就不再需要 sudo 安装 npm 了。

重新安装 pm2 ,到了 fsevents 时, node-gyp rebuild 能运行了,但到了一半,错误变成这样:

1
2
3
4
5
6
7
8
make: *** [Release/obj.target/fse/fsevents.o] Error 1
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:267:23)
gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:110:17)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:1046:12)
gyp ERR! System Darwin 13.3.0
gyp ERR! command "node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"

但是安装是成功的…… pm2 可以正常使用。

为探究竟,费尽半天辛苦,发现原来是 node 0.11.13 的问题……可以看这里https://github.com/pipobscure/fsevents/pull/26

无言以对。