线上状态码引发 bug 后的一些总结

    公司最近出了个很严重的事故,不是bug,网关层返回给用户一些502 错误,导致被客户投诉。于是总结下。

    该文章后续仍在不断的更新修改中, 请移步到原文地址http://dmwan.cc

    第一个问题,公司有个业务网关是openresty,后面负载均衡给一些php 进程,然后客户请求增多后,网关报了502给客户。这个事情,很严重。这里主要分析两个事情,一个是502 的原因,一个是如何解决这个事情。这里报502给客户是绝对不能允许的!

    首先,502 的原因。nginx 在upstream 情况下,分两种,一种是tcp 建联成功,一种是http建联成功。当tcp建联失败或者当下游服务器繁忙,http 建联失败,这种情况nginx 会直接返回状态码502给客户端。情况就是后端负载太高,扛不住。

    然后,我们需要的是解决502的问题,直接后端加机器呗?但是这里要更深入下,怎么防止502状态码回传客户,或者说,这些失败的请求能否重新执行,其实是可以的!

    有几种做法:

    第一种,客户限频,超频的请求,直接返回503。对客户限频是正常的做法。设置模块ngx_http_limit_req_module,从来源上限制。

    第二种,拦截error,重定向另外一台机器。注意报警,防止雪崩!这里使用proxy_next_upstream 参数就可以。可以设置的参数:

    第三种,拦截error,重定向错误页面,或者返回503,告知客户已经超频。

猜你喜欢

转载自my.oschina.net/u/2950272/blog/1810437
今日推荐