apache通过mod_proxy_balancer等模块将请求分发至多个已启动的node.js实例,需配置balancermember定义后端节点、proxyset设置调度算法与会话粘性,并用proxypass/proxypassreverse实现路径转发,同时注意健康检查、websocket支持及真实ip传递等细节。

Apache 本身不直接管理 Node.js 进程,但可以作为反向代理层,把外部请求分发到多个已启动的 Node.js 实例上。关键在于:Node.js 实例由你自行启动(比如用 foreman、pm2 或 systemd),Apache 只负责按规则转发 HTTP 流量。
确保 Apache 启用必要模块
在 Apache 配置中确认已加载以下模块(通常在 httpd.conf 或 apache2.conf 中):
-
mod_proxy:提供基础代理能力 -
mod_proxy_http:支持与 Node.js 的 HTTP 通信 -
mod_proxy_balancer:启用负载均衡集群功能 -
mod_lbmethod_byrequests(或bytraffic、bybusyness):选择调度算法 -
mod_slotmem_shm:必需,用于 balancer 状态共享
验证命令:apachectl -M | grep -E 'proxy|lbmethod|slotmem'。缺失则用 LoadModule 补齐。
定义后端 Node.js 实例集群
在虚拟主机(<virtualhost></virtualhost>)内配置负载均衡组,例如:
<proxy balancer:>
BalancerMember http://127.0.0.1:3001 route=node1 loadfactor=2
BalancerMember http://127.0.0.1:3002 route=node2 loadfactor=2
BalancerMember http://127.0.0.1:3003 route=node3 loadfactor=1
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
</proxy>
说明:
- 每个
BalancerMember对应一个运行中的 Node.js 实例(如 Express 或 Fastify 服务) -
route=node1是会话粘滞必需参数,需配合后端设置(如 Express 不自带 route,可用res.cookie('ROUTEID', 'node1')手动注入,或改用无状态 JWT) -
loadfactor按实例资源分配权重,例如两台 4C8G、一台 2C4G,可设为 2:2:1
绑定路径并启用反向代理
在同一个 <virtualhost></virtualhost> 中添加转发规则:
ProxyPass / balancer://nodeapp/ ProxyPassReverse / balancer://nodeapp/
若只希望代理特定路径(如 /api/),可写成:
ProxyPass /api/ balancer://nodeapp/api/ ProxyPassReverse /api/ balancer://nodeapp/api/
注意:ProxyPassReverse 必须与 ProxyPass 路径严格匹配,否则后端重定向响应头(如 Location)会被错误改写。
补充关键细节
让这套配置真正稳定可用,还需注意:
-
健康检查:推荐加
hcmethod=GET hcuri=/health timeout=3 hcfails=2 hcpasses=2,要求所有 Node.js 实例提供轻量/health接口返回 200 -
WebSocket 支持:若 Node.js 用到了 WebSocket(如 Socket.IO),需额外启用
mod_proxy_wstunnel,并在ProxyPass中显式声明协议:ProxyPass /ws/ ws://127.0.0.1:3001/ws/ -
真实 IP 传递:在
<virtualhost></virtualhost>中添加RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s,并在 Node.js 中解析X-Forwarded-For头获取用户真实 IP -
HTTPS 终止:建议 Apache 统一处理 TLS,后端 Node.js 保持 HTTP;需在 SSL 虚拟主机中复刻上述
<proxy></proxy>和ProxyPass配置











