1. 程式人生 > >Nginx限流

Nginx限流

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。

在當今流量徒增的網際網路時代,很多業務場景都會涉及到高併發。這個時候介面進行限流是非常有必要的,而限流是Nginx最有用的特性之一,而且也是最容易被錯誤配置的特性之一。本篇文章主要講講Nginx如何對介面進行限流。

Nginx限流主要分為兩種方式:

  • 限制訪問頻率
  • 限制併發連線數

為什麼需要限流?開源人員可以通過限流限制訪問速度來防止外部暴力掃描,或者減少密碼被暴力破解的可能性。也可以解決流量突發問題(如線上活動導致訪問量突增)。用一句話來概括就是說限流是用於保護伺服器不會因為承受不住同一時刻的大量併發請求而宕機。接下來我們分別來看看Nginx的兩種限流方式:

限制訪問頻率
限制訪問頻率其實需要分成兩種情況:正常情況下進行訪問頻率限制以及流量突發情況下進行訪問頻率限制。我們分別看看這兩種情況下Nginx是如何進行處理的:

正常流量限制訪問頻率
Nginx中使用ngx_http_limit_req_module模組來限制的訪問頻率,限制的原理實質是基於漏桶演算法原理來實現的。在nginx.conf配置檔案中可以使用limit_req_zone命令及limit_req命令限制單個IP的請求處理頻率。

我們可以先來看看這兩個命令的語法結構:

  • limit_req_zone key zone rate

對於上面語法結構的引數簡單做下解釋:

  • key: 定義需要限流的物件。
  • zone: 定義共享記憶體區來儲存訪問資訊。
  • rate: 用於設定最大訪問速率。

接下來我們看個簡單的例子:

http {
limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s;
}

server {
location / {
limit_req zone=myLimit;
rewrite / http://www.niyueling.cn permanent;
}
}

對配置簡單做下解釋:
上面binary_remote_addr就是key,表示基於客戶端ip(remote_addr)進行限流,binary_表示壓縮記憶體佔用量。定義了一個大小為10M,名稱為myLimit的記憶體區,用於儲存IP地址訪問資訊。rate設定IP訪問頻率,rate=5r/s表示每秒只能處理每個IP地址的5個請求。Nginx限流是按照毫秒級為單位的,也就是說1秒處理5個請求會變成每200ms只處理一個請求。如果200ms內已經處理完1個請求,但是還是有有新的請求到達,這時候Nginx就會拒絕處理該請求。

突發流量限制訪問頻率
上面的配置一定程度可以限制訪問頻率,但是也存在著一個問題:如果突發流量超出請求被拒絕處理,無法處理活動時候的突發流量,這時候應該如何進一步處理呢?Nginx提供burst引數結合nodelay引數可以解決流量突發的問題,可以設定能處理的超過設定的請求數外能額外處理的請求數。我們可以將之前的例子新增burst引數以及nodelay引數:

http {
limit_req_zone $binary_remote_addr zone=myLimit:10m rate=3r/s;
}

server {
location / {
limit_req zone=myLimit burst=5 nodelay;
rewrite / http://www.niyueling.cn permanent;
}
}

可以看到我在原有的location中的limit_req指令中添加了burst=5 nodelay,如果沒有新增nodelay引數,則可以理解為預先在記憶體中佔用了5個請求的位置,如果有5個突發請求就會按照200ms去依次處理請求,也就是1s內把5個請求全部處理完畢。如果1s內有新的請求到達也不會立即進行處理,因為緊急程度更低。這樣實際上就會將額外的5個突發請求以200ms/個去依次處理,保證了處理速率的穩定,所以在處理突發流量的時候也一樣可以正常處理。如果添加了nodelay引數則表示要立即處理這5個突發請求。

限制併發連線數
Nginx中的ngx_http_limit_conn_module模組提供了限制併發連線數的功能,可以使用limit_conn_zone指令以及limit_conn執行進行配置。接下來我們可以通過一個簡單的例子來看下:

http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}

server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.niyueling.cn permanent;
}
}

上面配置了單個IP同時併發連線數最多隻能10個連線,並且設定了整個虛擬伺服器同時最大併發數最多隻能100個連結。當然,只有當請求的header被伺服器處理後,虛擬伺服器的連線數才會計數。剛才有提到過Nginx是基於漏桶演算法原理實現的,實際上限流一般都是基於漏桶演算法和令牌桶演算法實現的。接下來我們來看看兩個演算法的介紹:

漏桶演算法
漏桶演算法是網路世界中流量整形或速率限制時經常使用的一種演算法,它的主要目的是控制資料注入到網路的速率,平滑網路上的突發流量。漏桶演算法提供了一種機制,通過它,突發流量可以被整形以便為網路提供一個穩定的流量。也就是我們剛才所講的情況。漏桶演算法提供的機制實際上就是剛才的案例:突發流量會進入到一個漏桶,漏桶會按照我們定義的速率依次處理請求,如果水流過大也就是突發流量過大就會直接溢位,則多餘的請求會被拒絕。所以漏桶演算法能控制資料的傳輸速率。

令牌桶演算法
令牌桶演算法是網路流量整形和速率限制中最常使用的一種演算法。典型情況下,令牌桶演算法用來控制傳送到網路上的資料的數目,並允許突發資料的傳送。Google開源專案Guava中的RateLimiter使用的就是令牌桶控制演算法。令牌桶演算法的機制如下:存在一個大小固定的令牌桶,會以恆定的速率源源不斷產生令牌。如果令牌消耗速率小於生產令牌的速度,令牌就會一直產生直至裝滿整個令牌桶。

漏桶演算法與令牌桶演算法的區別
兩種演算法都能夠限制資料傳輸速率,但令牌桶還允許某種程度的突發傳輸。因為令牌桶演算法只要令牌桶中存在令牌,那麼就可以突發的傳輸對應的資料到目的地,所以更適合流量突發的情形下進行使用。

如果喜歡我的文章,歡迎關注我的個人公眾號

相關推薦

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 限流算法 令牌桶算法 算法思想是: 令牌以固定速率產生,並緩存到令牌桶中; 令牌桶放滿時,多余的令牌被丟棄; 請求要消耗等比例的令牌才能被處理; 令牌不夠時,請求被緩存。 漏桶算法 算法思想是:

Nginx方案

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

圖解Nginx配置

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

Nginx

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

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_

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

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

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

nginx對ip的操作

一.背景   我們經常遇到這種情況,客戶使用生產環境進行了壓力測試,大量的請求,導致其他客戶的請求未能響應。   伺服器資源有限,但是客戶端來的請求在不斷的上漲, 為了保證一部分的請求能夠正常相應, 不得不放棄一些客戶端來的請求, 這個時候我們會選擇行的進行一些NGINX的

Nginx使用limit_req_zone對同一IP訪問進行

nginx可以使用ngx_http_limit_req_module模組的limit_req_zone指令進行限流訪問,防止使用者惡意攻擊刷爆伺服器。ngx_http_limit_req_module模組是nginx預設安裝的,所以直接配置即可。 首先,在nginx.con

nginx limit

超過每秒1次的請求就返回503 Sets the shared memory zone and the maximum burst size of requests. If the requests rate exceeds the rate configur

nginx實現分散式

表示在 myserver 這個叢集上, 使用 名稱為 perip 的限流配置4.用docker 部署 nginx 將上一步建立的 nginx.conf 配置檔案, 拷貝到linux 目錄 , /root/nginx/ 下 (目錄可以任意), 然後 一個docker 命令部署好 nginx 環境docker r

除了負載均衡,Nginx還可以做很多,、快取、黑白名單等

Nginx應該是現在最火的web和反向代理伺服器,沒有之一。 她是一款誕生於俄羅斯的高效能web伺服器,尤其在高併發情況下,相較

【高併發】面試官問我如何使用Nginx實現,我如此回答輕鬆拿到了Offer!

## 寫在前面 > 最近,有不少讀者說看了我的文章後,學到了很多知識,其實我本人聽到後是非常開心的,自己寫的東西能夠為大家帶來幫助,確實是一件值得高興的事情。最近,也有不少小夥伴,看了我的文章後,順利拿到了大廠Offer,也有不少小夥伴一直在刷我的文章,提升自己的內功,最終成為自己公司的核心業務開發人

Nginx】實現負載均衡、、快取、黑白名單和灰度釋出,這是最全的一篇了!

## 寫在前面 > 在《[【高併發】面試官問我如何使用Nginx實現限流,我如此回答輕鬆拿到了Offer!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247485388&idx=1&sn=0854d3f9b4