1. 程式人生 > >Nginx限流方案

Nginx限流方案

電商平臺營銷時候,經常會碰到的大流量問題,除了做流量分流處理,可能還要做使用者黑白名單、信譽分析,進而根據使用者ip信譽權重做相應的流量攔截、限制流量。
Nginx自身有的請求限制模組ngx_http_limit_req_module、流量限制模組ngx_stream_limit_conn_module基於令牌桶演算法,可以方便的控制令牌速率,自定義調節限流,實現基本的限流控制。

對於提供下載的網站,肯定是要進行流量控制的,例如軟體下載站、視訊服務等。
它也可以減少一些爬蟲程式或者DDOS的攻擊。

對這兩個模組的介紹的文章也不少,這裡轉載一篇hopestar的文章: nginx限制IP連線數的範例參考, 因為他介紹的很簡潔。

下面文章的limit_zone指令已經被棄用,請用limit_conn_zone替換

如何Nginx限制同一個ip的連線數,限制併發數目:

限流

(1) 新增limit_zone和limit_req_zone

這個變數只能在http使用 :

vi /export/servers/nginx/conf/nginx.conf
limit_zone one  $binary_remote_addr  20m;
limit_req_zone  $binary_remote_addr  zone=req_one:20m rate=12r/s;

(2) 新增limit_conn 和limit_req

這個變數可以在httpserver

location使用 我是限制nginx上的所有服務,所以新增到http裡面 (如果你需要限制部分服務,可在nginx/conf/domains裡面選擇相應的server或者location新增上便可)

vi /export/servers/nginx/conf/nginx.conf
limit_zone one $binary_remote_addr 20m;
limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s;
limit_conn one 10;
limit_req zone=req_one burst=120;

引數詳解(數值按具體需要和伺服器承載能力設定,):

limit_zone,是針對每個變數(這裡指IP,即$binary_remote_addr)定義一個儲存session狀態的容器。這個示例中定義了一個20m的容器,按照32bytes/session,可以處理640000個session
limit_req_zone 與limit_zone類似。rate是請求頻率. 每秒允許12個請求。
limit_conn  one 10 : 表示一個IP能發起10個併發連線數
limit_req: 與limit_req_zone對應。burst表示快取住的請求數。

範例:

http
{
limit_zone one  $binary_remote_addr  20m;
limit_req_zone  $binary_remote_addr  zone=req_one:20m rate=12r/s;
limit_conn   one  10;
limit_req   zone=req_one burst=120;
server  {
      listen          80;
      server_name     status.xxx.com ;
      location / {
               stub_status            on;
               access_log             off;
      }
}
}

(3) 重啟nginx

/export/servers/nginx/sbin/nginx -s reload

Nginx限制流量/限制頻寬 具體參考官方文件

nginx白名單設定

以上配置會對所有的ip都進行限制,有些時候我們不希望對搜尋引擎的蜘蛛或者某些自己的代理機過來的請求進行限制, 對於特定的白名單ip我們可以藉助geo指令實現。

先在nginx的請求日誌進行統計,檢視那個ip的訪問量比較大, 執行:

cat access.log | grep "03/Jun" |awk '{print $1}'|sort |uniq -c|sort -nrk 1|head -n 10
#列出訪問日誌裡面在63號這天前10個訪問量最大的ip.

接下來就可以對這些IP進行分析了。看哪些需要進行白名單設定。

http{
   geo  $limited  {
    default          1;
    127.0.0.1/32     0;
    10.12.212.63     0;
  }
  map $limited $limit {
  1 $binary_remote_addr;
  0 "";
  }
  limit_zone one  $binary_remote_addr  20m;
  limit_req_zone  $limit  zone=req_one:20m rate=20r/s;
  limit_conn   one  10;
  limit_req   zone=req_one burst=120;
}

上面兩個需要用到map和geo模組,這是nginx自帶的模組,有的運維喜歡把他們關閉,自己./sbin/nginx -V 留意一下。把配置的--whithout-XXX-module 去掉重新編譯一下就可以了。 上面這段配置的意思是:

1.geo指令定義了一個白名單limited1iplimited變數,預設值為1,如果客戶端ip在上面的範圍內,limited的值為0
2.使用map指令對映搜尋引擎客戶端的ip為空串,如果不是搜尋引擎就顯示本身真實的ip,這樣搜尋引擎ip就不能存到limit_req_zone記憶體session中,所以不會限制搜尋引擎的ip訪問

PS:獲取客戶端的真實IP

順帶一提,為了獲取客戶端的真實IP。該模組需要安裝read_ip模組,運維應該預設有安裝。沒有的話也可自行安裝: 配置方式相當簡單,重新編譯 Nginx 加上 --with-http_realip_module 引數,如:

在server中增加:

set_real_ip_from   192.168.1.0/24;
set_real_ip_from   192.168.2.1;
real_ip_header     [X-Real-IP|X-Forwarded-For];

需要說明的地方就是設定IP源的時候可以設定單個IP,也可以設定IP段,另外是使用X-Real-IP還是X-Forwarded-For,取決於前面的伺服器有哪個頭。

set_real_ip_from 設定的IP端可以讓運維檢視日誌,看下你的請求是來自哪些ip段。

重新載入一下服務,差不多就OK了。

再檢視日誌的話,應該可以看到客戶端的真實IP了。

注意:如果未安裝該模組的話你的獲取到的IP端可能是來自前端代理(如squid)的IP,結果就是多個使用者被當成單個使用者對待,導致應用不能響應。 參考:http://hi.baidu.com/thinkinginlamp/item/e2cf05263eb4d18e6e2cc3e6

再PS一下: 自測: 有條件的自己可以用ab或者webben自測一下。

未安裝前壓測的話,因為有大量請求,所以access.log會有大量日誌,而error.log日誌沒有變化。

[[email protected] talk]# webbench  -c 30 -t 30 http:
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http:
30 clients, running 30 sec.
Speed=193468 pages/min, 1254317 bytes/sec.
Requests: 96734 susceed, 0 failed.

安裝後會發現很多超出的請求會返回503,所以access.log日誌變化不快,error.log有大量記錄,提示limit_reque緩住了多少請求。

[[email protected] talk]# webbench  -c 30 -t 30 http:
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http:
30 clients, running 30 sec.
Speed=120 pages/min, 778 bytes/sec.
Requests: 60 susceed, 0 failed.

原文地址:https://www.cnblogs.com/peteremperor/p/7342143.html

作者:Mr.peter

推薦閱讀

?

相關推薦

Nginx方案

電商平臺營銷時候,經常會碰到的大流量問題,除了做流量分流處理,可能還要做使用者黑白名單、信譽分析

Nginx (請求數)

pan rst 沒有 con 空間大小 限流 ssi 請求 status limit_req_zone 用於設置每個IP在單位時間內所允許發起的請求數,值 zone=rate=10r/s 表示每個IP每秒只允許發起10個請求。limit_req的作用類似與緩沖區,用於緩存還

nginx 配置 令牌桶演算法 漏桶演算法

令牌桶演算法 演算法思想是: 令牌以固定速率產生,並快取到令牌桶中; 令牌桶放滿時,多餘的令牌被丟棄; 請求要消耗等比例的令牌才能被處理; 令牌不夠時,請求被快取。 漏桶演算法 演算法思想是: 水(請求)從上方倒入水桶,從水桶下方流出

死磕nginx系列--nginx 配置

tex ror 開始 信息 arch 能力 令牌 關鍵字 anti 限流算法 令牌桶算法 算法思想是: 令牌以固定速率產生,並緩存到令牌桶中; 令牌桶放滿時,多余的令牌被丟棄; 請求要消耗等比例的令牌才能被處理; 令牌不夠時,請求被緩存。 漏桶算法 算法思想是:

微服務架構下的分散式方案思考

1.微服務限流 隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。快取、降級和限流是保護微服務系統執行穩定性的三大利器。快取的目的是提升系統訪問速度和增大系統能處理的容量,而降級是當服務出問題或者影響到核心流程的效能則需要暫時遮蔽掉,待高峰或者問題解決後再開啟,而有些場景並不能用快取和降級來解決,比如稀

阿里巴巴開源 Sentinel 方案搭建

Sentinel是阿里開源的一個限流方案框架具有以下特徵: 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的

圖解Nginx配置

本文以示例的形式,由淺入深講解Nginx限流相關配置,是對簡略的官方文件的積極補充。 Nginx限流使用的是leaky bucket演算法,如對演算法感興趣,可移步維基百科先行閱讀。不過不了解此演算法,不影響閱讀本文。 空桶 我們從最簡單的限流配置開始: limit_req_zone $binary_rem

Nginx

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。 在當今流量徒增的網際網路時代,很多業務場景都會涉及到高併發。這個時候介面進行限流是非常有必要的,而限流是Nginx最有用的特性之一,而且也是最容易被錯誤配置的特性之一。本篇文章主要講講Nginx如何對介面進行限流。

常見方案設計與實現

高併發系統設計的3個利器:快取、限流、降級,本文就限流相關演算法,分析其設計與實現。 從分散式角度來看,限流可分為分散式限流(比如基於Sentinel或者Redis的叢集限流)和單機限流。從演算法實現角度來看,限流演算法可分為漏桶演算法、令牌桶演算法和滑動時間視窗演算法。下面主要分析這3種限流演算法和分散式限

Nginx配置

在上一篇文章Nginx負載均衡配置中,我們已經介紹了關於nginx的安裝與nginx負載均衡配置相關的知識,今天主要講講nginx是如何限流的。 隨著業務的擴散,系統併發越來越高時,有三樣利器用來保護系統,分別是快取、降級和限流。 快取:快取是現在系統中必不可少的模組,並且已經成為了高併發高效能架構的

nginx問題

host 超時 sock 客戶 服務器 tle style index 代碼 http{ limit_req_zone $binary_remote_addr zone=req_one:10m rate=100r/s;server{ listen 8080;serve

Nginx如何實現讀寫的方法

http height normal radi wrap border ret ola style 針對Nginx請求,單個IP,每秒50讀次,寫10次。萬能的Nginx,幾行配置搞定# 先定義好規則,需要寫在server外面 limit_req_zone $binary_

分布式環境 解決方案

OS 訪問 right -c 拒絕 key ews 可行性分析 聲明 業務背景介紹 對於web應用的限流,光看標題,似乎過於抽象,難以理解,那我們還是以具體的某一個應用場景來引入這個話題吧。 在日常生活中,我們肯定收到過不少不少這樣的短信,“雙11約嗎?,千款…

nginx實現分布式(防DDOS攻擊)

第一步 root mapping nts LV web ons -o plain 1.前言 一般對外暴露的系統,在促銷或者黑客攻擊時會湧來大量的請求,為了保護系統不被瞬間到來的高並發流量給打垮, 就需要限流 . 本文主要闡述如何用nginx 來實現限流. 聽說

Java編程——服務器設計方案之應用

就是 常見 一次 一定的 處理 調用 針對 tro 阻塞 前言 在一個高並發系統中對流量的把控是非常重要的,當巨大的流量直接請求到我們的服務器上沒多久就可能造成接口不可用,不處理的話甚至會造成整個應用不可用。比如最近就有個這樣的需求,我作為客戶端要向kafka生產數據,而k

業務場景簡單實現方案:RateLimiter

前因:因為本系統中,有大資料高併發的場景。在向下遊系統傳送請求的時候,需要限流。否則會造成下游系統的堵塞。 實現方案1:   Thread.sleep(ms). 優點:簡單粗暴,一行程式碼搞定 缺點:有點low,萬一執行緒被搶了,無法喚醒怎麼辦   實現方案2:   Guava的Rat

Nginx 中的兩種方式

歡迎訪問陳同學部落格原文 系統設計時一般會預估負載,當系統暴露在公網中時,惡意攻擊或正常突發流量等都可能導致系統被壓垮,而限流就是保護措施之一。限流即控制流量,本文將記錄 Nginx 的二種限流設定。 生活中的 “限流”? 限流並非新鮮事,在生活中亦無處不在

Nginx配置之負載均衡、、快取、黑名單和灰度釋出

一、Nginx安裝(基於CentOS 6.5) 1.yum命令安裝 yum install nginx –y (若不能安裝,執行命令yum install epel-release) 2. 啟動、停止和重啟 service nginx start service nginx stop

基於nginx

limit_req 介紹 文件 nginx自帶的ngx_http_limit_req_module是漏桶演算法實現的請求限流模組。 示例配置 http { # 區域名稱為test,大小為10m,平均處理的請求頻率不能超過每秒一次 limit_req_z

httpdns中方案

採用令牌桶演算法的思想: github地址:https://github.com/juju/ratelimit 1、在Compass結構體中增加一個成員bucket,定義一個專門的初始化函式用於bucket的初始化 2、在server_route_d函式的第一行,呼叫buc