nginx 429状态码排查与处理方式

 更新时间:2025年07月02日 08:53:07   作者:alden_ygq  
这篇文章主要介绍了nginx 429状态码排查与处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

 Nginx 返回 429 Too Many Requests 错误表示客户端在短时间内发送了过多请求,触发了Nginx的请求限流规则

这通常是Nginx配置了请求频率限制(limit_req 模块)或连接数限制(limit_conn 模块)的结果。

以下是排查和解决方案:

1.确认限流配置位置

在Nginx配置文件中(通常是 nginx.conf 或 sites-enabled/ 下的文件),检查以下配置:

http {
    # 定义限流区域(通常放在 http 块中)
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 示例:每秒10请求

    server {
        location / {
            # 应用限流规则
            limit_req zone=one burst=20 nodelay; # 关键配置行
        }
    }
}
  • limit_req_zone: 定义限流区域(名称、内存大小、限流速率)。
  • limit_req: 在 location 或 server 块中启用限流。

2.调整限流参数

根据实际需求修改以下参数:

  • rate: 允许的平均请求速率。
  • 例如 rate=5r/s(每秒5次)或 rate=30r/m(每分钟30次)。
  • burst: 允许的突发请求数(临时超过 rate 的请求会被放入队列)。
  • nodelay: 突发请求立即处理(不延迟),但超过 burst 的请求会被拒绝。

示例调整:

# 放宽限流:每秒20请求 + 允许40个突发请求
limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
location / {
    limit_req zone=one burst=40 nodelay;
}

3.检查其他可能的限流配置

  • limit_conn (连接数限制):
limit_conn_zone $binary_remote_addr zone=addr:10m;
location / {
    limit_conn addr 10; # 每个IP最多10个并发连接
}

多级限流:检查是否在多个位置(如 serverlocation)重复配置了限流。

4.定位触发限流的客户端

查看Nginx错误日志,找到触发429的客户端IP:

grep "429" /var/log/nginx/error.log

输出示例:

2023/10/01 12:00:00 [error] 12345#0: *100000 limiting requests, client: 192.168.1.1, ...

5.临时禁用限流(测试用)

若需确认问题,可注释掉配置中的 limit_req 和 limit_conn 行,并重载Nginx:

sudo nginx -s reload

6.优化建议

区分静态资源:对静态文件(如图片/CSS)禁用限流:

location ~* \.(jpg|css|js)$ {
    limit_req off; # 不限制静态资源
}

按业务分层限流:对API路径设置更严格的限制:

location /api/ {
    limit_req zone=api_zone;
}

增大内存区域:如果IP很多,增加 limit_req_zone 的内存(如 zone=one:20m)。

7.高级场景:动态限流

如果需要动态调整限流规则(例如根据业务状态),可结合OpenResty + Lua脚本:

location / {
    access_by_lua_block {
        -- 自定义Lua脚本实现动态限流
    }
}

总结步骤

  • 检查Nginx配置:找到 limit_req 或 limit_conn 的位置。
  • 调整速率/突发值:根据业务需求优化参数。
  • 查日志确认触发源:分析是否由正常流量或爬虫导致。
  • 重载配置:修改后执行 sudo nginx -s reload

注意:

过严的限流会影响用户体验,过松则可能无法保护后端。建议通过压测确定合理阈值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 504 Gateway Timeout网关超时详细解决方法

    504 Gateway Timeout网关超时详细解决方法

    这篇文章主要介绍了504 Gateway Timeout网关超时详细解决方法的相关资料,504GatewayTimeout是HTTP状态码,表示网关或代理服务器在等待上游服务器响应时超时,常见触发场景包括Nginx超时、后端性能问题、网络延迟和服务器资源耗尽,需要的朋友可以参考下
    2025-02-02
  • nginx日志过大问题解决

    nginx日志过大问题解决

    nginx默认的日志在logs/access.log,并且是一直累加写入,时间长了就会非常大,本文主要介绍了nginx日志过大问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • nginx pod hook钩子优雅关闭示例详解

    nginx pod hook钩子优雅关闭示例详解

    这篇文章主要为大家介绍了nginx pod hook钩子优雅关闭示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Linux查看nginx安装目录和配置文件路径的实现

    Linux查看nginx安装目录和配置文件路径的实现

    本文主要介绍了Linux查看nginx安装目录和配置文件路径的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 为何要小心Nginx的add_header指令详解

    为何要小心Nginx的add_header指令详解

    这篇文章主要给大家介绍了关于为何说要小心Nginx的add_header指令的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • 5种nginx负载均衡配置方法分享

    5种nginx负载均衡配置方法分享

    这篇文章主要介绍了5种nginx负载均衡配置方法分享,分别是nginx自带的3种方法和2种第三方配置方法,需要的朋友可以参考下
    2014-07-07
  • Nginx配置PATHINFO隐藏thinkphp index.php

    Nginx配置PATHINFO隐藏thinkphp index.php

    这篇文章主要介绍了Nginx配置PATHINFO隐藏thinkphp index.php,本文直接给出配置示例,需要的朋友可以参考下
    2015-07-07
  • 一文详解Nginx的访问限制与访问控制

    一文详解Nginx的访问限制与访问控制

    访问限制是一种防止恶意访问的常用手段,可以指定同一IP地址在固定时间内的访问次数,访问控制是控制客户端对服务端的访问,并非仅限制请求次数,而是允许某些请求或者直接拒绝某些请求,本文给大家具体介绍了Nginx的访问限制与访问控制,需要的朋友可以参考下
    2024-09-09
  • Linux中Nginx的防盗链和优化的实现代码

    Linux中Nginx的防盗链和优化的实现代码

    今天是周末小编在值班哈,很开森,工作使我快乐,本文重点给大家介绍Linux中Nginx的防盗链和优化问题及实现代码,需要的朋友跟随小编一起看看吧
    2021-06-06
  • Nginx的URL重写及IP访问控制详解

    Nginx的URL重写及IP访问控制详解

    Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,广泛应用于 Web 服务中,除了基本的 HTTP 服务功能外, Nginx 还提供了许多强大的功能,如 URL 重写、 IP 访问控制和基本认证,本文小编给大家详细介绍了Nginx的URL重写及IP访问控制,需要的朋友可以参考下
    2025-05-05

最新评论