nginx 访问503的处理思路

前几天访问自己的博客,有些图片资源直接吐了503。于是展开了排查,最终还是解决了。下面说下解决思路

首先,要理解503错误的原因是什么?

HTTP 协议会通过一些状态码来表示服务端相应给客户端的状态,通过状态码能够大致确定故障问题的原因,比如 401 错误 通常来说就是认证出现了问题。那么 503 则是由于服务器负载过高导致无法处理请求而返回的状态。

知道了原因,我们就来进行排查,我们可以从以下几个方面排查:

1.服务器当前的负载是否过高,因为我的是一个小内存服务器,这种负载过高的问题时有发生,所以当时我就去看了下负载,发现很正常

[root@aliyun ~]# uptime
 09:20:19 up 22:29,  2 users,  load average: 0.00, 0.01, 0.05

2.然后检查内存,虽然小,但是也没用完。

3.检查 nginx 配置,嗯。在查配置的时候发现了这么一条

 #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为20个,
#1M能存储16000个状态,rete的值必须为整数,
#如果限制两秒钟一个请求,可以设置成30r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
    ...
    server{
        ...
        location {
            ...

            #限制每ip每秒不超过20个请求,漏桶数burst为5
            #brust的意思就是,如果第1秒、2,3,4秒请求为19个,
            #第5秒的请求为25个是被允许的。
            #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
            #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
            #第1秒25个请求时,5个请求放到第2秒执行,
            #设置nodelay,25个请求将在第1秒执行。

            limit_req zone=allips burst=5 nodelay;
            ...
        }
        ...
    }
    ...

先注释掉,然后重启下,发现问题没有了。原因就是限制了每个 IP 的请求,导致服务器拒绝了。