操作环境
- 硬件:华为云服务器
- 操作系统: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信息。现摘录其中之一如下:
1 2 3 |
2023/05/30 19:55:20 [error] 9109#0: *2459 limiting requests, excess: 5.926 by zone "one", client: 54.163.76.76, server: wslibai.com, request: "GET /wp-content/plugins/contact-form-7/includes/js/index.js?ver=5.7.6 HTTP/1.1", host: "wslibai.com", referrer: "https://wslibai.com/" |
经分析以上日志记录,发现是nginx的==流量控制策略==引起。日志记录的相关字段解释如下:
- limiting requests – 表明日志条目记录的是被“流量限制”请求
- excess – 每毫秒超过对应“流量限制”配置的请求数量
- zone – 定义实施“流量限制”的区域
- client – 发起请求的客户端IP地址
- server – 服务器IP地址或主机名
- request – 客户端发起的实际HTTP请求
- host – HTTP报头中host的值
解决过程
1.检查nginx.conf配置文件
发现流量控制的相关参数如下:
1 2 3 4 5 |
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ...... limit_req zone=one burst=5; |
其中的部分参数含义如下:
- 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错误码。
优化后具体参数如下:
1 2 3 |
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;<br> ......<br> limit_req zone=one burst=20 nodelay; |
3.重新启动nginx服务器
具体指令: systemctl restart nginx。
4.测试网站访问,并查看error.log
发现网站已经恢复正常,没有 limiting requests错误信息了。
This is a demo advert, you can use simple text, HTML image or any Ad Service JavaScript code. If you're inserting HTML or JS code make sure editor is switched to 'Text' mode.