nginx-限速-限制并发连接数-限制请求数

nginx-限速


一、为什么要限制用户?

主要是因为服务器的资源有限(cpu、内存、带宽) --》预算有限 --》只能进行控制--》让大家都可以下载或者访问

限速 --》ngx_http_core_module

限制访问并发连接数--》ngx_http_limit_conn_module

爬虫 --》多进程或者多线程

限制请求数 --》ngx_http_limit_req_module


二、限制下载的速度

1. 进入html存放网页的目录,新建一个download的文件夹,用于给用户提供下载

root@nginx-1 html# mkdir download

复制/boot目录到download目录下

root@nginx-1 html# cd download/

root@nginx-1 download# cp /boot . -r

root@nginx-1 download# ls

boot

打一个压缩包,提供给用户下载测试使用

root@nginx-1 download# tar czf boot.tar.gz boot

root@nginx-1 download# ll -h

总用量 179M

dr-xr-xr-x 5 root root 4.0K 8月 15 16:25 boot

-rw-r--r-- 1 root root 179M 8月 15 16:25 boot.tar.gz


2.修改主配置文件,添加限制下载数据速度的配置

bash 复制代码
[root@nginx-1 download]# cd /usr/local/nginx8/conf/
[root@nginx-1 conf]# vim nginx.conf
    server {
        listen       80;
        server_name  www.feng.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        #添加下面的配置
        location /download {
        autoindex on;
        limit_rate_after 50k;
        limit_rate       5k;
        }

[root@nginx-1 conf]# nginx -t
nginx: the configuration file /usr/local/nginx8/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx8/conf/nginx.conf test is successful
[root@nginx-1 conf]# nginx -s reload

测试下载的限速的效果

bash 复制代码
[root@web-2 feng.com]# curl  -O http://192.168.100.157/download/boot.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0  178M    0  276k    0     0   6313      0  8:13:43  0:00:44  8:12:59  5115

三、限制并发连接数

ngx_http_limit_conn_module

limit_conn_zone $binary_remote_addr zone=perip:10m;

定义了一个共享内存区域(zone),用于存储客户端的连接限制状态。

$binary_remote_addr

键(Key):以客户端的二进制格式 IP 地址作为唯一标识。

相比 remote_addr(文本格式 IP),binary_remote_addr 更节省内存(固定 4 字节 IPv4 或 16 字节 IPv6)

zone=perip:10m

perip:自定义的共享内存区域名称(可任意命名)

10m:分配 10MB 的共享内存空间,用于存储 IP 和连接数的键值对。

bash 复制代码
[root@nginx-1 conf]# vim nginx.conf
limit_conn_zone $binary_remote_addr zone=perip:10m;
    server {
        listen       80;
        server_name  www.feng.com;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /download {
        autoindex on;
        limit_rate_after 50k;
        limit_rate       5k;
         limit_conn perip 1;  #一个客户端只能同时发起一个连接
        }
[root@nginx-1 conf]# nginx -t
nginx: the configuration file /usr/local/nginx8/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx8/conf/nginx.conf test is successful
[root@nginx-1 conf]# nginx -s reload

测试

503 Service Temporarily Unavailable --》服务临时不可用

bash 复制代码
[root@web-2 ~]# vim access.sh
#!/bin/bash
for  i in {1..10}
do
    #启动10个子进程去执行curl程序,去下载文件
    (curl -O http://192.168.100.157/download/boot.tar.gz)&
done
#等待子进程结束,才退出脚本
wait
[root@web-2 ~]# bash  access.sh 

[root@nginx-1 logs]# tail -1 access.log 
192.168.100.158 - - [15/Aug/2025:16:53:21 +0800] "GET /download/boot.tar.gz HTTP/1.1" 503 497 "-" "curl/7.76.1"
[root@nginx-1 logs]# tail -1 error.log 
2025/08/15 16:53:21 [error] 4855#4855: *25 limiting connections by zone "perip", client: 192.168.100.158, server: www.feng.com, request: "GET /download/boot.tar.gz HTTP/1.1", host: "192.168.100.157"

四、限制请求数

ngx_http_limit_req_module

建立一个连接,可以发起多次请求,只要在65秒内,不会再次建立连接

bash 复制代码
[root@nginx-1 conf]# vim nginx.conf
 limit_conn_zone $binary_remote_addr zone=perip:10m;
 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #添加
    server {
        listen       80;
        server_name  www.feng.com;
        location / {
            root   html;
            index  index.html index.htm;
            limit_req zone=one burst=5; #添加
        }
[root@nginx-1 conf]# nginx -t
nginx: the configuration file /usr/local/nginx8/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx8/conf/nginx.conf test is successful
[root@nginx-1 conf]# nginx -s reload

测试效果

打开浏览器,按F5 刷新

在linux使用脚本去测试

bash 复制代码
[root@web-2 ~]# cat access_url.sh 
#!/bin/bash
for  i in {1..100}
do
    (curl  http://192.168.100.157)&
done
wait
[root@web-2 ~]# bash  access_url.sh 

[root@nginx-1 logs]# tail -f access.log 

192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 503 497 "-" "curl/7.76.1"
192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 503 497 "-" "curl/7.76.1"
192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 503 497 "-" "curl/7.76.1"
192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 503 497 "-" "curl/7.76.1"
192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 503 497 "-" "curl/7.76.1"
192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 503 497 "-" "curl/7.76.1"
192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 200 615 "-" "curl/7.76.1"
192.168.100.158 - - [15/Aug/2025:17:21:48 +0800] "GET / HTTP/1.1" 503 497 "-" "curl/7.76.1"
相关推荐
戴西软件11 分钟前
制造研发中的AI视觉与仿真:戴西工程图纸智能审图智能体、戴西3DViz_CAE AI集成与戴西3DViz_CAD AI集成
大数据·运维·人工智能·3d·自动化·制造·rpa
javaDocker28 分钟前
1800 亿科技投入砸下去,多数机构平的只是服务器,不是能力
运维·服务器·人工智能·科技·研发效能·金融科技
骇客野人1 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维
eleven_4u2 小时前
RocketMQ相关问题
java·运维·中间件
0+1112 小时前
Linux --DNS与ICMP
linux·运维·服务器
钛生智能2 小时前
OA 流程定制全参数详解(三):环节信息——流程中最核心、参数最多的部分
运维·办公自动化·oa·协同办公·oa办公系统
bjxiaxueliang2 小时前
一文自建STUN:在Ubuntu上分步搭建STUN服务
linux·运维·ubuntu
秦jh_2 小时前
【Docker】镜像、卷原理
运维·docker·容器
物联网软硬件开发-轨物科技2 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人
竣达技术3 小时前
Modbus 转 SNMP 协议转换器|自定义协议 + SNMP TRAP 主动上报
运维·服务器·网络·数据库·安全