nginx淺談之連接限制

一、信息記錄

在開始之前,nginx的配置文件nginx.conf中,一般都有兩個大部分,一個是server,另一個是http。下面,就來大致的解釋一下各個指令的意思。

http里面:

  access_log:用以記錄http返回的信息,而配置文件里記錄的,則是此文件的地址。

  log_format:記錄http信息。每個變量信息開頭用$表示。例如要記錄用戶信息(User-Agent),往此配置里加入變量$http_user_agent。

  sendfile:上篇文件也介紹過了,其主要作用是加快對靜態(tài)文件的處理。默認情況下是開啟(on)狀態(tài)。

  tcp_nopush:屬于nginx靜態(tài)資源配置模塊,把多個包一次性整合之后再發(fā)送給客戶端,而不是一次次發(fā),在sendfile開啟的情況下,提高                                網(wǎng)絡(luò)包的傳輸效率,可在http、server和location中配置,默認是關(guān)閉(off)狀態(tài)。

  tcp_nodelay:屬于nginx靜態(tài)配置模塊,盡量的把包發(fā)送出去,不要等待,用在實時性有要求的場景。一般在keepalive連接下,提高網(wǎng)絡(luò)                                包的傳輸實時性,可在http、server和location中配置,默認是開啟(on)狀態(tài)。

  keepalive_timeout:設(shè)置http連接超時時間。

在此,我們來嘗試一下nginx的客戶端狀態(tài)模塊,在http里面寫入如下信息

mystatus.JPG

之后,一般我們會檢查nginx語法的配置有沒有錯誤,輸入如下的檢查語法:nginx -t -c /etc/nginx/nginx.conf

如果語法有錯誤,就修改。沒有錯誤的話,我們來平滑重啟下服務(wù):nginx -s reload -c /etc/nginx/nginx.conf

然后打開瀏覽器,輸入ip(服務(wù)器ip)/mystatus,就可以看到nginx的狀態(tài)連接數(shù)了,如下圖:

status.JPG

二、連接和請求限制

我們經(jīng)常會遇到這種情況,服務(wù)器流量異常,負載過大等等。對于大流量惡意的攻擊訪問,會帶來帶寬的浪費,服務(wù)器壓力,影響業(yè)務(wù),往往考慮對同一個ip的連接數(shù),并發(fā)數(shù)進行限制。下面說說ngx_http_limit_conn_module 模塊來實現(xiàn)該需求。該模塊可以根據(jù)定義的鍵來限制每個鍵值的連接數(shù),如同一個IP來源的連接數(shù)。并不是所有的連接都會被該模塊計數(shù),只有那些正在被處理的請求(這些請求的頭信息已被完全讀入)所在的連接才會被計數(shù)。

連接限制

配置語法:limit_conn_zone key zone=name:size

解釋:其中key代表的是key值,name是空間的名字,size是空間的大小,此配置范圍只能是http里。

調(diào)用:limit_conn_zone number

解釋:zone表示的是空間名字,number表示的是同一時間訪問的個數(shù)。此調(diào)用可在http、server、location中調(diào)用。

例如,可以在http里寫入如下代碼:

limit_conn_zone $binary_remote_addr zone=conn_zone:1m;

然后在server的location部分加入如下代碼:

limit_conn conn_zone 1;

(注:這里用binary_remote_addr而不是remote_zone的原因是remote_addr的長度為7到15bytes,會話的信息長度為32bytes或 64bytes,而binary_remote_addr的長度為4bytes,會話信息長度為32bytes,當區(qū)大小為1M時,對于32bytes來說,大約可以記錄3200個會 話信息。)

上面配置之后,同一個ip同一時間只允許一個連接過來。

②請求限制

配置語法:limit_req_zone key zone:size rate=rate

解釋:zone表示區(qū)域名,size表示的是區(qū)域大小,而rate則是限制請求的速率。在http內(nèi)定義

調(diào)用:limit_req zone=name [burst=number][nodelay]

解釋:zone調(diào)用的名字,burst則是請求的剩余延遲數(shù)??稍趆ttp、server和location中調(diào)用。

例如可在http中加入如下代碼:

limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;

然后在server里面的location部分加入如下代碼:

limit_req zone=req_zone burst=3 nodelay;

通過以上設(shè)置之后,服務(wù)器在1s時間內(nèi)只允許客戶端請求一次,請求的次數(shù)多了則會把剩下的3個保留,延遲響應(yīng),其余的全部返回503.

注意事項:事物都具有兩面性的。ngx_http_limit_conn_module 模塊雖說可以解決當前面臨的并發(fā)問題,但是會引入另外一些問題的。如前 端如果有做LVS或反代,而我們后端啟用了該模塊功能,那不是非常多503錯誤了?這樣的話,可以在前端啟用該模塊,要么就是設(shè)置白名單。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容