HAProxy前端ACL路径路由异常及请求重写方法咨询
HAProxy URI路由与路径重写问题解决方案
你猜的没错!这就是问题的核心——HAProxy默认会把完整的请求URI(包括/pulse_tim)转发给后端的pulse_tim服务器,但你的后端应用只监听/pulse路径,所以自然返回404。接下来我给你一步步修改配置,搞定这个问题:
一、修改前端ACL与路径重写配置
在你的frontend http_front里,针对is_pulse_uri_tim这个ACL,添加路径重写规则,把/pulse_tim替换成/pulse后再转发到后端。修改后的前端配置如下:
frontend http_front bind haproxy_ip:port stats uri /haproxy?stats acl is_pulse_uri path_beg /pulse acl is_pulse_uri_tim path_beg /pulse_tim # 针对pulse_tim的请求,重写URI路径 reqrep ^([^\ ]*\ )/pulse_tim(.*) \1/pulse\2 if is_pulse_uri_tim use_backend pulse if is_pulse_uri use_backend pulse_tim if is_pulse_uri_tim default_backend http_back
解释一下这条reqrep规则:
^([^\ ]*\ ):匹配请求行的方法和空格(比如GET)/pulse_tim(.*):匹配/pulse_tim以及后面的所有内容(比如/pulse_tim?param=1)\1/pulse\2:把匹配到的内容替换成「请求方法 + /pulse + 原路径后缀」,最终转发给后端的请求就变成了GET /pulse?param=1这类符合后端要求的格式
二、确认后端配置无问题
先确保你的pulse_tim后端配置的服务器IP、端口都正确,且后端应用确实能通过自身IP的/pulse路径正常访问:
backend pulse_tim server pulse_tim ip:port check server pulse_tim ip:port check backup
三、重载HAProxy配置
修改完成后,用以下命令重载HAProxy,让新配置生效:
# 通用重载命令 haproxy -f /etc/haproxy/haproxy.cfg -sf $(pidof haproxy) # 或者systemd环境下用 systemctl reload haproxy
四、测试验证
现在访问http://VIP/pulse_tim,应该就能正常路由到pulse_tim后端的/pulse路径,不会再出现404错误了。
额外优化小技巧
如果你的路径匹配需要更精确(比如不想误匹配/pulse_timxxx这类路径),可以把path_beg改成更精准的匹配规则:
# 仅匹配完全等于/pulse_tim的路径 acl is_pulse_uri_tim path /pulse_tim # 或者匹配/pulse_tim开头,后面是斜杠、参数或结束的情况 acl is_pulse_uri_tim path_reg ^/pulse_tim(/.*)?$
内容的提问来源于stack exchange,提问作者Szekely Zsolt Karoly
相关产品推荐
相关产品推荐

