最近碰到一个问题,手上有套架构的 nginx+lighttpd+ruby的网站,总是间断性的报不可用,按照常理来说,前端两台nginx做负载均衡,后面两台apache+resin应用,都做了很好的监控,如果服务挂掉了。首先肯定会不间断的报警,另外,不可能两台都挂了吧。而且是间隔性的,挂了立马就好了,这样的机率也非常小。 仔细想想,应该是前几天发布新版本后,才出现了这样的问题,决定仔细找一下问题原因,这样每天有个几分钟的不可用,也是挺让人苦恼的。

一,先从应用入手,查看lighttpd的应用日志。

A  lighttpd+ruby 服务器,发现有好多500错误,除了500的,其他也正常,和项目组沟通,这些500错误,全是蜘蛛抓的。而且我们没有这些链接, 对网站不影响,

第二台 lighttpd+ruby 服务器也是,都有很多500错误。

后端两台,如果排除这些500错误,应该没什么太大的问题。

二,看看前端nginx负载均衡器。

我们来看一下nginx的配置文件

乍一看,好像也没什么问题。经过仔细的检查。发现问题了,

我们来看一下,nginx配置文件里的这一句。

proxy_next_upstream error timeout http_503 http_500 http_502 http_504;

这句的意思,就是说 当遇到 503 、500、502、504错误时,跳到下一个节点。我在想,后端的lighttpd机器报很多500错误,虽然不影响,但是nginx 会跳到下一个节点,并在upstream里面fail_timeout值的时间内将此节点标记不可用。如果下一个节点还是500呢,又会标记不可用,那就完了,两个点都不可用,那不全挂了吗。

为了证实我的想法, 我找了一个报警的时间段。看了一下后端的lighttpd日志。

我们对比看一下,发现在 16.点52分 09- 10秒的时候。都出现了500错误。

我们看一下nginx在这个时间的错误日志

我们看到 在 16点 52分11秒的时候, nginx 出现报错, 报错的内容为 no live upstreams,意思就是没有后端机器了。也就是说,后端两台都不可用了。

找到错误原因,那就好解决了。

第一,联系项目组找到500错误的原因。并解决。

第二,修改nginx的配置文件, 在 proxy_next_upstream error timeout http_503 http_500 http_502 http_504;  这段里,将 http_500 去掉。意思也就是说,当出现500错误的时候,对nginx来不不影响,该干嘛还干嘛。

修改后,果然再没有报警问题。



转载于:https://blog.51cto.com/yaozb/1196577