Nginx學習筆記-反向代理及限速

反向代理的基本概念

客戶機再發送請求時不會直接發送到目的主機,而是先發送給代理服務器,代理服務器接受客戶機請求後,再向主機發出,並接受目的主機返回的數據,存放再代理服務器硬盤中,再返回給客戶機

數據流向如下:

client----send----->代理server----send----->目標server

client<----send-----代理server<----send-----目標server

反向代理的優點避免用戶直接訪問到業務主機,可以節省IP,避免業務主機直接再公網提供服務,提高一定的安全性。

一般情況下使用中間代理服務器處理靜態頁面的請求,降低業務主機的壓力,增加訪問速度,客戶體驗度高。

反向代理實現

準備

客戶端web訪問測試
代理端反向代理功能
業務端提供業務數據

配置:

修改配置文件server中得location

        location / {
            proxy_pass http://IP:port;
        }

通過客戶端做訪問測試,與設置得web頁面相同即可

常用優化配置:

        location / {
            proxy_pass http://IP:port;##請求轉向的服務器列表    
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;##提取用戶IP
            client_max_body_size 10m;#允許客戶端請求的最大單文件字節數
            client_body_buffer_size 128k;#緩衝區代理緩衝用戶端請求的最大字節數
            proxy_connect_timeout 90;#nginx和後端服務器連接超時時間
            proxy_send_timeout 90;#後端服務器數據回傳超時時間
            proxy_read_timeout 90;#連接成功後後端服務器響應超時時間
            proxy_buffer_size 4k;#代理服務器保存用戶頭信息的緩衝區大小
            proxy_buffers 4 32k;#緩衝區網頁平均在32k以下
            proxy_busy_buffers_size 64k;#高負荷下緩衝大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;#設定緩存文件夾大小,大於這個值將從upstream服務器傳
            }

限速

生活中常見的用到限速的有百度網盤、迅雷等軟件

從運維角度來說,限速的特性可以限制某個用戶在一個給定的時間內產生的htpp請求數,請求可以簡單到就是一個對於主頁的get請求或者一個登陸表格的pst請求

限速也可以用於安全目的上,比如暴力密碼破解***,通過限制進來的請求速率,並且(結合)日誌標記出目標URLs來幫助防範DDOS***,一般來說限流用在保護上游應用服務器不被在同一時刻的大量用戶請求淹沒。

限速的原理(漏桶原理)

算法思想:

  • 水(請求)從上方放入水桶

  • 水從出水口流出(被處理)

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

  • 水桶滿後水溢出(丟棄)

  • 算法的核心:緩存請求、勻速處理、多餘的請求直接丟棄

限速實現方式:

nginx限制IP連接和併發的方法有兩個模塊:

limit_req_zone 用來限制單位時間內的請求數,即訪問速率限制

limit_req_conn 用來限制同一時間的連接數,即併發數

模塊使用方法:

  • limit_req_zone 參數配置

  • syntax :limit_req_zone=name [bursh=num] [nodelay];

  • Default :-

  • context:http,server.location

示例一:訪問限速

配置文件如下:

#基於IP對下載速率做限制,限制每秒處理1次請求,對突發超過5個以後的請求放入緩存區

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    #表示通過remote_addr標識來做限制,"binary"的目的是縮寫內存佔用量,是限制同一客戶端IP地址
    #zone=test:10m表示生成一個大小爲10M,名字爲one的內存區域,用來存儲訪問的頻次信息
    #rate=1r/s表示允許相同標識的客戶端的訪問頻次,這裏限制的是每秒1次,還可以有比如30r/s
    limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s;
    server {
        listen       81;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /a {
            #zone=test 設置使用那個配置區域來做限制,與上面limit_req_zone中的name對應
            #burst=5 burst是爆發的意思,設置一個大小爲5的緩衝區當有大量請求(過來時),超過訪問頻次限制的請求先放入緩衝區內
            #nodelay 如果設置,超過訪問頻次且緩衝區滿額,返回503,如果沒有設置,則請求會排隊
            limit_req zone=test burst=5 nodelay;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

測試快速進行多次訪問,使用netstat查看是否有訪問等待

示例二:下載限速

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server {
        listen       81;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /a {
              #同一IP同一時間下載連接數
            limit_conn addr 1;
            #下載最大速率
            limit_rate 100k;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在html/a下生成一個大文件,不更新配置嘗試下載查看下載速率和可以同時下載是否有限制

reload配置文件後:

測試:

[root@loclhost conf]# wget http://10.16.0.9:81/a/bigfile
--2019-02-17 11:32:47--  http://10.16.0.9:81/a/bigfile
Connecting to 10.16.0.9:81... connected.
HTTP request sent, awaiting response... 200 OK
Length: 104857600 (100M) [application/octet-stream]
Saving to: ‘bigfile’
2% [>                                                             ] 2,150,400    100KB/s  eta 16m 42s

針對流媒體視頻流,一般的視頻都比較大采用這種方式,示例如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    server {
        listen       81;
        server_name  localhost;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /a {
              #同一IP同一時間下載連接數
            limit_conn addr 1;
            #下載最大速率
            limit_rate 100k;
            #下載到多少時開始限速
            limit_rate_after 250m;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章