LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

高性能WEB服务器Nginx常用功能(二):长连接配置、作为下载服务器、作为上传服务器、限流限速

admin
2025年6月29日 18:38 本文热度 52

3 Nginx 常用功能

3.6 长连接配置
keepalive_timeout timeout [header_timeout]; #TCP握手建立连接后,会话可以保持多长时间#在此时间内,可以继续传送数据,而不用再次握手#默认值 keepalive_timeout 75s#header_timeout 用作响应头中显示,可以与前一个值不一样#作用域 http, server, location
keepalive_requests number; #一次请求不断开连接的情况下最多可以传送多少个资源#默认值 keepalive_requests 1000#作用域 http, server, location#在请求过程中以上两项达到一项阀值,连接就会断开
[root@ubuntu ~]# curl www.m99-josedu.com -IHTTP/1.1 200 OKServer: nginxDate: Thu, 25 Jan 2025 13:30:47 GMTContent-Type: text/html; charset=utf8Content-Length: 11Last-Modified: Thu, 25 Jan 2025 13:29:38 GMTConnection: keep-alive #默认有 keepalive_timeoutETag: "65b26242-b"Accept-Ranges: bytes
#测试,可以在一个连接中持续请求资源[root@ubuntu ~]# telnet www.m99-josedu.com 80Trying 10.0.0.206...Connected to www.m99-josedu.com.Escape character is '^]'.GET /index.html HTTP/1.1 #输入项host: www.m99-josedu.com #输入项,然后回车
HTTP/1.1 200 OKServer: nginxDate: Thu, 25 Jan 2025 13:41:13 GMTContent-Type: text/html; charset=utf8Content-Length: 11Last-Modified: Thu, 25 Jan 2025 13:29:38 GMTConnection: keep-aliveETag: "65b26242-b"Accept-Ranges: bytes
index.html
GET /test.html HTTP/1.1 #输入项host: www.m99-josedu.com #输入项,然后回车HTTP/1.1 200 OKServer: nginxDate: Thu, 25 Jan 2025 13:41:38 GMTContent-Type: text/html; charset=utf8Content-Length: 5Last-Modified: Thu, 25 Jan 2025 13:39:36 GMTConnection: keep-aliveETag: "65b26498-5"Accept-Ranges: bytes
test
server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    keepalive_timeout 15 30; #在当前server 中修改配置,服务端真实时长是15S,响应头中显示30S}
[root@ubuntu ~]# curl www.m99-josedu.com -IHTTP/1.1 200 OKServer: nginxDate: Thu, 25 Jan 2025 13:47:08 GMTContent-Type: text/html; charset=utf8Content-Length: 11Last-Modified: Thu, 25 Jan 2025 13:29:38 GMTConnection: keep-aliveKeep-Alive: timeout=30 #此处显示 30ETag: "65b26242-b"Accept-Ranges: bytes
#再次使用 telnet www.m99-josedu.com 80 测试,建立连接后,如果15S内没有数据传输,会断开连接
server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    keepalive_requests 2#一个连接中可以获取两个资源
#测试[root@ubuntu ~]# telnet www.m99-josedu.com 80

3.7 作为下载服务器配置

Nginx 的 ngx_http_autoindex_module 模块可以将目录内容按指定格式生成目录内容列表,常用作配置下载服务器

https://nginx.org/en/docs/http/ngx_http_autoindex_module.html
autoindex on|off#是否显示目录内容列表,默认 offautoindex_exact_size on|off#是否以友好的方式显示文件大小,默认 on,表示显示文件具体字节数autoindex_format html|xml|json|jsonp; #数据显示格式,默认 htmlautoindex_localtime on|off #是否以本地时区显示文件时间属性,默认off,以UTC时区显示                          #以上指令作用域均为 http, server, location
#目录内容[root@ubuntu ~]# tree /var/www/html/www.m99-josedu.com//var/www/html/www.m99-josedu.com/├── 100M.img├── 500M.img├── dir1│   ├── dirX│   │   └── syslog│   └── dirY├── dir2│   ├── syslog│   └── syslog.bak├── dir3├── test.html├── x.html└── 三国演义.txt
#当前配置server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;
#此时在浏览器中访问 http://www.m99-josedu.com,http://www.m99-josedu.com/dir1/ 会返回403
#修改配置server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    charset utf8;    autoindex on;
#再次在浏览器中访问
#修改配置server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    charset utf8;    autoindex on;    autoindex_exact_size off#以友好格式显示文件大小    autoindex_localtime on#以服务器时区显示文件时间
#再次测试
3.8 作为上传服务器配置
client_max_body_size size; #设置允许客户端上传单个文件最大值,超过此值会响应403,默认1mclient_body_buffer_size size; #用于接收每个客户端请求报文的body部分的缓冲区大小,默认16k,超过此大小时,数据将被缓存到由 client_body_temp_path 指令所指定的位置client_body_temp_path path [level1 [level2 [level3]]];#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量#子目录最多可以设三级,数字表示当前级别创建几个子目录,16进制
server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    client_max_body_size 10m;    client_body_buffer_size 1024k;    client_body_temp_path /tmp/client_body_temp/ 1 2;}
# client_body_temp_path /tmp/client_body_temp/ 1 2;# 表示会在 /tmp/client_body_temp/ 创建 16个一级子目录 0-f,256 个二级子目录,00-ff,这些目录在上传时才会创建

3.9 限流限速

3.9.1 限流限速背景

限速(rate limiting)是 Nginx 中一个非常有用但是经常被误解且误用的功能特性。我们可以用它来限制在一段时间内的 HTTP 请求的数量,这些请求可以是如 GET 这样的简单请求又或者是用来填充登录表单的 POST 请求

限速还可以用于安全防护用途,例如限制密码撞库暴力破解等操作的频率,也可以通过把请求频率限制在一个正常范围来抵御 DDoS 攻击,更常见的使用情况是通过限制请求的数量来确保后端的 upstream 服务器不会在短时间内遭受到大量的流量访问从而导致服务异常

目前 Nginx 中主要的三种限速操作分别是:限制请求数(request),限制连接数(connection),限制响应速度(rate),对应在 Nginx 中的模块指令分别是 limit_req,limit_conn 和 limit_rate 三部分

Nginx 中限速(rate limiting)的主要算法原理就是基于在计算机网络中当带宽有限时十分常用的漏桶算法,其基本原理是:以漏桶为例,水从顶部倒入,从底下漏出

  • 漏桶对应我们服务器的带宽或者是处理请求的能力或者是一个队列

  • 水表示客户端发送过来的请求

  • 倒入的水则代表客户端发送给服务器但尚未进行处理的请求,此时请求仍在队列(在桶内)

  • 漏出的水则代表从队列中出来即将发送给服务器端处理的请求,此时请求已经离开了队列(在桶外)


漏桶在一定程度上可以代表服务器的处理能力,请求根据先进先出(FIFO)调度算法等待处理,如果倒入水的速度小于漏水的速度,可以理解为服务器能够处理完所有的请求,此时整体服务表现正常。如果倒入水的速度大于漏水的速度,那么水桶内的水会不断增加直到最后溢出,这种情况下在水桶中的水可以理解为在队列中等待的请求,而溢出的水则表示直接被丢弃不处理的请求

3.9.2 限制单一连接下载速度
limit_rate rate; #对单个客户端连接限速,默认单位为字节,其它单位需要显式指定,表示每秒的下载速度                #限速只对单一连接而言,同一客户端两个连接,总速率为限速2倍,默认值0,表示不限制limit_rate_after size; #在传输了多少数据之后开始限速,默认值0,表示一开始就限速                      #作用域 http, server, location, if in location
server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    limit_rate 10k#每秒下载速度为10K    limit_rate_after 1m#前1M不开启限速}
# 测试# wget http://www.m99-josedu.com/100M.img

3.9.3 限制客户端请求数

标记不同的客户端取决于我们在定义规则时的字段,取到相同的值,就可以认为是相同客户端,进而可以根据此值进行限制

https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
limit_req_zone key zone=name:size rate=rate [sync]; # 定义一个限速规则,供limit_req 指令调用                      # key 定义用于限速的关键字,表示以什么为依据来限速                      # zone=name:size name 表示规则名称                      # size 表示使用多大内存空间存储 key 对应的内容,指桶大小                      # 数据会在多个worker 进程共享                      # 空间耗尽后会使用LRU算法淘汰旧的数据                      # rate=rate 限制请求速率,                      # 同一个key 每秒可以请求多少次或每分钟可以请求多少次                      # [sync] 实现共享内存的区域同步,商业版支持                      # 作用域 http,定义好后需要在其它地方进行调用才生效limit_req zone=name [burst=number] [nodelay|delay=number]                      # zone=name 表示调用哪个 limit_req_zone                      # [burst=number] 表示超过 rate 之后还能接收多少个请求,这些请求会被放到队列慢慢处理                      # [nodelay|delay=number]                      # nodelay 表示 rate 匹配到的请求不会被放到队列而是直接处理,但后续请求返回 503                      # delay=number 表示有多少个请求直接处理,剩下的加队列慢慢处理                      # 作用域 http, server, locationlimit_req_status code; # 因为 limit_req 配置被拒绝处理的请求的返回状态码,默认 503, nginx 1.3.15 版本后可用                      # 作用域 http, server, locationlimit_req_log_level info|notice|warn|error                      # 定义因 limit_req 配置被拒绝处理的请求的日志级别,默认 error                      # 作用域 http, server, locationlimit_req_dry_run on|off# on 表示 rate 参数无效,但共享内存中的数据还是有效,默认 off                      # 作用域 http, server, location
#定义一个limit_req_zone,以 $binary_remote_addr 值来标记客户端,zone 名称为 mylimit,存储空间为 10m#同一客户端每秒能同时建立2个连接,2r/s 完整写法是 2requests/secends#但是 nginx 是毫秒级别的控制粒度,2r/s 意味着对同一客户端在 500ms 只能处理一个请求limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; #写在 http 中server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    limit_req zone=mylimit; #调用}
[root@ubuntu ~]# cat /var/www/html/www.m99-josedu.com/index.htmlindex
#测试,同一客户端每0.4S 发起一个请求,服务端配置是500ms 内只能处理一个请求,所以第二次请求返回503[root@ubuntu ~]# for i in {1..2};do curl http://www.m99-josedu.com;sleep 0.4;doneindex<html><head><title>503 Service Temporarily Unavailable</title></head><body><center><h1>503 Service Temporarily Unavailable</h1></center><hr><center>nginx</center></body></html>
#查看服务端日志[root@ubuntu ~]# tail -n 2 /var/log/nginx/access.log10.0.0.208 - - [29/Jan/2025:23:12:38 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [29/Jan/2025:23:12:38 +0800"GET / HTTP/1.1" 503 190 "-" "curl/7.81.0"
#再次测试,每个请求间隔0.5S,都能成功处理[root@ubuntu ~]# for i in {1..2};do curl http://www.m99-josedu.com;sleep 0.5;doneindexindex
# 当前配置,如果服务端在500ms内收到同一个客户端2个以上的请求,除了第一个请求会被处理之外,其它请求都返回503# 并发是程序的天然属性,可能存在这个500ms 内有大量的请求,后续时间内没有任何请求的情况,# 我们应该尽量 均匀平滑 的处理所有请求而不是直接拒绝limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    limit_req zone=mylimit burst=3    # 定义了客户端可以超过rate 速率的请求数,在当前配置中,如果500ms 内同一客户端有5个请求,则首先处理第1个    # 后续第2个到第4个请求放到队列中,在随后的时间内,每陋500ms 处理一个    # 第5个请求直接返回503
#测试,并行执行[root@ubuntu ~]# cat test.sh#!/bin/bashfor i in {1..5};docurl http://www.m99-josedu.com &donewait
# 同一客户端同时发起5个请求,第一个被处理,后续3个加队列,还有一个503拒绝# 由于是并发执行,所以观察现象,第一个200和503同时返回,后续3个请求都有延时,说明加队列了[root@ubuntu ~]# ./test.shindex<html><head><title>503 Service Temporarily Unavailable</title></head><body><center><h1>503 Service Temporarily Unavailable</h1></center><hr><center>nginx</center></body></html>indexindexindex
[root@ubuntu ~]# tail -n 5 /var/log/nginx/access.log10.0.0.208 - - [30/Jan/2025:00:13:27 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:13:27 +0800"GET / HTTP/1.1" 503 190 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:13:27 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:13:28 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:13:28 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"
#串行都能返回,但是是一个个返回,不是一下子返回所有[root@ubuntu ~]# for i in {1..5};do curl http://www.m99-josedu.com;doneindexindexindexindexindex
#看服务端日志,第一个请求和最后一个请求间隔了2S,队列有空位,所以都能处理[root@ubuntu ~]# tail -n 5 /var/log/nginx/access.log10.0.0.208 - - [30/Jan/2025:00:14:27 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:14:28 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:14:28 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:14:29 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"10.0.0.208 - - [30/Jan/2025:00:14:29 +0800"GET / HTTP/1.1" 200 6 "-" "curl/7.81.0"
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    limit_req zone=mylimit burst=3 nodelay;}
# burst=3 虽然使得客户端的请求变得 均匀平滑,但增加了响应时间,排在队列越后面的请求等待时间越久,如果请求数过多,可能会等到超时也不会被处理# nodelay 表示无延时队列# 当服务端在500ms 内收到同一客户端 5个请求的时候,第1个到第4个请求会被直接处理,同时标记队列中已占满,第5个返回503# 后续每过500ms 释放出一个队列中的空间让新的请求进来
#测试,同时返回,因为同时处理了4个请求和拒绝了1个请求[root@ubuntu ~]# for i in {1..5};do curl http://www.m99-josedu.com;doneindexindexindexindex<html><head><title>503 Service Temporarily Unavailable</title></head><body><center><h1>503 Service Temporarily Unavailable</h1></center><hr><center>nginx</center></body></html>
3.9.4 限制客户端并发连接数
https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
limit_conn_zone key zone=name:size; # 定义一个限速规则,供 limit_req 指令调用                        # key 定义用于限速的关键字,表示以什么为依据来限制并发连接数                        # zone=name:size name 表示规则名称                        # size 表示使用多大内存空间存储 key 对应的内容,指桶大小                        # 数据会在多个worker 进程共享,空间耗尽后会使用LRU算法淘汰旧的数据                        # 作用域 httplimit_zone name $variable size; # 在1.1.8版本后被弃用,改用 limit_conn_zonelimit_conn zone number; # zone 表示要调用的规则,number 表示要限制的连接数,不能写变量                        # 作用域 http, server, locationlimit_conn_dry_run on|off# on 表示 limit_conn 不生效,默认 off                        # 作用域 http, server, locationlimit_conn_log_level info|notice|warn|error# 因 limit_conn 被拒绝连接的日志的级别,默认 error                        # 作用域 http, server, locationlimit_conn_status code; # 因 limit_conn 被拒绝连接的返回状态码,默认 503                        # 作用域 http, server, location
limit_conn_zone $binary_remote_addr zone=mylimit:10m;server {    listen 80;    server_name www.m99-josedu.com;    root /var/www/html/www.m99-josedu.com;    location /test.img{        limit_rate 10k;        limit_conn mylimit 2;    }}
[root@ubuntu ~]# ls -lh /var/www/html/www.m99-josedu.com/test.img-rw-r--r-- 1 root root 1.0M Jan 29 22:18 /var/www/html/www.m99-josedu.com/test.img
#测试,同一客户端在己有两个下载的情况下,不能再建立新连接[root@ubuntu ~]# wget http://www.m99-josedu.com/test.img 1>/dev/null--2025-01-30 09:40:34-- http://www.m99-josedu.com/test.imgResolving www.m99-josedu.com (www.m99-josedu.com)... 10.0.0.206Connecting to www.m99-josedu.com (www.m99-josedu.com)|10.0.0.206|:80...connected.HTTP request sent, awaiting response... 503 Service Temporarily Unavailable2025-01-30 09:40:34 ERROR 503Service Temporarily Unavailable.

— END —


阅读原文:原文链接


该文章在 2025/7/1 23:02:56 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved