问题: 在本地启动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"}}
Nginx 配置
location / { # 这两行需要开启 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://127.0.0.1:7001; }
Cluster 是什么呢?
简单的说,
- 在服务器上同时启动多个进程。
- 每个进程里都跑的是同一份源代码(好比把以前一个进程的工作分给多个进程去做)。
- 更神奇的是,这些进程可以同时监听一个端口(具体原理推荐阅读 @DavidCai1993 这篇Cluster 实现原理)。
其中:
- 负责启动其他进程的叫做 Master 进程,他好比是个『包工头』,不做具体的工作,只负责启动其他进程。
- 其他被启动的叫 Worker 进程,顾名思义就是干活的『工人』。它们接收请求,对外提供服务。
- Worker 进程的数量一般根据服务器的 CPU 核数来定,这样就可以完美利用多核资源。
const cluster=require('cluster');const http=require('http');const numCPUs=require('os').cpus().length;if(cluster.isMaster){// Fork workers.for(let i=0; i< numCPUs; i++){ cluster.fork();} cluster.on('exit',function(worker, code, signal){ console.log('worker '+ worker.process.pid+' died');});}else{// Workers can share any TCP connection// In this case it is an HTTP server http.createServer(function(req, res){ res.writeHead(200); res.end("hello world\n");}).listen(8000);}
热门文章
- 2月6日19.6M/S|Shadowrocket/V2ray/Clash/SSR免费节点每天更新订阅链接,翻墙机场推荐分享
- 宠物领养的网站叫什么(宠物领养网站的设计与实现)
- 动物医院优质好评文案 动物医院优质好评文案怎么写
- 12月17日20.5M/S|V2ray/SSR/Shadowrocket/Clash免费节点每天更新订阅链接,翻墙机场推荐分享
- 给宠物猫打疫苗需要多少钱一次(给猫猫打疫苗要多少钱?)
- 2月20日19.1M/S|Shadowrocket/Clash/SSR/V2ray免费节点每天更新订阅链接,翻墙机场推荐分享
- ClickHouse 对付单表上亿条记录分组查询秒出, OLAP应用秒杀其他数据库_在线工具
- 凭什么猫不能打新猫(凭什么猫不能打新猫呢)
- 动物疫苗使用方法(动物疫苗接种方法有哪些)
- 12月31日20.6M/S|Shadowrocket/SSR/Clash/V2ray免费节点每天更新订阅链接,翻墙机场推荐分享