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)文章
504?Gateway?Timeout網(wǎng)關(guān)超時(shí)詳細(xì)解決方法
這篇文章主要介紹了504?Gateway?Timeout網(wǎng)關(guān)超時(shí)詳細(xì)解決方法的相關(guān)資料,504GatewayTimeout是HTTP狀態(tài)碼,表示網(wǎng)關(guān)或代理服務(wù)器在等待上游服務(wù)器響應(yīng)時(shí)超時(shí),常見觸發(fā)場(chǎng)景包括Nginx超時(shí)、后端性能問題、網(wǎng)絡(luò)延遲和服務(wù)器資源耗盡,需要的朋友可以參考下2025-02-02nginx pod hook鉤子優(yōu)雅關(guān)閉示例詳解
這篇文章主要為大家介紹了nginx pod hook鉤子優(yōu)雅關(guān)閉示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Linux查看nginx安裝目錄和配置文件路徑的實(shí)現(xiàn)
本文主要介紹了Linux查看nginx安裝目錄和配置文件路徑的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01Nginx配置PATHINFO隱藏thinkphp index.php
這篇文章主要介紹了Nginx配置PATHINFO隱藏thinkphp index.php,本文直接給出配置示例,需要的朋友可以參考下2015-07-07Linux中Nginx的防盜鏈和優(yōu)化的實(shí)現(xiàn)代碼
今天是周末小編在值班哈,很開森,工作使我快樂,本文重點(diǎn)給大家介紹Linux中Nginx的防盜鏈和優(yōu)化問題及實(shí)現(xiàn)代碼,需要的朋友跟隨小編一起看看吧2021-06-06