最近遇到一个有趣的事情,在这里记录下来。
keepalive做LVS负载均衡。
截取部分架构图:
LVS做了负载均衡代理nginx。
其中nginx也做负载均衡,代理了tomcat,而且tomcat的资源还是NFS集中存储上的。
所以最后的结果就是配置keepalive时生成genhash
是相同的,我又查了下genhash
的信息,没有查到太多,多番研究后得出。
genhash
这个工具生成的MD5校验和是根据server提供的页面来计算的,如果页面相同生成的MD5校验和也是相同的。
keepalive
中的这个校验和是用来做健康检查的。最好不相同。
我的环境中用genhash生成的命令是这样写的
[root@localhost ~]# genhash -s 172.16.12.122 -p 80 -u /index.html
MD5SUM = 95a9e38ed40ad581299005622d4963ec
[root@localhost ~]# genhash -s 172.16.12.123 -p 80 -u /index.html
MD5SUM = 95a9e38ed40ad581299005622d4963ec
genhash -S使用到远程服务器的ssl连接。
genhash -s使用指定的远程服务器地址。
genhash -p使用指定的远程服务器端口。
genhash -u使用指定的远程服务器url。
genhash -V在GET查询中使用指定的virtualhost。
genhash -v使用详细模式输出。
genhash -h显示这个简短的内联帮助屏幕。
genhash -r显示版本号
得到的校验和是一样的。
我就很懵逼了,因为index.html的内容不同啊。
-u又是URL ,实际的访问地址应该是 http://172.16.12.122/index.html。
我又访问测试了下,发现index.html页面的问题。
因为nginx里设置了转发,所有的请求都被转走了,-u index.html这个选项不生效。MD5 生成时访问到的还是NFS 集中存储上相同的页面,根本没访问index.html。
找到了原因就好解决了。
就增加一个nginx的访问供keepalive做健康检查用就行了
而且这个建议换个名字。不要用index。
server {
listen 80;
server_name 172.16.12.122;
location /heal.html {
root /usr/local/nginx/html/;
index index.html index.htm heal.html;
}
location / {
proxy_pass http://WebA;
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
include /usr/local/nginx/conf/proxy.conf;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
上边是我的这段,2个location
。/heal.html
就是健康监测,生成MD5校验和用的。
heal.html要不一样生成的就不一样。这里边随便写点东西就好。
然后重新生成就ok了
[root@localhost ~]# genhash -s 172.16.12.122 -p 80 -u /heal.html
MD5SUM = b451e0427af20e3ec419231ebdf40c4a
[root@localhost ~]# genhash -s 172.16.12.123 -p 80 -u /heal.html
MD5SUM = 304193c30d5d188358e7786fb08c8858