歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Nginx限制連接數ngx

Nginx限制連接數ngx

日期:2017/2/27 15:49:23   编辑:Linux教程

一. 前言

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

二. ngx_http_limit_conn_module指令解釋

limit_conn_zone
語法: limit_conn_zone $variable zone=name:size;
默認值: none
配置段: http
該指令描述會話狀態存儲區域。鍵的狀態中保存了當前連接數,鍵的值可以是特定變量的任何非空值(空值將不會被考慮)。$variable定義鍵,zone=name定義區域名稱,後面的limit_conn指令會用到的。size定義各個鍵共享內存空間大小。如:

limit_conn_zone $binary_remote_addr zone=addr:10m;

注釋:客戶端的IP地址作為鍵。注意,這裡使用的是$binary_remote_addr變量,而不是$remote_addr變量。
$remote_addr變量的長度為7字節到15字節,而存儲狀態在32位平台中占用32字節或64字節,在64位平台中占用64字節。
$binary_remote_addr變量的長度是固定的4字節,存儲狀態在32位平台中占用32字節或64字節,在64位平台中占用64字節。
1M共享空間可以保存3.2萬個32位的狀態,1.6萬個64位的狀態。
如果共享內存空間被耗盡,服務器將會對後續所有的請求返回 503 (Service Temporarily Unavailable) 錯誤。
limit_zone 指令和limit_conn_zone指令同等意思,已經被棄用,就不再做說明了。

limit_conn_log_level
語法:limit_conn_log_level info | notice | warn | error
默認值:error
配置段:http, server, location
當達到最大限制連接數後,記錄日志的等級。

limit_conn
語法:limit_conn zone_name number
默認值:none
配置段:http, server, location
指定每個給定鍵值的最大同時連接數,當超過這個數字時被返回503 (Service Temporarily Unavailable)錯誤。如:

limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
    location /www.ttlsa.com/ {
        limit_conn addr 1;
    }
}

同一IP同一時間只允許有一個連接。
當多個 limit_conn 指令被配置時,所有的連接數限制都會生效。比如,下面配置不僅會限制單一IP來源的連接數,同時也會限制單一虛擬服務器的總連接數:

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
    limit_conn perip 10;
    limit_conn perserver 100;
}

【warning]limit_conn指令可以從上級繼承下來。[/warning]

limit_conn_status
語法: limit_conn_status code;
默認值: limit_conn_status 503;
配置段: http, server, location
該指定在1.3.15版本引入的。指定當超過限制時,返回的狀態碼。默認是503。

limit_rate
語法:limit_rate rate
默認值:0
配置段:http, server, location, if in location
對每個連接的速率限制。參數rate的單位是字節/秒,設置為0將關閉限速。 按連接限速而不是按IP限制,因此如果某個客戶端同時開啟了兩個連接,那麼客戶端的整體速率是這條指令設置值的2倍。

三. 完整實例配置

http {
    limit_conn_zone $binary_remote_addr zone=limit:10m;
    limit_conn_log_level info;
 
    server {
        location  ^~ /download/ { 
            limit_conn limit 4;
            limit_rate 200k;
            alias /data/www.ttlsa.com/download/;
                }
    }
}

四. 使用注意事項

事務都具有兩面性的。ngx_http_limit_conn_module 模塊雖說可以解決當前面臨的並發問題,但是會引入另外一些問題的。如前端如果有做LVS或反代,而我們後端啟用了該模塊功能,那不是非常多503錯誤了? 這樣的話,可以在前端啟用該模塊,要麼就是設置白名單,白名單設置參見後續的文檔,我會整理一份以供讀者參考。
原文:http://www.ttlsa.com/nginx/nginx-limited-connection-number-ngx_http_limit_conn_module-module/
Copyright © Linux教程網 All Rights Reserved