操作环境

  • 硬件:华为云服务器
  • 操作系统:Rocky Linux 9.0 64bit
  • 服务器软件:nginx 1.24.0,php 8.2.6,openssl 3.0.7,WordPress6.2.2

问题描述

最近,我在调试我的WordPress网站时,发现偶尔出现 service temporarily unavailable的错误提示,错误代码为 503。重新刷新一下,又能正常访问。

查看nginx的错误日志 error.log(一般位于nginx安装目录下的logs子目录,具体可查阅nginx.conf配置文件),发现有大量 limiting requests信息。现摘录其中之一如下:

经分析以上日志记录,发现是nginx的==流量控制策略==引起。日志记录的相关字段解释如下:

  • limiting requests – 表明日志条目记录的是被“流量限制”请求
  • excess – 每毫秒超过对应“流量限制”配置的请求数量
  • zone – 定义实施“流量限制”的区域
  • client – 发起请求的客户端IP地址
  • server – 服务器IP地址或主机名
  • request – 客户端发起的实际HTTP请求
  • host – HTTP报头中host的值

解决过程

1.检查nginx.conf配置文件

发现流量控制的相关参数如下:

其中的部分参数含义如下:

  • 10m表示区域大小,单位为MB,一般1MB可存储16000个IP地址的状态信息。
  • rate=1r/s表示最大请求速率为每秒不超过1个。
  • burst=5表示超出zone指定速率的情况下(上述的one区域,速率限制在每秒1个请求),客户端还能发起多少请求,超出此数量的请求,服务器返回 503错误代码,即 service temporarily unavailable

上述参数配置情况说明我的网站频繁发生 503错误,是由于nginx服务器流量控制参数设置太过保守,明显不合理所致。

2.优化nginx流量控制参数配置

具体优化有以下三点:

  • 一是调整速率,将 rate=1r/s改成 rate=10r/s
  • 二是调整突发参数,将 burst=5改成 burst=20
  • 三是开启不延迟转发,增加 nodelay参数。


nodelay表示采用不延迟的排队技术,burst表示队列长度,当突发请求在burst参数配置的数量之内时,服务器将不延迟立即转发。当某时刻有超出上述参数配置的突发请求产生时,比如25个,则前21个会立即转发,剩余4个会返回 503错误码。然后按rate参数定义的速率,每100ms队列会空出一个位置,加上rate参数定义的请求速率,每过100ms可以接受的请求数从2递增1,一直递增到21,此时(20个100ms即2s以后)可再接受21个突发请求,任何时候超出此数量(可接受请求数)的请求数会返回 503错误码。当不加 nodelay参数时,采用的是延迟排队技术,即可以接受burst指定数量的请求,按rate指定的速率(每100ms处理一个)延迟处理,不会返回 503错误码,但是超出burst指定数量的请求,会立即返回 503错误码。

优化后具体参数如下:

3.重新启动nginx服务器

具体指令: systemctl restart nginx

4.测试网站访问,并查看error.log

发现网站已经恢复正常,没有 limiting requests错误信息了。

参考资料

Nginx流控