nginx 429狀態(tài)碼排查與處理方式
Nginx 返回 429 Too Many Requests 錯誤表示客戶端在短時間內發(fā)送了過多請求,觸發(fā)了Nginx的請求限流規(guī)則。
這通常是Nginx配置了請求頻率限制(limit_req 模塊)或連接數(shù)限制(limit_conn 模塊)的結果。
以下是排查和解決方案:
1.確認限流配置位置
在Nginx配置文件中(通常是 nginx.conf 或 sites-enabled/ 下的文件),檢查以下配置:
http {
# 定義限流區(qū)域(通常放在 http 塊中)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 示例:每秒10請求
server {
location / {
# 應用限流規(guī)則
limit_req zone=one burst=20 nodelay; # 關鍵配置行
}
}
}limit_req_zone: 定義限流區(qū)域(名稱、內存大小、限流速率)。limit_req: 在location或server塊中啟用限流。
2.調整限流參數(shù)
根據(jù)實際需求修改以下參數(shù):
rate: 允許的平均請求速率。- 例如
rate=5r/s(每秒5次)或rate=30r/m(每分鐘30次)。 burst: 允許的突發(fā)請求數(shù)(臨時超過rate的請求會被放入隊列)。nodelay: 突發(fā)請求立即處理(不延遲),但超過burst的請求會被拒絕。
示例調整:
# 放寬限流:每秒20請求 + 允許40個突發(fā)請求
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; # 每個IP最多10個并發(fā)連接
}多級限流:檢查是否在多個位置(如 server、location)重復配置了限流。
4.定位觸發(fā)限流的客戶端
查看Nginx錯誤日志,找到觸發(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.臨時禁用限流(測試用)
若需確認問題,可注釋掉配置中的 limit_req 和 limit_conn 行,并重載Nginx:
sudo nginx -s reload
6.優(yōu)化建議
區(qū)分靜態(tài)資源:對靜態(tài)文件(如圖片/CSS)禁用限流:
location ~* \.(jpg|css|js)$ {
limit_req off; # 不限制靜態(tài)資源
}按業(yè)務分層限流:對API路徑設置更嚴格的限制:
location /api/ {
limit_req zone=api_zone;
}增大內存區(qū)域:如果IP很多,增加 limit_req_zone 的內存(如 zone=one:20m)。
7.高級場景:動態(tài)限流
如果需要動態(tài)調整限流規(guī)則(例如根據(jù)業(yè)務狀態(tài)),可結合OpenResty + Lua腳本:
location / {
access_by_lua_block {
-- 自定義Lua腳本實現(xiàn)動態(tài)限流
}
}總結步驟
- 檢查Nginx配置:找到
limit_req或limit_conn的位置。 - 調整速率/突發(fā)值:根據(jù)業(yè)務需求優(yōu)化參數(shù)。
- 查日志確認觸發(fā)源:分析是否由正常流量或爬蟲導致。
- 重載配置:修改后執(zhí)行
sudo nginx -s reload。
注意:
過嚴的限流會影響用戶體驗,過松則可能無法保護后端。建議通過壓測確定合理閾值。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Linux查看nginx安裝目錄和配置文件路徑的實現(xiàn)
本文主要介紹了Linux查看nginx安裝目錄和配置文件路徑的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-01-01
Nginx配置PATHINFO隱藏thinkphp index.php
這篇文章主要介紹了Nginx配置PATHINFO隱藏thinkphp index.php,本文直接給出配置示例,需要的朋友可以參考下2015-07-07
Linux中Nginx的防盜鏈和優(yōu)化的實現(xiàn)代碼
今天是周末小編在值班哈,很開森,工作使我快樂,本文重點給大家介紹Linux中Nginx的防盜鏈和優(yōu)化問題及實現(xiàn)代碼,需要的朋友跟隨小編一起看看吧2021-06-06

