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
posted @   被时光移动的城市  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示