keepalive_timeout timeout [header_timeout];
keepalive_requests number;
[root@ubuntu ~]
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 25 Jan 2025 13:30:47 GMT
Content-Type: text/html; charset=utf8
Content-Length: 11
Last-Modified: Thu, 25 Jan 2025 13:29:38 GMT
Connection: keep-alive #默认有 keepalive_timeout
ETag: "65b26242-b"
Accept-Ranges: bytes
[root@ubuntu ~]
Trying 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 OK
Server: nginx
Date: Thu, 25 Jan 2025 13:41:13 GMT
Content-Type: text/html; charset=utf8
Content-Length: 11
Last-Modified: Thu, 25 Jan 2025 13:29:38 GMT
Connection: keep-alive
ETag: "65b26242-b"
Accept-Ranges: bytes
index.html
GET /test.html HTTP/1.1
host: www.m99-josedu.com #输入项,然后回车
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 25 Jan 2025 13:41:38 GMT
Content-Type: text/html; charset=utf8
Content-Length: 5
Last-Modified: Thu, 25 Jan 2025 13:39:36 GMT
Connection: keep-alive
ETag: "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;
}
[root@ubuntu ~]
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 25 Jan 2025 13:47:08 GMT
Content-Type: text/html; charset=utf8
Content-Length: 11
Last-Modified: Thu, 25 Jan 2025 13:29:38 GMT
Connection: keep-alive
Keep-Alive: timeout=30 #此处显示 30
ETag: "65b26242-b"
Accept-Ranges: bytes
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;
autoindex_exact_size on|off;
autoindex_format html|xml|json|jsonp;
autoindex_localtime on|off
#目录内容
[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;
}
client_max_body_size size;
client_body_buffer_size size;
client_body_temp_path path [level1 [level2 [level3]]];
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;
}
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)调度算法等待处理,如果倒入水的速度小于漏水的速度,可以理解为服务器能够处理完所有的请求,此时整体服务表现正常。如果倒入水的速度大于漏水的速度,那么水桶内的水会不断增加直到最后溢出,这种情况下在水桶中的水可以理解为在队列中等待的请求,而溢出的水则表示直接被丢弃不处理的请求
limit_rate rate;
limit_rate_after size;
server {
listen 80;
server_name www.m99-josedu.com;
root /var/www/html/www.m99-josedu.com;
limit_rate 10k;
limit_rate_after 1m;
}
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 zone=name [burst=number] [nodelay|delay=number]
limit_req_status code;
limit_req_log_level info|notice|warn|error
limit_req_dry_run on|off;
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;
}
[root@ubuntu ~]
index
[root@ubuntu ~]
index
<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.log
10.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"
[root@ubuntu ~]
index
index
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
}
[root@ubuntu ~]
for i in {1..5};do
curl http://www.m99-josedu.com &
done
wait
[root@ubuntu ~]
index
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx</center>
</body>
</html>
index
index
index
[root@ubuntu ~]# tail -n 5 /var/log/nginx/access.log
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: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 ~]
index
index
index
index
index
[root@ubuntu ~]
10.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;
}
[root@ubuntu ~]
index
index
index
index
<html>
<head><title>503 Service Temporarily Unavailable</title></head>
<body>
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx</center>
</body>
</html>
https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
limit_conn_zone key zone=name:size;
limit_zone name $variable size;
limit_conn zone number;
limit_conn_dry_run on|off;
limit_conn_log_level info|notice|warn|error;
limit_conn_status code;
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:
--2025-01-30 09:40:34-- http:
Resolving www.m99-josedu.com (www.m99-josedu.com)... 10.0.0.206
Connecting to www.m99-josedu.com (www.m99-josedu.com)|10.0.0.206|:80...
connected.
HTTP request sent, awaiting response... 503 Service Temporarily Unavailable
2025-01-30 09:40:34 ERROR 503: Service Temporarily Unavailable.
— END —
阅读原文:原文链接
该文章在 2025/7/1 23:02:56 编辑过