nodejs的express负载均衡

我们知道nodejs是单线程的,在特定场合是不能利用CPU多核的优势的。一般有两种方式来解决,一种是利用nodejs的cluster模块创建多个子进程来处理请求以充分利用cpu的多核,还有一种是nodejs运行多个服务分别监听在不同的port,利用nginx创建一个upstream池,来分发请求到nodejs的不同服务端口来处理。

由于我们是要负载均衡express,涉及到用户的会话保持就很重要,不然原先建立请求的是进程A,下次请求转到进程B处理,进程B没有之前用户在进程A的上下文信息,那么处理就会出现问题。

cluster方式下,推荐使用redis来存储会话

javascript 复制代码
var jargs = require('./argsfile.json');
const { createClient } = require('redis');
const client = createClient({ url: jargs.redisurl });
client.on('error', err => { logger.error("Redis连接出错"); });
client.connect();
const { RedisStore } = require('connect-redis-session');
...
app.use(session({
	name: jargs.sessionname,
	secret: jargs.ssosecret,
	store: new RedisStore({ client }), 
	saveUninitialized: true,
	resave: true,
	cookie: { httpOnly: true, maxAge: jargs.sessionage }
	}));

这样会话保存在redis中,不同进程可以共享session信息。

用户nginx upstream池怎么操作呢?其实也可以用redis来共享session的,还可以利用nginx自己的ip_hash策略来确保用户请求源IP固定的情况下,只会连接到upstream池中特定后端目标,这样也不会导致会话丢失。

lua 复制代码
	upstream svc_pool {
		ip_hash;
		server 172.17.36.50:8031;
		server 172.17.36.50:8032;
		server 172.17.36.50:8033;
		server 172.17.36.50:8034;
		server 172.17.36.50:8035;
		server 172.17.36.50:8036;
		server 172.17.36.50:8037;
		server 172.17.36.50:8038;
		}
相关推荐
农村小镇哥14 小时前
nginx服务器的介绍
运维·服务器·nginx
zhensherlock20 小时前
Protocol Launcher 系列:Overcast 一键订阅播客
前端·javascript·typescript·node.js·自动化·github·js
llm大模型算法工程师weng1 天前
负载均衡做什么?nginx是什么
运维·开发语言·nginx·负载均衡
fTiN CAPA1 天前
服务器无故nginx异常关闭之kauditd0 kswapd0挖矿病毒 CPU占用200% 内存耗尽
运维·服务器·nginx
Bigger1 天前
🚀 mini-cc:打造你的专属轻量级 AI 编程智能体
前端·node.js·claude
lKWO OMET1 天前
查看 nginx 是否已经启动
运维·数据库·nginx
算是难了1 天前
TypeORM vs Prisma
数据库·typescript·node.js
ywlovecjy1 天前
【Nginx 】Nginx 部署前端 vue 项目
前端·vue.js·nginx
xxjj998a1 天前
如何安装linux版本的node.js
linux·运维·node.js
hutengyi1 天前
四、nginx的优化和location匹配规则
运维·nginx