问题: 在本地启动egg.js,使用egg-socket.io,能正常连接到websocket,而放到docker中运行,则无法连接得上,提示Session ID unknown,http报400错误。
原因: 之所以在本地能成功连接,是因为本地启动方式为egg-bin dev
,会针对本地开发做很多处理,而在docker中启动脚本是egg-scripts start
,如果没有在sticky模式下运行,则会出现无法正常连接,同时报错。
值得注意点是Egg框架是以 Cluster 方式启动的,而 socket.io 协议实现需要 sticky 特性支持,否则在多进程模式下无法正常工作。
由于 socket.io 的设计,在多进程中服务器必须在 sticky
模式下工作,故需要给 startCluster 传递 sticky 参数。
添加之后再运行就连接正常了。
修改 package.json
中 npm scripts
脚本:
{
"scripts": {
"dev": "egg-bin dev --sticky",
"start": "egg-scripts start --sticky"</