nginx.conf 配置如下:
upstream A {
server 10.x.x.x weight=3 max_fails=3 fail_timeout=0s;
server 10.x.x.x max_fails=3 fail_timeout=0s;
}
上面一台称为 A1 服务器吧 , 配置较高 , 因此给了较高的权重 , A2 服务器配置较低 , 权重默认没动 .
通过阿里云的监控发现 , A2 的 CPU 占用明显比 A1 高出不少 .
我翻了 A1 和 A2 的 access_log 发现 , 某个请求到达 Nginx 后会一直分发到 A2 服务器 , A1 的 log 则一直没有该请求.
但是也不是一直会这样 , 隔一段时间后 , A1 的 log 中再次发现有该请求过来 , 一段时间后再次消失.
我好纳闷 , 这是什么鬼 ......
有人知道这是为什么吗?谢谢啦.
1
ryd994 2017-04-22 13:22:38 +08:00 via Android
fail_timeout=0s
这不太对吧…… 要关 fail 功能的话 max_fails=0 不确定是否和问题有关 |
2
kenshin912 OP @ryd994
fail_timeout=0s 应该是没问题的 , 我这边 nginx -t 一直是 OK 的 , 而且也用了这么长时间了 . 现在唯一搞不懂的就是 , 为什么 A1 服务器上看 log , Nginx 并未将请求分发到 A1 而是全部分发到 A2 服务器了 . 隔一段时间以后 , A1 的 log 中发现请求被 Nginx 分发过来了 , 持续一段时间后就没了 , 如此往复 . 我在想是不是 Nginx 分发过来后 , A1 服务器是不是报了什么错误 , 导致 Nginx 认为 A1 有问题 , 进而将请求分发到 A2 服务器上. 隔一段时间后 , Nginx 再次尝试将请求分发到 A1 , 接着再报错再...... 可是奇怪的是 ,A1 和 A2 服务器的代码是一致的 , 唯一的区别是 A2 的 Apache 版本和 A1 不一致 , 并且开启了 HTTP2 . |
3
wtbhk 2017-04-22 14:48:02 +08:00
@kenshin912 请求来源是同一个吗
|
4
kenshin912 OP @wtbhk
是的 , 域名是 k.xxx.com , 解析到 Nginx 反向代理 , 反向代理分发到两台 Apache 服务器 . 真的好奇怪啊... 检查了配置文件 /usr/local/nginx/conf/vhost/xxx.conf server { listen 80; listen 443 ssl; server_name k.xxx.com ssl_certificate xxxxxxxxxxxxxxx.pem; ssl_certificate_key xxxxxxxxxxxxxx.key; access_log /xxxxx.log combined; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; if ($remote_addr ~ "xx.xx.xx.xxx") { proxy_pass http://B; } proxy_pass http://A; } } upstream A 里面配置了 2 个服务器 , 真心没搞懂这是为什么. |
5
zhaohehedola 2017-04-22 15:27:53 +08:00
会不会 A1 服务器 中间 挂掉 了一会?
|
6
kenshin912 OP @zhaohehedola
这个倒没有 , A1 服务器一直很正常, 因为 log 里面还有其他的域名通过另一个反向代理请求进来 , log 也正常输出. 反向代理 1 上的 log 如下: 115.x.x.x - - [22/Apr/2017:13:31:26 +0800] "GET /xxxxxxxx.php?m=xxx&c=xxx&a=xxxxxxInfo HTTP/1.0" 200 43 "-" 然后 A1 和 A2 两个服务器上的 log 应该都会有来自这个反向代理 1 的请求. 实际上只有 A2 服务器上的 log 显示一直有该反向代理请求进来 , A1 服务器的 log 则是大部分时间没有来自该反向代理的请求. |
7
sagaxu 2017-04-22 15:42:22 +08:00 1
交换 nginx 中 A1 和 A2 的配置,最简单就是把 nginx 配置中的 IP 互换,再观察一下效果
|
8
kenshin912 OP |
9
mazyi 2017-04-22 16:15:22 +08:00 via iPhone 1
@kenshin912 检查一下和两个 IP 的连通率
|
10
kenshin912 OP |
11
ryd994 2017-04-23 00:46:14 +08:00 via Android
我也是觉得 Nginx 把 A1 fail 掉了,所以建议你先试试 max_fails=0
|
12
kenshin912 OP 已经找到了原因 , 阿里云的安全设置中 , 防止 DDos 那里开启了每分钟 1500 个请求 , 超过就冻结 10 分钟...
添加白名单后解决. |