nginx upstream的排错逻辑可能导致的一系列问题
[2010-04-22 12:22:49]
一、死循环
当设定proxy_next_upstream http_404,并且upstream里配置是max_fails=0,则访问到不存在文件时,将会有死循环现象,nginx负载明显升高,kill -HUP进程消逝很慢。同样的,proxy_next_upstream如果设定为其它值,例如http_503、invalid_header等也会有同样问题,但默认的error timeout不会出问题。
二、502 bad gateway
nginx的检测后端机制相对严格,默认的,某个后端一个失败的请求,就会令此后端暂停10秒。一般而言,不会有太多失败的请求,而且也不太可能所有机器在10秒内同时出问题;但世事总是难料,nginx->nginx的架构,常因后台服务器文件有错(通常是ssi),报出莫名其妙的错误,导致代理挂起此后端,然后proxy_next_upstream又将此请求导向下一台服务器,因此在10秒内,所有服务器都将被挂起……
解决此问题,最直接的办法是将max_fails设为0,关闭nginx屏蔽后端的功能,虽然有可能会造成死循环,但死循环还不至于很快停止服务,只是负载较高,至少可以挺一阵子。后端的错误如影响太大,还是要及时解决。
三、timeout
如果设定了max_fails=0,则某后端出了故障造成访问超时时不会被屏蔽,进而访问到此后端的请求都要等到超时才会跳到下一个后端,虽然请求最终还是成功了,但用户体验会变得很差。解决此问题的办法就是将超时时间调得很短,大概3-15秒,只要在用户(老板)能接受的范围内即可。