控制nginx並發鏈接數量和客戶端請求nginx的速率
阿新 • • 發佈:2018-09-09
區域 自帶 available 位置 remote root clas php 客戶
一、控制nginx並發鏈接數
ngx_http_limit_conn_module這個模塊用於限制每個定義的key值的鏈接數,特別是單IP的鏈接數。
不是所有的鏈接數都會被計數,一個符合計數要求的連接數是整個請求頭已經被讀取的鏈接數。
控制nginx並發鏈接數量參數的說明如下:
1)、limit_conn_zone參數: 語法: limit_conn_zone key zone=name:size; 上下文http 用於設置共享內存區域,key可以是字符串、 nginx自帶變量或前兩個組合,如$binary_remote_addr、$server_name。name為內存區域的名稱,size為內存區域的大小。 2) limit_conn參數: 語法: limit_conn_zone_number; 上下文http\server\location 用於指定key設置最大連接數。當超過最大連接數時,服務器會返回503( Service Temporarily Unavailable)錯誤。
1)、限制單IP並發鏈接數
nginx的配置文件如下:
[root@nginx conf]# cat nginx.conf worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; worker_rlimit_nofile 65535; user www; events { use epoll; worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; server_tokens off; keepalive_timeout 65; limit_conn_zone $binary_remote_addr zone=addr:10m; ... ... server { listen 80; server_name www.dmtest.com; location / { root html; index index.php index.html index.htm; limit_conn addr 1; #限制單IP的並發鏈接為1 } }
2)、限制虛擬主機總鏈接數
不僅可以限制單IP的並發鏈接數,還可以限制虛擬主機總鏈接數,甚至可以對兩者同時限制,nginx的配置文件如下:
[root@nginx conf]# cat nginx.conf worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; worker_rlimit_nofile 65535; user www; events { use epoll; worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; server_tokens off; keepalive_timeout 65; limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn_zone $binary_name zone=perserver:10m; ... ... server { listen 80; server_name www.dmtest.com; location / { root html; index index.php index.html index.htm; limit_conn perserver 1; #限制虛擬主機連接數為2 } }
二、控制客戶端請求nginx的速率
ngx_http_limit_req_module模塊用於限制每個IP訪問每個定義key的請求速率。 limit_req_zone參數說明如下: 語法: limit_req_zone key zone=name:size rate=rate; 上下文:http 用於設置共享內存區域,key可以是字符串、 nginx自帶變量或前兩個組合,如$binary_remote_addr。 name為內存區域的名稱,size為內存區域的大小,rate為速率,單位為r/s,每秒一個請求。 limit_req參數說明如下: 語法: limit_req zone=name [burst=number] [nodelay]; 上下文:http、 server、 location 這裏運用了令牌桶原理, burst=num,一共有num塊令牌,令牌發完後,多出來的那些請求就會返回503。 換句話說,一個銀行,只有一個營業員,銀行很小,等候室只有5個人的位置。因此,營業員一個時刻只能為一個人提供服務,剩下的不超過5個人可以在銀行內等待, 超出的人不提供服務,直接返回503。 nodelay默認在不超過 burst值的前提下會排隊等待處理,如果使用此參數,就會處理完num+1次請求,剩余的請求都視為超時,返回503。
配置如下:
[root@nginx conf]# cat nginx.conf worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; worker_rlimit_nofile 65535; user www; events { use epoll; worker_connections 20480; } http { include mime.types; default_type application/octet-stream; sendfile on; server_tokens off; keepalive_timeout 65; limit_conn_zone $binary_remote_addr zone=addr:10m rate=1r/s; #以請求的客戶端IP作為key值,內存區域命名為noe,分配10m內存空間,訪問速率限制為1秒1次請求(request) ... ... server { listen 80; server_name www.dmtest.com; location / { root html; index index.php index.html index.htm; limit_conn perserver 1; #使用前面定義的名為one的內存空間,隊列值為5,即可以有5個請求排隊等待 } }
控制nginx並發鏈接數量和客戶端請求nginx的速率