公司最近出了个很严重的事故,不是bug,网关层返回给用户一些502 错误,致使被客户投诉。因而总结下。php
该文章后续仍在不断的更新修改中, 请移步到原文地址http://dmwan.cc。nginx
公司有个业务网关是openresty,后面负载均衡给一些php 进程,而后客户请求增多后,网关报了502给客户。这个事情,很严重。这里主要分析两个事情,一个是502 的缘由,一个是如何解决这个事情。这里报502给客户是绝对不能容许的!后端
首先,502 的缘由。nginx 在upstream 状况下,分两种,一种是tcp 建联成功,一种是http建联成功。当tcp建联失败或者当下游服务器繁忙,http 建联失败,这种状况nginx 会直接返回状态码502给客户端。状况就是后端负载过高,扛不住。服务器
而后,咱们须要的是解决502的问题,直接后端加机器呗?可是这里要更深刻下,怎么防止502状态码回传客户,或者说,这些失败的请求可否从新执行,实际上是能够的!负载均衡
有几种作法:tcp
第一种,客户限频,超频的请求,直接返回503。对客户限频是正常的作法。设置模块ngx_http_limit_req_module,历来源上限制。rest
第二种,拦截error,重定向另一台机器。注意报警,防止雪崩!这里使用proxy_next_upstream 参数就能够。能够设置的参数:进程
第三种,拦截error,重定向错误页面,或者返回503,告知客户已经超频。get