很简单,需求是这样的:
就是把所有的 .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上面找到有人和我一样的情况
这人是觉得请求没有走acl配置的规则而走了负载均衡的配置,下面的人回答造成这个结果的原因是由于collection被重用了。这就对了。也能解释上面我测试出的情况了。
- 为什么会出现静态资源还走到tomcat集群去了,是由于那个静态资源的请求重用了还没有关闭的请求.jsp的那个链接。
- 同样为什么会出现应该转到tomcat集群的请求被转到了static去。那是由于.jsp的请求使用了之前请求static的那个链接。
- 为什么用curl -I 测试的时候逻辑又完全正确?因为curl测试的时候只有单个请求也就只有一个链接也就不存在使用之前使用过的keep-alive的链接。acl完全正常。
在上个帖子的回答里引用了另外一个帖子。
在这里有详细一点的说明
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。
这里也向各位大神请教是不是别有他法?感谢。