Nginx upstream 配置问题
问题发现
连续加班鏖战一个月的新项目终于上线了,上来就碰到一个很严重的问题,业务代码有一个访问量较高的请求有bug,已某种姿势访问会导致后台进程直接崩掉,这还不是最悲剧的,最悲剧的是我们是通过挡在最前端的nginx做路由的,nginx中配置了以轮询的方式访问后台进程,然后一个请求就能将后台进程一一打死,然后手机邮件的报警就疯掉了。。
问题分析
问题很简单,nginx轮询方式访问upstream池中的机器,第一台没有返回则会转发给第二台,然后依次转发,明显就是nginx配置出了问题,这时候就需要项目组的nginx专家出场了,咳咳~
问题解决
nginx中有个配置参数proxy_next_upstream,是访问upstream池中机器是否向后转发的开关,默认是打开的,这样就会造成一个请求将后台有bug的进程一一打死的情况,将这个参数设置为off就ok了,但是这样如果恰巧就是有的进程响应较慢,达到了upstream超时,也不往其他upsteam池中的其他进程转发了,也会对用户体验造成影响,这里还有一个配置参数proxy_next_upstream_tries,用于配置向后转发的次数,我将这个值配置为2,这样就不会导致后台进程被全部打死,同时又让请求有机会转发,当然这个折中方式也是我拍脑袋想的,具体还要看线上运行情况修改配置。