关于HAProxy 的 acl配置随机生效(失效)的问题

很简单,需求是这样的:

就是把所有的 .js .css .html 以前 /image /img 下的文件使用另外一台专门处理静态资源的机器nginx来处理。其它的请求发到后端的tomcat集群去处理。

从源里安装

~ # aptitude show haproxy

版本是 1.4.18-0ubuntu3.1 .

然后添加配置最小的配置

frontend http-frontend
    bind www.example.com:80
    acl url_static_begin    path_beg /images /img
    acl url_static_end    path_end .html .css .js
    acl url_service     path_beg /service
    use_backend servers if url_service
    use_backend statics if url_static_begin
    use_backend statics if url_static_end
    default_backend servers
backend statics
   server serverstatic static.example.com:80 check

backend servers
   server server01 server01.example.com:8080 maxconn 800 check
   server server02 server02.example.com:8080 maxconn 800 check

这里的acl规则里添加了一个 /service 是因为系统里存在一些动态生成的js请求所以把这部分请求还是转发给了后端的tomcat集群上去了。配置完成后测试的时候,奇怪的事情发生了。发现配置的规则好像生效了,又好像不生效。发现不是所有的 js, css,请求都转发到static上去了。也不是所有的需要动态处理的请求都转发到tomcat集群上去了。某些请求转到static上去了。这根本就不是acl配置所需要的效果啊。

但是更奇怪的是我用 curl -I 去请求任何一个资源的时候又是我想要的结果。请求 .js被发送到static上去了。请求 .jsp 到tomcat去了。

google出来的文章都是这么写的看了官方的文档说明也没有看出有什么问题。折腾半天后终于在stackoverflow上面找到有人和我一样的情况

http://serverfault.com/questions/310338/haproxy-seems-to-be-load-balancing-instead-of-following-acl-rules

这人是觉得请求没有走acl配置的规则而走了负载均衡的配置,下面的人回答造成这个结果的原因是由于collection被重用了。这就对了。也能解释上面我测试出的情况了。

  1. 为什么会出现静态资源还走到tomcat集群去了,是由于那个静态资源的请求重用了还没有关闭的请求.jsp的那个链接。
  2. 同样为什么会出现应该转到tomcat集群的请求被转到了static去。那是由于.jsp的请求使用了之前请求static的那个链接。
  3. 为什么用curl -I 测试的时候逻辑又完全正确?因为curl测试的时候只有单个请求也就只有一个链接也就不存在使用之前使用过的keep-alive的链接。acl完全正常。

在上个帖子的回答里引用了另外一个帖子。

http://serverfault.com/questions/104350/why-am-i-getting-errors-in-my-haproxy-content-switching-config

在这里有详细一点的说明

Also, you're doing content switching, so please add "option httpclose" in your frontend or defaults section, otherwise second requests of keep-alive connections will not be matched.

所以解决方法就是将 option httpclose 添加到 frontend 或者 defaults 的配置里面。

frontend http-frontend
    option httpclose
    bind www.example.com:80
    acl url_static_begin    path_beg /images /img
    acl url_static_end    path_end .html .css .js
    acl url_service     path_beg /service
    use_backend servers if url_service
    use_backend statics if url_static_begin
    use_backend statics if url_static_end
    default_backend servers

这样就可以了。问题是解决了,可是如果禁用了keep-alive的话,那会极大的影响效率,那是不是可以这么理解,如果用到了acl的情况其实就只能做性能的牺牲?

至于为什么haproxy不能实现即使在reuse之前的链接的时候也去做acl的判断,我还不清楚,所在当我在shlug的邮件列表里提这个问题的时候Choas大神还怀疑这是不是haproxy的bug,让我去报一下bug。

这里也向各位大神请教是不是别有他法?感谢。

转载于:https://my.oschina.net/rory/blog/183150

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值