Nginx控制并发连接数
ngx_http_limit_conn_module这个模块用于限制每个定义的key值的连接数,特别是单IP的连接数。
不是所有的连接数都会被计数。一个符合计数要求的连接是整个请求头已经被读取的连接。
控制nginx并发连接数量参数如下说明:
limit_conn_zone参数:
参数语法:limit_conn_zone key zone=name:szie;
上下文:http 标签块
用于设置共享区域内存,key可以是字符串、nginx自带变量或者前两个组合,如$binary_remove_addr、server_name为内存区域的名称,name为内存区域的名称,size为内存区域的大小。
limit_conn参数:
参数语法:limit_conn zone number;
上下文:http、server、location 标签块
用于指定key设置最大连接数,当超过最大连接数时,服务器会返回503错误。
限制单IP并发连接数
nginx配置文件如下:(红色标记为添加或者修改内容)
[root@Nginx conf]# cat nginx.conf worker_processes 4; worker_rlimit_nofile 65535; worker_cpu_affinity 0001 0010 0100 100; error_log logs/error.log; events { worker_connections 20480; } http { include mime.types; server_tokens on; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; #limit_req_zone $binary_remove_addr zone=one:10m rate=1r/s; #limit_req zone=one burst=5; limit_conn_zone $binary_remove_addr zone=addr:10m; # 添加limit_conn_zone参数 client_header_timeout 60; client_boby_timeout 15; send_timeout 60; client_max_boby_size 8m; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; include www_date/brian.conf; include www_date/brianzjz.conf; include www_date/status.conf; }
虚拟主机配置文件,添加limit_conn参数:
[root@Nginx www_date]# cat brian.conf server { listen 80; server_name www.brian.com; location / { root html/brian; index index.html index.htm; limit_conn addr 1; # 设置单IP连接数为1 auth_basic "brian training"; auth_basic_user_file /opt/nginx/conf/htpasswd; } location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off; } access_log logs/brian.log main gzip buffer=128k flush=5s; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
测试:(使用ab测试工具进行测试)
ab -c 1 -n 10 http://127.0.0.1/ # 测试命令
测试过程中查看nginx的访问日志 ,这时候你会发现当并发为1时,返回值都是200 ,访问正常
修改测试方式:
ab -c 2 -n 10 http://127.0.0.1/
测试过程中查看nginx的访问日志 ,这时候你会发现当并发为2时,状态码200和503间隔是1:1 说明nginx已经做了并发连接的限制,对超时连接做出了503响应
以上功能可以用于服务器下载,限制每次访问下载目录的连接数
限制虚拟主机总连接数:
不仅可以限制单IP的并发连接数,还可以限制虚拟主机的总连接数,甚至可以对两个同时限制
nginx配置文件如下:(红色标记为增加或者修改内容)
[root@Nginx conf]# cat nginx.conf worker_processes 4; worker_rlimit_nofile 65535; worker_cpu_affinity 0001 0010 0100 100; error_log logs/error.log; events { worker_connections 20480; } http { include mime.types; server_tokens on; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; #limit_req_zone $binary_remove_addr zone=one:10m rate=1r/s; #limit_req zone=one burst=5; limit_conn_zone $binary_remove_addr zone=addr:10m; # 添加下面红色标记的两项 limit_conn_zone $server_name zone=perserver:10m; client_header_timeout 60; client_boby_timeout 15; send_timeout 60; client_max_boby_size 8m; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; include www_date/brian.conf; include www_date/brianzjz.conf; include www_date/status.conf; }
虚拟主机配置文件:(红色标记为增加或者修改内容)
[root@Nginx www_date]# cat brian.conf server { listen 80; server_name www.brian.com; location / { root html/brian; index index.html index.htm; #limit_conn addr 1; limit_conn perserver 2; # 添加此项 auth_basic "brian training"; auth_basic_user_file /opt/nginx/conf/htpasswd; } location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off; } access_log logs/brian.log main gzip buffer=128k flush=5s; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
测试:(使用ab测试工具进行测试)
ab -c 5 -n 1000 http://127.0.0.1/ # 测试命令(并发连接数为5 访问1000次)
在nginx的统计日志中200和503的状态码出现的次数接近是2:1 说明配置生效成功