linux之nginx模块配置
nginx模块配置
nginx基础模块
1.目录索引(ngx_http_autoindex_module)
ngx_http_autoindex_module模块处理以斜杠字符(' / ')结尾的请求,并生成一个目录清单。通常,当ngx_http_index_module模块找不到索引文件时,请求被传递给ngx_http_autoindex_module模块。
语法格式
Syntax: autoindex on | off; #当访问根目录,是否以目录列表形式展示
Default: autoindex off; #默认关闭
Context: http, server, location #作用域
Syntax: autoindex_exact_size on | off; #是否确切显示文件的大小,文件以 K M G 展示
Default: autoindex_exact_size on; #默认开启不以K M G显示
Context: http, server, location #作用域
Syntax: autoindex_localtime on | off; #当以目录列表形式展示,是否显示本地时间,默认UTC
Default: autoindex_localtime off; #默认关闭 开启显示本地 如CST中国标准时间
Context: http, server, location #作用域
参考连接 # https://nginx.org/en/docs/http/ngx_http_autoindex_module.html
2.字符集(ngx_http_charset_module)
ngx_http_charset_module模块将指定的字符集添加到“Content-Type”响应头字段中。
语法格式
Syntax: charset charset | off; #将指定的字符集添加到“Content-Type”响应头字段中。
Default: charset off; #默认不开启 中文目录是乱码
Context: http, server, location, if in location #作用域
charset utf-8; #设置响应客户端的编码为 utf-8
参考连接 # https://nginx.org/en/docs/http/ngx_http_charset_module.html
3.下载限速(ngx_http_core_module/limit_rate)
限制向客户端传输响应的速率。速率以字节/秒指定。0值禁用速率限制。该限制是根据每个请求设置的,因此如果客户端同时打开两个连接,则总速率将是指定限制的两倍。
语法格式
Syntax: limit_rate rate; #限制下载速度
Default: limit_rate 0;
Context: http, server, location, if in location
limit_rate 1k; #客户端下载1k/s
Syntax: limit_rate_after size; #先让客户端下载多少M,之后开始限速
Default: limit_rate_after 0;
Context: http, server, location, if in location
limit_rate_after 100M; #如果下载的文件是1G,前100M下载不限速
参考连接 # https://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate
4.访问认证(ngx_http_auth_basic_module)
ngx_http_auth_basic_module模块允许通过使用“HTTP基本身份验证”协议验证用户名和密码来限制对资源的访问。
语法格式
1.开启auth认证 2.设置需要登录认证的路径 3.创建认证文件 4.使用直接在location中写 auth_basic auth_basic_user_file
Syntax: auth_basic string | off; #当访问该域 存在auth_basic时,给定提示语 提示符
Default: auth_basic off; #默认关闭
Context: http, server, location, limit_except
location / { #当访问根域需验证账号密码
auth_basic "closed site";
auth_basic_user_file conf/htpasswd; #服务端存储客户提交的验证 账号密码 路径
}
[root@web01 conf.d]# htpasswd -b -c ../htpasswd nginx 123456 #创建/etc/nginx/htpasswd 密码文件 -b 无交互 -c指定文件
# https://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
5.访问限制(ngx_http_access_module)
ngx_http_access_module模块允许限制对某些客户端地址的访问。访问也可以通过密码、子请求的结果或JWT来限制。通过地址和密码同时限制访问由满足指令控制。
语法格式
Syntax: allow address | CIDR | unix: | all; #允许
Default: —
Context: http, server, location, limit_except #作用域
Syntax: deny address | CIDR | unix: | all; #拒绝
Default: —
Context: http, server, location, limit_except #作用域
# 例子 自上而下一条一条执行
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
# https://nginx.org/en/docs/http/ngx_http_access_module.html
6.http连接控制(ngx_http_limit_conn_module)
在企业中经常会遇到这种情况,服务器流量异常,负载过大等等。对于大流量恶意的攻击访问, 会带来带宽的浪费,服 务器压力,影响业务,往往考虑对同一个ip的连接数,请求数、进行限制。并非所有连接都被计算在内。只有当服务器正在处理请求并且已经读取了整个请求头时,才会计算连接。
语法格式
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
# limit_conn 模块来限制每个IP地址对某个特定资源的并发连接数。这种配置可以有效地防止某些IP地址对服务器进行大量的并发请求,从而减少 DoS(拒绝服务攻击)或滥用情况。
# limit_conn_zone 用于定义一个共享内存区域,该区域用于存储每个客户端(根据 $binary_remote_addr 进行区分)对服务器的连接数。
# $binary_remote_addr 是客户端的 IP 地址,在二进制格式下进行存储。它与 $remote_addr(通常是 IP 地址的文本格式)不同,前者是经过二进制编码的,这样存储和查找速度更快。
# zone=addr:10m 定义了一个名为 addr 的共享内存区域,大小为 10MB。这块内存用于存储每个IP地址的连接数信息。一个IP是64bytes,大概可以存储16W个IP。
# limit_conn addr 1;:这个配置限制了每个客户端IP地址(由 addr 共享内存区域存储)在根 /路径下最多只能有 1个并发连接。
limit_conn_zone $binary_remote_addr zone=addr:10m; #定义一个IP池空间
server {
location / {
limit_conn addr 1; # 限制同一个IP最大并发请求数量为1
}
工作原理
1. 当一个客户端发起对 / 路径的请求时,Nginx 会检查该客户端的 IP 地址是否已被 limit_conn_zone 定义的内存区域跟踪。
2. 如果该 IP 地址的并发连接数小于 1,Nginx 会允许该连接并计数该 IP 地址的并发连接数。
3. 如果该 IP 地址的并发连接数已经达到限制(即 1),Nginx 会拒绝该连接,并返回 503 Service Unavailable 错误,告知客户端该资源当前不可用。
4. 连接关闭时,Nginx 会减少该 IP 地址的连接数。
应用场景
1. 防止爬虫或恶意攻击:限制每个 IP 地址对特定路径的并发连接数,防止恶意用户利用大量并发连接来消耗服务器资源。
2. 流量控制:对于高流量下载链接,可以限制每个用户的最大连接数,避免某些用户过多占用带宽或计算资源。
3. 保护资源:特别是在敏感资源或大文件下载时,限制并发连接数有助于确保公平的带宽分配。
参考 # https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
7.http请求控制(ngx_http_limit_req_module)
ngx_http_limit_req_module模块(0.7.21)用于限制单个IP请求的速率,如果请求速率超过定义的阈值,则会被延迟处理。过多的请求被延迟,直到它们的数量超过最大并发大小,在这种情况下,请求以错误终止。默认为0
语法格式
Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default: —
Context: http, server, location
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #定义IP空间,以二进制进行存储,速度为每秒1次请求,超过此限制,延迟最多处理5个,则返回503 Service Unavailable
server {
location / {
limit_req zone=one burst=5;
}
}
}
工作原理
1. 请求限制速率:在这个配置中,limit_req_zone 规定了每秒最多允许每个 IP 地址发起 1 个请求。如果超出了这个速率,后续的请求会被延迟,直到下一秒。
2. 突发请求:burst=5 允许客户端在短时间内超出 1r/s 的请求频率,最多可以发送 5 个突发请求。如果超出了这个突发请求数,Nginx 会延迟这些请求。
3. 延迟处理:如果请求在突发请求数内(即 1 个请求/秒以内 + 最多 5 个突发请求),Nginx 会按序处理这些请求。如果突发请求数超过了限制,Nginx 会返回 5xx 错误,通常是 503 Service Unavailable。
应用场景
limit_req 模块常用于以下场景:
1. 防止滥用和 DoS 攻击:通过限制每个客户端的请求速率,可以防止恶意用户发送大量请求导致服务器资源耗尽。
2. 流量控制:在高流量网站中,可以用来限制特定路径(如下载、大文件上传等)的请求频率,确保服务器的稳定性。
3. API 限流:对于提供 API 服务的应用,可以用 limit_req 限制每个 IP 地址的请求频率,防止 API 滥用。
使用ab( ApacheBench)压测工具
[root@web02 ~]# ab -n 20 -c 10 http://10.0.0.7:88/ #一共20个请求 并发10个
#查看服务端日志 状态码为200的6个,刚好符合limit_req限制,每秒1个请求,延迟处理5个,其余返回503
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:10 +0800] "GET / HTTP/1.0" 503 197 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:11 +0800] "GET / HTTP/1.0" 200 1355 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:11 +0800] "GET / HTTP/1.0" 200 1355 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:12 +0800] "GET / HTTP/1.0" 200 1355 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:13 +0800] "GET / HTTP/1.0" 200 1355 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:14 +0800] "GET / HTTP/1.0" 200 1355 "-" "ApacheBench/2.3" "-"
10.0.0.8 - - [10/Dec/2024:13:47:15 +0800] "GET / HTTP/1.0" 200 1355 "-" "ApacheBench/2.3" "-"
# https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
6.状态监控
语法格式
Syntax: stub_status;
Default: —
Context: server, location
location /web_status {
stub_status;
}
#访问 /web_status
Active connections: 2
server accepts handled requests
83 83 122
Reading: 0 Writing: 1 Waiting: 1
# https://nginx.org/en/docs/http/ngx_http_stub_status_module.html
7.nginx_location
使用Nginx Location 可以控制访问网站的路径,但一个server可以有多个location配置, 多个location的优先级该如何区分
匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
/ 通用匹配,任何请求都会匹配到 5
Never try,never know
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?