LVS+Keepalived+Nginx架构中,某天突然发现网站www.fffmo.com 部分用户访问巨慢或无法访问,有些可以访问。
查看当前后端web连接信息
ipvsadm -Ln
1
2
3
4
5
6
7
8
9
10
11
12
13
| Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.20:80 wlc
-> 192.168.10.7:80 Route 100 2 13
-> 192.168.10.6:80 Route 100 120 13
-> 192.168.10.5:80 Route 100 1363 45
|
LVS 选择的轮训方式为加权最少连接
1
2
3
4
5
6
7
8
9
10
| real_server 192.168.10.7 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
|
配置文件我们发现LVS默认用的是TCP检测方式,只要80端口能通,请求就会转发到后端服务器。 但实际wget 具体页面过去是502。10.7服务器80端口对于LVS来说是打开的,所以LVS会把请求转发给给它。
这就造成了为什么部分用户可以访问,有的用户无法访问的问题。
临时解决方案:10.7服务器的服务直接暂停。让lvs自动把它出。直到他恢复为止。
终极解决方案:LVS对后端Nginx URL的检测方式由端口改为 具体页面请求。这样避免端口检测是通的但服务已经死掉的情况。
如果页面请求ok 说明后端服务是通的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| real_server 192.168.10.7 80 {
weight 100
HTTP_GET {
url {
path /monitor/check.php
status_code 200
}
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
|