关于nginx上的limit_req_zone模块限流使用与geo与map的白名单配置
今天正好是五一假期 記錄一下前幾天關于開發中遇到的nginx上的問題
之前接口被人扒了 訪問量激增 之前的同事配置了一個nginx上的配置來解決 如下
1.在nginx的http模塊下面加上下面的語句
limit_req_zone $binary_remote_addr zone=test:10m rate=10r/s;說明:
區域名稱為test,這個名稱自定義即可,占用空間大小為10m,平均處理的請求頻率不能超過每秒十次。
binary_remote_addr是remote_addr(客戶端IP)的二進制格式,固定占用4個字節,這里官方文檔建議使用$binary_remote_addr,原因為保持內存存儲大小相等。
2.在nginx的server模塊下面加上下面的語句
location / {limit_req zone=test burst=20 nodelay ;說明:
burst表示在超過設定的處理速率后能額外處理的請求數。當rate=10r/s時,將1s拆成10份,即每100ms可處理1個請求。
nodelay針對的是burst 參數,指定了過多請求被延遲的delay限制。默認值為零,即延遲所有過多的請求。
因此,burst往往結合nodelay一起使用。
當時同事就是用這個方法解決了線上的問題,但是這樣導致出了另一個問題,就是這個接口還有其他單位的同事在使用,因為上面的配置是針對全部IP去進行的,所以其他單位的同事就來反饋問題了,于是就有了下面的方法
使用與geo與map的白名單配置
1.在nginx.conf的http部分中配置白名單:
geo $limit {default 1;127.0.0.1 0; } map $limit $limit_key {0 "";1 $binary_remote_addr; } limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;說明:
geo對于白名單(子網或IP都可以) 將返回0,其他IP將返回1。
map將limit轉換為limit_key,如果是limit是0(白名單),則返回空字符串;如果是1,則返回客戶端實際IP。
limit_req_zone限流的key不再使用binary_remote_addr,而是$limit_key來動態獲取值。如果是白名單,limit_req_zone 的限流key則為空字符串,將不會限流;若不是白名單,將會對客戶端IP進行限流。
按照以上的方法配置完了以后,我們在測試環境沒有問題,于是開始上線
!!!注意!!!
我們在上線修改完配置后,出現了另一個問題,這個問題很蠢,但是確實很容易發生,就是nginx的緩存問題
我們在修改完配置文件后,使用 ./nginx -s reload 對nginx進行重啟,發現沒有效果,于是開始排查,配置與測試環境一模一樣,于是繼續修改,加上了access.log,想看一下日志,結果access.log修改完后重啟nginx也沒生效,access.log文件被創建了,但是沒有日志打印上去。
最后的解決方案是使用stop停止nginx服務,再重新啟動,問題完美解決
下面把nginx使用到的指令貼到下面
./nginx:啟動nginx ./nginx -s stop:關閉nginx ./nginx -s reload:重新加載配置 ./nginx -t:檢測配置文件是否正常總結
以上是生活随笔為你收集整理的关于nginx上的limit_req_zone模块限流使用与geo与map的白名单配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深信服2019春招编程第一题
- 下一篇: 用CAD绘制奥迪车标