天天看點

nginx(3)之反向代理、限速

反向代理

原理

1、客戶機在發起請求時,不會直接發送給目的主機,而是先發送給代理伺服器;

2、代理伺服器接收客戶機請求後,再向業務伺服器送出請求;

3、業務伺服器 接收請求、處理請求 最後 響應請求;

3、代理伺服器接收業務主機傳回的資料;

4、代理伺服器響應用戶端請求;

5、用戶端通過浏覽器渲染請求并展示給使用者。

nginx(3)之反向代理、限速

正向代理

正向代理 是一個位于用戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得内容,用戶端向代理發送一個請求并指定目标(原始伺服器),然後代理向原始伺服器轉交請求并将獲得的内容傳回給用戶端。用戶端必須要進行一些特别的設定才能使用正向代理。

正向代理的用途:

  1. 通路原來無法通路的資源,如google;
  2.  可以做緩存,加速通路資源;
  3. 對用戶端通路授權,上網進行認證;
  4. 代理可以記錄使用者通路記錄(上網行為管理),對外隐藏使用者資訊;

應用場景

1、堡壘機應用:業務伺服器隻接收來自堡壘機的連結通路(例如:代理伺服器的Ip或特定端口),其他的都拒絕。

nginx(3)之反向代理、限速

2、釋出内網伺服器:

nginx(3)之反向代理、限速

 3、緩存應用:将靜态資料緩存起來,提高使用者體驗。根據28法則,緩存伺服器處理80%的資料,業務伺服器處理20%的資料。

nginx(3)之反向代理、限速

 代碼實作

用戶端 win7  http://192.168.244.128
反代  nginx  ip128
業務機器  https://www.cnblogs.com/fqh202 or http://101.37.225.65/      

在客戶機輸入 http://192.168.244.128,反代伺服器向 http://101.37.225.65/ 請求資料并傳回:

server {
    listen  80;
    server_name  www.abc.com;
    charset utf8;
    location / {
        proxy_pass http://101.37.225.65:80;
    }
}      

測試:

nginx(3)之反向代理、限速

限速

限制機關時間内的最大連接配接數:限制某個使用者在一個給定的時間段内能夠産生HTTP請求的數,最典型的就是12306網站,由于購票需要會不斷重新整理頁面,進而産生大量請求(而淘寶天貓雙十一不會不斷重新整理頁面),最終會導緻當機,是以必須限制機關時間内的最大連接配接數。

安全目的,例如 暴力破解密碼。

通過限制進來的請求速率,并且結合日志标記目标urls來幫助防範DDOS攻擊。

什麼是DDOS 攻擊?

它在短時間内發起大量請求,耗盡伺服器的資源,無法響應正常的通路,造成網站實質下線。

DDOS 裡面的 DOS 是 denial of service(停止服務)的縮寫,表示這種攻擊的目的,就是使得服務中斷。最前面的那個 D 是 distributed (分布式),表示攻擊不是來自一個地方,而是來自四面八方,是以更難防。你關了前門,他從後門進來;你關了後門,他從視窗跳起來。

參考:http://www.ruanyifeng.com/blog/2018/06/ddos.html

應用場景

1、DDOS防禦

2、下載下傳場景保護

原理和算法思想

水(請求)從上方倒入水桶,從水桶下方流出(被處理);

來不及流出的水存在水桶中(緩存),以固定的速率流出;

水桶滿後水溢出(丢棄)。

這個算法的核心是:緩存請求、勻速處理、多餘的請求直接丢棄。

實作方式

Nginx主要有兩種限速方式:按連接配接數限速(ngx_http_limit_conn_module)、按請求速率限速(ngx_http_limit_req_module)。

按連接配接數限速

按連接配接數限速是指限制單個IP(或者其他的key)同時發起的連接配接數,超出這個限制後,Nginx将直接拒絕更多的連接配接。

配置:

limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s;  # 每秒處理1個請求
server {
    listen       80;
    charset utf8;
    location / {
        root   html;
        index  index.html index.htm;
    }
    location /abc {
        limit_req zone=addr burst=5 nodelay;
    }
}      

第一段配置

第一個參數:$binary_remote_addr 表示通過remote_addr這個辨別來做限制,“binary_”的目的是縮寫記憶體占用量,是限制同一用戶端ip位址;

第二個參數:zone=addr:10m表示生成一個大小為10M,名字為addr的記憶體區域,用來存儲通路的頻次資訊;

第三個參數:rate=1r/s表示允許相同辨別的用戶端的通路頻次,這裡限制的是每秒1次,還可以有比如30r/m的;

第二段配置

第一個參數:zone=one 設定使用哪個配置區域來做限制,與上面limit_req_zone 裡的name對應;

第二個參數:burst=5,這個配置的意思是設定一個大小為5的緩沖區,當有大量請求(爆發)過來時,超過了通路頻次限制的請求可以先放到這個緩沖區内;

第三個參數:nodelay,如果設定,超過通路頻次而且緩沖區也滿了的時候就會直接傳回503,如果沒有設定,則所有請求會等待排隊

按請求速率限速

按請求速率限速是指限制單個IP(或者其他的key)發送請求的速率,超出指定速率後,Nginx将直接拒絕更多的請求。采用leaky bucket算法實作。

limit_conn_zone $binary_remote_addr zone=iozone:10m;
server {
    listen       80;
    charset utf8;
    location / {
        root   html;
        index  index.html index.htm;
    }
    location /cde {
        limit_conn iozone 1;
        limit_rate 100k;  # 最大下載下傳速率
    }
}      

$binary_remote_addr是限制同一用戶端ip位址

$server是限制同一server最大并發數

limit_conn為限制并發連接配接數,nginx 1.18以後用limit_conn_zone替換了limit_conn

限速前:

nginx(3)之反向代理、限速

限速後:

nginx(3)之反向代理、限速

轉載于:https://www.cnblogs.com/fqh202/p/9998804.html

繼續閱讀