nginx 429狀態(tài)碼排查與處理方式
Nginx 返回 429 Too Many Requests 錯(cuò)誤表示客戶端在短時(shí)間內(nèi)發(fā)送了過多請(qǐng)求,觸發(fā)了Nginx的請(qǐng)求限流規(guī)則。
這通常是Nginx配置了請(qǐng)求頻率限制(limit_req 模塊)或連接數(shù)限制(limit_conn 模塊)的結(jié)果。
以下是排查和解決方案:
1.確認(rèn)限流配置位置
在Nginx配置文件中(通常是 nginx.conf 或 sites-enabled/ 下的文件),檢查以下配置:
http {
# 定義限流區(qū)域(通常放在 http 塊中)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 示例:每秒10請(qǐng)求
server {
location / {
# 應(yīng)用限流規(guī)則
limit_req zone=one burst=20 nodelay; # 關(guān)鍵配置行
}
}
}limit_req_zone: 定義限流區(qū)域(名稱、內(nèi)存大小、限流速率)。limit_req: 在location或server塊中啟用限流。
2.調(diào)整限流參數(shù)
根據(jù)實(shí)際需求修改以下參數(shù):
rate: 允許的平均請(qǐng)求速率。- 例如
rate=5r/s(每秒5次)或rate=30r/m(每分鐘30次)。 burst: 允許的突發(fā)請(qǐng)求數(shù)(臨時(shí)超過rate的請(qǐng)求會(huì)被放入隊(duì)列)。nodelay: 突發(fā)請(qǐng)求立即處理(不延遲),但超過burst的請(qǐng)求會(huì)被拒絕。
示例調(diào)整:
# 放寬限流:每秒20請(qǐng)求 + 允許40個(gè)突發(fā)請(qǐng)求
limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
location / {
limit_req zone=one burst=40 nodelay;
}3.檢查其他可能的限流配置
limit_conn(連接數(shù)限制):
limit_conn_zone $binary_remote_addr zone=addr:10m;
location / {
limit_conn addr 10; # 每個(gè)IP最多10個(gè)并發(fā)連接
}多級(jí)限流:檢查是否在多個(gè)位置(如 server、location)重復(fù)配置了限流。
4.定位觸發(fā)限流的客戶端
查看Nginx錯(cuò)誤日志,找到觸發(fā)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.臨時(shí)禁用限流(測(cè)試用)
若需確認(rèn)問題,可注釋掉配置中的 limit_req 和 limit_conn 行,并重載Nginx:
sudo nginx -s reload
6.優(yōu)化建議
區(qū)分靜態(tài)資源:對(duì)靜態(tài)文件(如圖片/CSS)禁用限流:
location ~* \.(jpg|css|js)$ {
limit_req off; # 不限制靜態(tài)資源
}按業(yè)務(wù)分層限流:對(duì)API路徑設(shè)置更嚴(yán)格的限制:
location /api/ {
limit_req zone=api_zone;
}增大內(nèi)存區(qū)域:如果IP很多,增加 limit_req_zone 的內(nèi)存(如 zone=one:20m)。
7.高級(jí)場(chǎng)景:動(dòng)態(tài)限流
如果需要?jiǎng)討B(tài)調(diào)整限流規(guī)則(例如根據(jù)業(yè)務(wù)狀態(tài)),可結(jié)合OpenResty + Lua腳本:
location / {
access_by_lua_block {
-- 自定義Lua腳本實(shí)現(xiàn)動(dòng)態(tài)限流
}
}總結(jié)步驟
- 檢查Nginx配置:找到
limit_req或limit_conn的位置。 - 調(diào)整速率/突發(fā)值:根據(jù)業(yè)務(wù)需求優(yōu)化參數(shù)。
- 查日志確認(rèn)觸發(fā)源:分析是否由正常流量或爬蟲導(dǎo)致。
- 重載配置:修改后執(zhí)行
sudo nginx -s reload。
注意:
過嚴(yán)的限流會(huì)影響用戶體驗(yàn),過松則可能無法保護(hù)后端。建議通過壓測(cè)確定合理閾值。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
nginx 代理域名到另外一個(gè)域名的實(shí)現(xiàn)方法
本文主要介紹了nginx 代理域名到另外一個(gè)域名的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Nginx實(shí)現(xiàn)外網(wǎng)訪問內(nèi)網(wǎng)的步驟詳解
外網(wǎng)瀏覽器與內(nèi)網(wǎng)是不通的,但是外網(wǎng)與中間過渡服務(wù)器是通的,中間過渡服務(wù)器與內(nèi)網(wǎng)服務(wù)器是通的,這樣在外網(wǎng)訪問過渡服務(wù)器時(shí),過渡服務(wù)器再跳轉(zhuǎn)到后臺(tái)服務(wù)器,本文給大家介紹了Nginx外網(wǎng)訪問內(nèi)網(wǎng)如何實(shí)現(xiàn)步驟,需要的朋友可以參考下2023-10-10
解決nginx服務(wù)器上發(fā)布的新版本代碼總需要清除瀏覽器緩存問題
這篇文章主要介紹了解決nginx服務(wù)器上發(fā)布的新版本代碼總需要清除瀏覽器緩存問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Nginx日志統(tǒng)計(jì)分析的常用命令總結(jié)
這篇文章主要給大家總結(jié)了關(guān)于Nginx日志統(tǒng)計(jì)分析的一些常用命令,其中包括IP相關(guān)統(tǒng)計(jì)、頁(yè)面訪問統(tǒng)計(jì)、性能分析、蜘蛛抓取統(tǒng)計(jì)、TCP連接統(tǒng)計(jì)等相關(guān)命令的總結(jié),相信對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-07-07
CentOS7安裝Nginx并配置自動(dòng)啟動(dòng)的方法步驟
這篇文章主要介紹了CentOS7安裝Nginx并配置自動(dòng)啟動(dòng)的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
Nginx靜態(tài)文件處理和傳輸?shù)膬?yōu)化方法
Nginx 在處理靜態(tài)文件時(shí)非常高效,它可以直接從文件系統(tǒng)中讀取靜態(tài)文件并返回給客戶端,而不需要經(jīng)過復(fù)雜的處理流程,在本章中,我們將詳細(xì)介紹NGINX如何處理靜態(tài)文件以及傳輸優(yōu)化,需要的朋友可以參考下2025-06-06
linux下Nginx+Tomcat負(fù)載均衡配置方法
這篇文章主要介紹了linux下Nginx+Tomcat負(fù)載均衡配置方法,需要的朋友可以參考下2016-09-09

