深入解析Nginx常见模块1
在Web服务器和反向代理服务器领域,Nginx凭借其高性能、稳定性和丰富的功能获得了广泛的应用。本文将介绍一些Nginx中常见的模块,帮助你更好地理解和使用它们。
Nginx模块简介
Nginx的模块系统是其强大功能的核心所在,它允许用户根据需要灵活配置服务器的行为。Nginx的模块大致可以分为核心模块、标准HTTP模块、可选HTTP模块、邮件模块和其他第三方模块。下面我们将重点介绍一些常用的模块。
Nginx常见模块
Nginx 四层访问控制
访问控制基于模块ngx_http_access_module实现,可以通过匹配客户端源IP地址进行限制
注意: 如果能在防火墙设备控制,最好就不要在nginx上配置,可以更好的节约资源
官方帮助
http://nginx.org/en/docs/http/ngx_http_access_module.html
server {listen 80;server_name m.caoge.com; location / {root /data/nginx;allow 192.168.101.10;deny all;}location /pc {root /data/nginx/;index m.html;allow 192.168.101.11;deny all; #按先小范围在前,大范围在后排序}
}
Nginx 账户认证功能
由 ngx_http_auth_basic_module 模块提供此功能
官方帮助
http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
示例
#Ubuntu安装包
[root@ubuntu2404 ~]# apt -y install apache2-utils
#rocky安装包
[root@rocky9 ~]#dnf install -y httpd-tools#创建用户
#-b 非交互式方式提交密码
[root@rocky9 app]# htpasswd -cb /data/htpasswd user1 123456
Adding password for user user1
[root@rocky9 app]# htpasswd -b /data/htpasswd user2 123
Adding password for user user2
[root@rocky9 app]# cat /data/htpasswd
user1:$apr1$IggUX5D.$cjBGDD1PtDvCCND29nLnP/
user2:$apr1$whjkSYwv$WXdVXa.Juz6VvMu.OWTiB1#安全加固
[root@rocky9 app]# chown nginx /data/htpasswd
[root@rocky9 app]# chmod 600 /data/htpasswd [root@rocky9 app]# vim m.caoge.com.conf
server {listen 80;server_name m.caoge.com; location / {root /data/nginx;auth_basic "logint password";auth_basic_user_file /data/htpasswd;
}location /pc {root /data/nginx/;index m.html;
}
}
#重启Nginx并访问测试
[root@rocky9 app]# nginx -s reload[root@centos7 ~]# curl http://user1:123456@m.caoge.com
pc web
[root@ubuntu2404 ~]#curl -u caoge:123456 www.caoge.com
www.caoge.com
自定义错误页面
自定义错误页,同时也可以用指定的响应状态码进行响应,可用位置:http,server,location,if in location
http://nginx.org/en/docs/http/ngx_http_core_module.html#error_pageSyntax: error_page code ... [=[response]] uri;
Default: —
Context: http, server, location, if in location
server {listen 80;server_name m.caoge.com; error_page 500 502 503 504 404 /error.html;location = /error.html {root /data/nginx;
}location /pc {root /data/nginx/;index m.html;
}
}
#重启nginx并访问不存在的页面进行测试
自定义错误页面
error_page 404 /40x.html;
location = /40x.html {root /data/html/ ;
}
如果404,就转到主页
#404转为302
#error_page 404 /index.html;
server {listen 80;server_name m.caoge.com; error_page 404 =302 /index.html;error_page 500 403 502 /error.html;location = /error.html {root /data/nginx;
}location = /index.html {root /data/nginx/;
}
}
自定义错误日志
自定义错误日志
Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
level: debug, info, notice, warn, error, crit, alert, emerg#关闭错误日志
error_log /dev/null;
server {listen 80;server_name m.caoge.com; error_page 404 =302 /index.html;error_page 500 403 502 /error.html;access_log /data/nginx/log/m.caoge.access.log;error_log /data/nginx/log/m.caoge.error.log; #定义错误日志location = /error.html {root /data/nginx;
}location = /index.html {root /data/nginx/;
}
}
#重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件
[root@rocky9 log]# touch m.caoge.access.log
[root@rocky9 log]# touch m.caoge.error.log
[root@rocky9 app]# nginx -s reload
[root@centos7 ~]# curl http://m.caoge.com/
pc web
server {listen 80 default_server;server_name m.caoge.com;root /data/nginx;index index.html;error_log /data/nginx/log/m.caoge.error.log; #全局配置启用错误日志路径location /login {error_log /dev/null; #针对/login目录的错误日志不记录}
}
server {listen 80;server_name m.caoge.com; error_page 404 @error_404;access_log /data/nginx/log/m.caoge.access.log;error_log /data/nginx/log/m.caoge.error.log;location @error_404 {default_type text/html;charset utf-8;return 200 '你访问的页面丢失';
}location = /index.html {root /data/nginx/;
}
}
检测文件是否存在
try_files 会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹), 如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
语法格式
http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
如果不存在页面,就转到default.html页面
[root@rocky9 app]# vim m.caoge.com.conf
server {listen 80;server_name m.caoge.com;location / {root /data/nginx/;index index.html;try_files $uri $uri.html $uri/index.html /default.html;#try_files $uri $uri/index.html $uri.html =498;
}
}
[root@rocky9 app]# nginx -t
nginx: the configuration file /app/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /app/nginx/conf/nginx.conf test is successful[root@rocky9 app]# nginx -s reload#重启nginx并测试,当访问到http://www.wang.org/about/xx.html等不存在的uri会显示default.html,如果是自定义的状态码则会显示在返回数据的状态码中
[root@centos7 ~]# curl m.caoge.com/
pc web
[root@centos7 ~]# curl m.caoge.com/ss
文件不存在[root@rocky9 app]# vim m.caoge.com.conf
server {listen 80;server_name m.caoge.com;location / {root /data/nginx/;index index.html;#try_files $uri $uri.html $uri/index.html /default.html;try_files $uri $uri/index.html $uri.html =498;
}
}
[root@centos7 ~]# curl m.caoge.com/sss -I
HTTP/1.1 498 #498就是自定义的状态返回码
Server: nginx
Date: Fri, 29 Nov 2024 13:34:57 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive
长连接配置
http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeoutSyntax: keepalive_requests number;
Default: keepalive_requests 1000;
Context: http, server, locationSyntax: keepalive_time time;
Default: keepalive_time 1h;
Context: http, server, locationSyntax: keepalive_timeout timeout [header_timeout];
Default: keepalive_timeout 75s;
Context: http, server, locationkeepalive_time time; #限制对一个连接中请求处理的最长时间,到时间后续的再有新的请求会断开连接,默认1h
keepalive_timeout timeout [header_timeout]; #设置保持空闲的连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests number; #在一次长连接上所允许请求的资源的最大数量,默认为1000次
keepalive_requests 3;
keepalive_timeout 65 60;
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,第二个数字60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文#如果设置为0表示关闭会话保持功能,将如下显示:
Connection:close #浏览器收到的服务器返回的报文#使用命令测试
[root@ubuntu2404 ~]#telnet www.caoge.com 80
Trying 192.168.1.50...
Connected to www.caoge.com.
Escape character is '^]'.
GET / HTTP/1.1
HOST: www.caoge.com
#Response Headers(响应头信息)
HTTP/1.1 200 OK
Server: nginx/1.28.0
Date: Mon, 30 Jun 2025 07:04:48 GMT
Content-Type: text/html
Content-Length: 14
Last-Modified: Sun, 29 Jun 2025 12:56:59 GMT
Connection: keep-alive
Keep-Alive: timeout=100
ETag: "6861381b-e"
Accept-Ranges: bytes
#页面内容
www.caoge.com
作为下载服务器配置
ngx_http_autoindex_module 模块处理以斜杠字符 “/” 结尾的请求,并生成目录列表,可以做为下载服务配置使用
官方文档
http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, locationautoindex on | off; #自动文件索引功能,默为off
autoindex_exact_size on | off; #计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off ; #显示本机时间而非GMT(格林威治)时间,默认off
charset charset | off; #指定字符编码,默认为off,中文会乱码,指定为utf8
autoindex_format html | xml | json | jsonp; #显示索引的页面文件风格,默认html
limit_rate rate; #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate 4k; #也可以通变量限速,单位B/s,同时设置,此项优级高.Rate limit can also be set in the $limit_rate variable, however, since version 1.17.0, this method is not recommended:
实现下载站点
[root@rocky9 app]# mkdir /data/nginx/download
[root@rocky9 app]# vim m.caoge.com.conf
location /download {autoindex on; #自动索引功能 autoindex_exact_size on; #计算文件确切大小(单位bytes),此为默认值,off只显示大概大小(单位kb、mb、gb)autoindex_localtime on; #on表示显示本机时间而非GMT(格林威治)时间,默为为off显示GMT时间charset utf-8;limit_rate 1024k; #限速,默认不限速root /data/nginx/;
}
[root@rocky9 nginx]# cp /root/anaconda-ks.cfg /data/nginx/download/
[root@rocky9 app]# nginx -s reload
[root@centos7 ~]# curl m.caoge.com/download/
<html>
<head><title>Index of /download/</title></head>
<body>
<h1>Index of /download/</h1><hr><pre><a href="../">../</a>
<a href="anaconda-ks.cfg">anaconda-ks.cfg</a> 29-Nov-2024 21:52 1317
</pre><hr></body>
</html>
作为上传服务器
以下指令控制上传数据
client_max_body_size 1m; #设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_body_buffer_size size; #用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]]; #设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名1级目录占1位16进制,即2^4=16个目录 0-f
2级目录占2位16进制,即2^8=256个目录 00-ff
3级目录占2位16进制,即2^8=256个目录 00-ff#配置示例:
client_max_body_size 100m; #如果太大,上传时会出现413错误,注意:如果php上传,还需要修改php.ini的相关配置
client_body_buffer_size 1024k;
client_body_temp_path /apps/nginx/client_body_temp/ 1 2 2; #上传时,Nginx会自动创建相关目录
限流限速
为什么要限速
限制某个用户在一定时间内能够产生的Http请求或者限制某个用户的下载速度。防止个别用户对资源消耗过多,导致其它用户受影响。
启用限速后,如果超过指定的阈值,则提示503过载保护
限速相关模块
下载限速:限制用户下载资源的速度
ngx_http_core_module
请求限制:限制用户单位时间内所产生的Http请求数
ngx_http_limit_req_module
连接限制:限制同一时间的连接数,即并发数限制
ngx_http_limit_conn_module
请求频率限速原理
先将请求放置缓存中,然后按指定速度持续处理。当请求速度超过了处理速度会导致缓存被占满,如果还有没有放入缓存的请求,则会被丢弃,工作原理类似于漏斗。
限制下载速度
server {listen 80;server_name www.caoge.com;root /data/mirrors/;charset utf8;autoindex on;autoindex_exact_size off;autoindex_localtime on;limit_rate_after 100m; #下载达到100MB数据后开始限速limit_rate 100k; #限速100klocation / {index index.html;
}
}
限制请求数
限制同一个IP的同时发起的最大请求数指令
http://nginx.org/en/docs/http/ngx_http_limit_req_module.htmlSyntax: limit_req_zone key zone=name:size rate=rate [sync];
Default: -
Context: httpSyntax: limit_req zone=name [burst=number] [nodelay | delay=number];
Default: -
Context: http, server, locationSyntax: limit_req_status code;
Default: limit_req_status 503;
Context: http, server, location#示例:
http {limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;...server {...location /search/ {limit_req zone=one burst=5;limit_req_status 500; #默认503,可以指定其它状态码
}
#参数说明
limit_req_zone定义在http块中,$binary_remote_addr表示以客户端IP地址的二进制形式为限流依据的key
Zone=定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。8000个IP地址的状态信息约1MB,例子区域可以存储80000个IP地址。
Rate=定义最大请求速率。示例中速率不能超过每秒10个请求。超过此速率的请求放入burst队列做延迟处理
burst=表示队列大小,当此队列满后,会中断请求报错。
nodelay表示超过请求速率并且缓存区满后不延迟处理,立即返回503错误。#可以有几个limit_req指令。例如,以下配置将限制来自单个 IP 地址的请求的处理速率,同时限制虚拟服务器的请求处理速率
#示例:
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;server {...limit_req zone=perip burst=5 nodelay;limit_req zone=perserver burst=10;
}
基于来源IP对下载速率限制,限制每秒处理1次请求,缓存区请求突发队列为10个
# http标签段定义请求限制, rate限制速率,限制一秒钟最多一个IP请求
#注意:$remote_addr和$binary_remote_addr的不同http {limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;}server {listen 80;server_name www.caoge.com;limit_req zone=req_one burst=10 nodelay;#请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,则返回503location / {root /data/mirrors/;index index.html;}}
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
#第一个参数:$binary_remote_addr表示通过这个标识来做限制,限制同一客户端ip地址。
#第二个参数:zone=req_one:10m表示生成一个大小为10M,名为req_one的内存区域用来存储访问频次信息
#第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,此处限制的是每秒1次。limit_req zone=req_one burst=10 nodelay;
#第一个参数:zone=req_one 设置使用哪个配置区域来做限制,与上面limit_req_zone的name对应。
#第二个参数:burst=10,设置一个大小为10的缓冲区,当有大量请求过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
#第三个参数:nodelay,超过访问频次并且缓冲区也满了的时候,则会返回503,如果没有设置,则所有请求会等待排队。
限制并发连接数
限制同一个IP的同时发起的最大并发连接数
指令
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: httpSyntax: limit_conn zone number;
Default: —
Context: http, server, location
设置共享内存区域和给定键值的最大允许个连接数。超过此限制时服务器将返回503错误
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;server {listen 80;server_name www.caoge.com;root /data/mirrors/;charset utf8;autoindex on;autoindex_exact_size off;autoindex_localtime on;limit_conn conn_zone 2; #限制并发2个连接limit_rate 100k;location / {index index.html;
}
}
综合实战
实现百度云盘非会员限度限流功能
示例: 当下载超过100M则限制下载速度为500k 限制web服务器请求数处理为1秒一个,触发值为5、限制用户仅可同时下载一个文件。如果同时下载超过2个资源,则返回提示 “请联系管理员进行会员充值” 并跳转到其他页面。
[root@rocky9 app]# vim m.caoge.com.conf
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
server { server_name m.caoge.com;root /data/nginx;charset utf8;autoindex on;autoindex_exact_size off;autoindex_localtime on;limit_req zone=req_zone burst=5 nodelay;limit_conn conn_zone 2;limit_rate_after 100m;limit_rate 500k;error_page 503 @error_page;location @error_page {default_type text/html;charset utf8;return 200 '温馨提示:请联系管理员进行会员充值!';#return https://pan.baidu.com/buy/center?tag=8&from=loginpage#/svip ;}}
[root@rocky9 app]# nginx -s reload[root@centos7 ~]# wget m.caoge.com/p.jpg
--2024-11-29 15:10:45-- http://m.caoge.com/p.jpg
Resolving m.caoge.com (m.caoge.com)... 192.168.101.5
Connecting to m.caoge.com (m.caoge.com)|192.168.101.5|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 209715200 (200M) [image/jpeg]
Saving to: ‘p.jpg’63% [=========================================================> ] 134,041,600 964KB/s eta 32s ^[root@centos7 ~]# wget m.caoge.com/p.jpg
--2024-11-29 15:11:03-- http://m.caoge.com/p.jpg
Resolving m.caoge.com (m.caoge.com)... 192.168.101.5
Connecting to m.caoge.com (m.caoge.com)|192.168.101.5|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 209715200 (200M) [image/jpeg]
Saving to: ‘p.jpg.1’59% [====================================================>
[root@centos7 ~]# wget m.caoge.com/p.jpg
--2024-11-29 15:11:07-- http://m.caoge.com/p.jpg
Resolving m.caoge.com (m.caoge.com)... 192.168.101.5
Connecting to m.caoge.com (m.caoge.com)|192.168.101.5|:80... connected.
HTTP request sent, awaiting response... 503 Service Temporarily Unavailable
2024-11-29 15:11:07 ERROR 503: Service Temporarily Unavailable.[root@centos7 ~]# curl m.caoge.com/p.jpg
温馨提示:请联系管理员进行会员充值!
结语
Nginx的模块系统为其强大的功能和灵活性奠定了基础。通过合理利用这些模块,你可以轻松应对各种复杂的网络服务场景。希望这篇博客能为你开启探索Nginx模块的大门,助你在Web服务器管理的道路上越走越远。
请继续关注我们的博客,获取更多关于Nginx及其他技术主题的深度分析!