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测试工具进行测试)

1
ab -c 1 -n 10 http://127.0.0.1/            # 测试命令

  测试过程中查看nginx的访问日志 ,这时候你会发现当并发为1时,返回值都是200 ,访问正常

  修改测试方式:

1
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测试工具进行测试)

1
ab -c 5 -n 1000 http://127.0.0.1/    # 测试命令(并发连接数为5 访问1000次)

  在nginx的统计日志中200和503的状态码出现的次数接近是2:1 说明配置生效成功

posted @   Brian_Zhu  阅读(6416)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示