Openshift PAAS中Apache负载均衡返回502错误伴AH01102、AH00898日志报错
故障根因
- 配置逻辑不符合Apache负载均衡要求
当前你直接配置两条路径完全相同的ProxyPass "/services"规则,无法实现预期的负载均衡效果。Apache mod_proxy默认按配置顺序匹配规则,仅当第一条配置的API_A完全不可用时才会 fallback 到第二条API_B,并非流量分摊的负载均衡逻辑。同时同路径多ProxyPass规则会导致mod_proxy内部上游连接池管理混乱,出现连接状态判断错误、无效连接复用的问题,直接触发AH01102报错。 - Openshift内部网络连通性异常
API_B未收到请求说明TCP连接未成功建立,常见原因如下:- 负载均衡Pod的NetworkPolicy未放行到API_B服务80端口的出流量
- API_B对应的K8s Service配置错误,包括端口映射错误、后端Endpoint为空、服务名解析失败
- Openshift SDN网络存在偶发丢包,或短时间内连接请求超过API_B Service的会话并发上限
- 长连接配置不匹配
你给API_B配置了Keepalive=On,但API_B本身或者其前端的Openshift Route/Service未开启长连接支持,或长连接超时时间远小于Apache的默认长连接超时,导致Apache复用了已经被上游关闭的连接发送请求,直接触发读状态行失败的报错。
修复方案
1. 修正负载均衡配置
改用标准的mod_proxy_balancer配置实现两个上游的负载均衡,示例配置如下:
<VirtualHost *:8080> # 定义负载均衡池 <Proxy "balancer://api_cluster"> BalancerMember "${API_A}/services" timeout=30 BalancerMember "${API_B}/services" retry=3 acquire=3000 timeout=5000 Keepalive=On # 配置负载均衡策略,默认按请求数轮询,可根据需求调整为bytraffic/bybusyness ProxySet lbmethod=byrequests </Proxy> # 统一代理规则 ProxyPass "/services" "balancer://api_cluster" ProxyPassReverse "/services" "balancer://api_cluster" # 原有静态资源配置保持不变 DocumentRoot "/opt/app-root/src/web" <Directory "/opt/app-root/src/web"> AllowOverride FileInfo Indexes Options=Indexes,MultiViews Require all granted </Directory> </VirtualHost>
2. 排查修复Openshift网络问题
- 进入负载均衡Pod内部,执行
curl -v ${API_B}/services/health(替换为实际健康检查路径)验证API_B服务是否可以正常连通,排查DNS解析、端口连通性问题 - 检查负载均衡Pod所在命名空间的NetworkPolicy,确认允许到API_B所在命名空间、80端口的出流量
- 检查API_B Service的Endpoint列表,确认后端Pod IP正常、处于就绪状态
3. 优化长连接配置
如果修正以上配置后仍然有报错,可添加以下配置对齐上下游长连接超时,或临时禁用长连接验证:
# 在VirtualHost配置块内添加,对齐Openshift Service默认30s超时,ttl设置略小于上游超时 ProxyPass "/services" "${API_B}/services" retry=3 acquire=3000 timeout=5000 Keepalive=On ttl=25 # 若仍有报错可临时禁用长连接复用来验证问题 # SetEnv force-proxy-request-1.0 1 # SetEnv proxy-nokeepalive 1
内容的提问来源于stack exchange,提问作者Mohamed El-Harrougui
相关产品推荐
相关产品推荐

