Apache与多代理负载均衡器集成嵌入式Tomcat配置问题咨询
Apache多代理负载均衡配置错误排查与修正
现有配置的问题点
- 重复加载模块:配置里重复加载了
proxy_module,多余的一行需要删除。 - BalancerMember协议缺失:第一个负载均衡组
myset里的BalancerMember没指定http://协议头,会导致代理解析异常,需统一添加协议。 - ProxyPass顺序错误:
ProxyPass / balancer://myset/是最宽泛的路径匹配,会覆盖后面所有更具体的路径规则(比如/app1/、/app2/),必须把最长、最具体的路径放在最前面。 - 路径拼写错误:
ProxyPass /ap3/ balancer://prsreg/里的/ap3/是笔误,应该是/app3/,和后面的Location /app3对应。 - 会话粘性配置错误:Spring Boot嵌入式Tomcat的session cookie默认是
JSESSIONID,格式为xxxxxx.jvm1(后缀是JVM路由标识),现有配置的stickysession=ROUTEID不匹配,需改为stickysession=JSESSIONID|jsessionid,让Apache正确解析cookie中的路由部分。 - 缺少ProxyPassReverse:没有配置
ProxyPassReverse,后端应用返回的重定向URL会直接暴露后端端口,需要添加对应规则来修正重定向地址。 - ProxySet冗余配置:每个负载均衡组里的两个
ProxySet可以合并为一行,简化配置。
修正后的完整配置
### Enable LoadModule entry for Apache mod_proxy and mod_proxy_http ### LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so <IfModule mod_proxy.c> SSLProxyEngine On ProxyPreserveHost On <Proxy balancer://myset> BalancerMember http://hostname:7001 route=jvm1 ProxySet lbmethod=bytraffic stickysession=JSESSIONID|jsessionid </Proxy> <Proxy balancer://viewer> BalancerMember http://hostname:7002 route=jvm2 ProxySet lbmethod=bytraffic stickysession=JSESSIONID|jsessionid </Proxy> <Proxy balancer://prsreg> BalancerMember http://hostname:7003 route=jvm3 ProxySet lbmethod=bytraffic stickysession=JSESSIONID|jsessionid </Proxy> # 注意:最具体的路径放在最前面 ProxyPass /app1/ balancer://myset/ ProxyPassReverse /app1/ balancer://myset/ ProxyPass /app2/ balancer://viewer/ ProxyPassReverse /app2/ balancer://viewer/ ProxyPass /app3/ balancer://prsreg/ ProxyPassReverse /app3/ balancer://prsreg/ # 最后配置根路径的代理(如果需要) ProxyPass / balancer://myset/ ProxyPassReverse / balancer://myset/ <Location /app1> Require all granted </Location> <Location /app2> Require all granted </Location> <Location /app3> Require all granted </Location> </IfModule>
关键配置说明
- 模块加载:确保只加载必要的模块,避免重复加载导致的警告或异常。
- 会话粘性:
stickysession=JSESSIONID|jsessionid中,JSESSIONID是cookie名称,|jsessionid告诉Apache从cookie值的后缀中提取路由标识(对应你设置的-DjvmRoute=jvmx),确保同一用户的请求始终路由到同一后端实例。 - ProxyPass顺序:Apache会按照配置的顺序匹配路径,因此必须把更具体的路径(如
/app1/)放在宽泛路径(如/)前面,否则具体路径的规则不会生效。 - ProxyPassReverse:用于修正后端返回的重定向、Location响应头,将后端的地址替换为Apache的前端地址,避免暴露后端端口。
- BalancerMember协议:必须明确指定
http://或https://,确保代理请求的协议正确。
内容的提问来源于stack exchange,提问作者Maha Sonu
相关产品推荐
相关产品推荐

