Nginx系列之请求处理的11个阶段(下)

news/2024/5/2 15:26:24/文章来源:https://blog.csdn.net/qiaotl/article/details/127015490

上篇博客介绍了PostRead阶段涉及的模块的作用,此篇博客将介绍剩余阶段所涉及的模块作用

Preaccess阶段的limit_conn和limit_req模块

限速(rate limiting)是NGINX中一个非常有用的特性,可以用它来限制在一段时间内的HTTP请求数量,或者连接数量,或者连接的速率。限速可以用于安全防护用途,例如限制密码撞库暴力破解等操作的频率,也可以通过把请求频率限制在一个正常范围来抵御DDoS攻击。不过更常见的使用是通过限制请求的数量来确保后端的upstream服务器不会在短时间内遭受到大量的流量访问从而导致服务异常。limit_conn指令可以设置每个给定键值的最大同时连接数,limit_rate指令对每个连接的速率进行限制。参数rate的单位是字节/秒,设置为0将关闭限速。如下图所示,设置的limit_conn是1,即并发连接数是1,另外,限制建立连接发送请求的速率是50字节/秒。将配置文件引入nginx.conf。开启两个terminal,第一个输入curl命令后,很缓慢的显示nginx的index.html的内容,同时在第二个terminal中执行curl命令,就会返回500的错误,因为配置文件中定义了limit_conn_status的值是500。

除了limit_conn和limit_rate的设置外,还定义了limit_conn_zone,这里的key是$binary_remote_addr, 即对每个发送请求的客户端IP进行限制,另外zone=addr:10m,zone的名称可以任意自定义,后面是建立连接时所需的共享内存大小设置,这里设置的是10m。为什么建立连接的时候需要设置共享内存呢?因为多个work进程的内存是共享的,这样当nginx启动多个work进程时,如果对一个客户端IP进行了限制,当不同的请求发送到不同的work进程时,也能按设置的值限制。

 limit_req模块是基于算法来控制http请求的速率,如下图左边所示,上面水龙头类似于客户端发送的请求数量,这个数量无法控制,但是可以增加一个桶,可以通过控制桶往下流的速度来减少突发高峰流量对后端服务的冲击。如果请求太多,把桶都装满了,那么后续再发送过来的请求就会被丢弃掉。限制速率是有效应对突发激增流量的有效手段之一,如下图右边所示,有削峰填谷的效果。

下图是limit_req设置的配置文件,当注释掉burst设置的配置后,开启limit_req zone=one的配置时,因为设置的速率rate=2r/m(每分钟不能大于2个请求,即在发送第一个请求后,必须间隔1分钟后再发送第二个请求,否则会返回错误) 。此时,连续发送两条curl命令给nginx,第二个请求就会返回503错误。如果开启burst=2的配置,注释掉location中最后一条配置,在发送第四次curl命令的时候返回503错误,因为第一次发送的请求被处理,第二次,第三次发送的请求存放到桶里,burst=2,第四次发送请求时,桶已经满了,所以会返回错误。

另外,在上面的配置中还设置了nodelay,nodelay的作用是什么呢?上面的方法虽然使得请求的流量变得“均匀平滑”,但是,很大程度上增加了响应时间,排在队列越后面的请求,等待时间越长,过长的响应时间甚至可能会导致客户端认为请求异常或者直接导致请求超时。为了解决这种情况,可以在brust参数后面加上nodelay参数。加上nodelay参数后,nginx的处理方式和上面基本相同,唯一的区别在于:当nginx接受了第2到3共计2个请求之后,不会把它们放入队列中,而是直接将它们转发给upstream服务器,同时标记队列中的这2个插槽(slot)为已使用,然后把剩下的全部请求都503拒绝掉,接着每过1分钟再释放一个新的slot让新的请求进来。所以,配置nodelay后,在1分钟内前面连续发送的三个请求都会立即返回响应,不会出现延迟的效果,第四个请求返回503错误。

Access阶段的access模块

access模块中可以使用satisfy指令来控制请求被允许还是通过,satisfy all表示只有access模块、auth_basic模块、auth_request模块以及其他模块全都对请求放行才能真的放行。satisfy any表示只要任意模块允许放行,则允许请求往下执行。具体的的判断逻辑如下图所示

Access阶段的auth_basic和auth_request

ngx_http_auth_basic_module模块的作用是,当输入正确的用户密码才允许访问web内容。web上的一些内容不想被其他人知道,但是又想让部分人看到。nginx的http auth模块以及Apache http auth都是很好的解决方案。如下图所示配置,配置时需要指定存放用户名和密码的文件地址,即设置auth_basic_user_file.这里file里面存放的user和password经过了base64简单加密后存放。配置basi_auth后,在浏览器上访问nginx时,就会弹出输入用户名和密码的框,如果输入错误则不被允许访问nginx。生成存放密码文件的信息可借助工具,可以通过下载httpd-tools工具,工具命令格式"htpasswd –c file –b user pass",这条命令执行后就创建了用户名为usr,密码为pass的auth.pass文件。

通过auth_basic只能做最简单的用户认证,例如像goaccess展示的日志报告一类的不敏感内容。实际项目中,如果是对后端服务进行认证,那么还需要接入专门的认证服务上进行认证。nginx中的auth_request模块就是用来将请求转发到专门的认证服务的。auth_request的工作原理是:收到请求后,生成子请求,通过反向代理技术把请求传递给上游服务,向上游服务转发请求后,若上游服务返回响应码2xx,则继续执行,若上游服务返回401或者403,则将响应返回给客户端。

如下图所示,再开启一个nginx服务,监听在8090端口,模拟认证服务器,当8090端口的nginx服务返回401时,执行"curl http://taoli.test.pub:8030/auth"也会返回401错误。需要注意一点:auth_request模块默认不会编译进nginx,所以需要通过--with-xx命令编译进去后,才能使用auth_request指令。

下左图,是用nginx模拟认证服务的配置,配置里面return的是401.

除了认证功能外,在access阶段还可以在location中配置deny和allow来限制或者允许来自某个IP地址或者某一段IP地址的请求。例如上面右图的配置,这样可以设置IP地址的黑名单或者白名单了。deny和allow也属于access模块的指令。

上面介绍了access模块、auth_basic、auth_request三个模块,当配置文件中都有三个模块的命令时,执行顺序是如何的呢假设配置文件中有如下配置,当访问nginx服务时,不会弹出输入用户名、密码的dialog框,因为deny指令属于access模块,access模块在执行优先级上先于auth模块,因为配置了satisfy all,所以当deny指令拒绝请求后,则不再往下执行。如果配置satisfy any,则会弹出输入用户名、密码的弹框。

location /{satisfy all;auth_basic "auth";auth_basic_user_file auth.pass;deny all;
}

PreContent阶段的try-files和mirrors模块

try_files是nginx中http_core核心模块所带的指令,主要是替代一些rewrite的指令,提高解析效率。作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。如下图所示:配置try_files后,nginx服务器会在配置的多个url中进行匹配,如果都匹配不上,那么可以通过@进行内部重定向,下面的配置文件中重定向到了@lasturl,所以返回了lasturl的信息。

将生产环境的流量拷贝到预上线环境或测试环境,可以带来一些好处,比如:用真实有效的流量请求进行测试验证;可以用来排查线上问题等。Nginx中的mirrors模块就提供了流量复制的功能,mirrors的工作原理是处理请求时,生成子请求发送到其他服务,对子请求的返回值不做处理。下面是一段mirror的配置文件信息。

server {server_name taoli.test.pub;listen 8009;error_log logs/error.log debug;location / {mirror /mirror;#复制子请求到/mirror路径的服务上mirror_request_body off;#不复制request_body,因为是实验演示,所以这里设置的是off.}location = /mirror {internal;proxy_pass http://127.0.0.1:10020$request_uri;@#这里可以启动另外一个nginx服务,作为反向代理服务proxy_pass_request_body off;proxy_set_header Content-Length "";proxy_set_header X-Original-URI $request_uri;}
}

上面的配置内容可include到nginx1服务上,nginx2服务启动作为模拟的反向代理服务,监听在10020端口。此时用curl命令访问nginx1的服务,查看nginx2的access.log信息,可以看到同样打印了请求的信息,说明请求被复制发送到了nginx2服务上。结果如下所示:

Content阶段的static模块

static模块对于访问nginx服务url不添加最后的反斜杠,默认会返回301重定向,重定向后的域名具体会被改写成什么呢?这里涉及两个指令absolute_redirect,当值为on时,假设访问“curl http://localhost:8088/first”,重定向的Location是"/first/",当值设置为off时,重定向的Location是"http://localhost:8080/first/"。当开启server_name_in_redirect时,重定向的Location是"http://server_name:ListenPort/first/",实验结果如下所示:

当Nginx作为静态资源服务器,在访问某个Url时,还会伴随生成三个环境变量。通过读取环境变量,可以获取到访问的url中的文件路径。

$request_filename       # 访问某url时,访问的真实文件路径
$document_root          # 访问某url时,访问的目录路径
$realpath_root          # 访问某url时,访问的目录路径,和document_root的区别是,如果该目录是个软链接,$realpath_root会显示软链接的真实路径,而$document_root显示的是软链接的路径

Content节点的index、autoindex模块以及concat模块

index file...;  # 默认 index index.html 表示访问一个目录默认访问其内的index.html,可以配置的上下文包括http、location、server。
autoindex on|off;   #默认off,作用是当url以/结尾(即访问目录时)显示目录结构。auto_index_format html|xml|json|jsonp,显示目录结构时使用的格式。如果即配置了index又配置了autoindex,执行顺序是什么呢?因为index模块先于autoindex模块执行,所以,如果这个目录有index.html,则显示index.html,而不是显示目录结构。如果没有index.html,则会显示目录结构。

concat模块的作用是当页面需要访问多个小文件时,把内容合并到一次http响应中返回,从而提升性能。例如访问"https://g.alicdn.cn/??one/first.js,second/second.css/,thrid/third.js"。固定格式是https://xxx??后面跟需要访问的小文件,多个文件间用逗号隔开。另外,nginx默认不会编译进这个模块,需要--with编译进去。concat默认是关闭状态,如果要开启,需要设置成on。concat的部分配置项说明如下
concat on|off;      # 默认 off;可配置的上下文有http、server、location 
concat_types text/css application/x-javascript  # 合并的文件类型
concat_max_files 10     # 最大合并文件数

Log阶段的Log模块

Log模块默认开启,且不能被禁用,安装nginx后,在默认的配置文件中就有关于log的配置,如下所示,log_format定义日志记录的内容,acees_log后面定义log存放的位置,采用的格式等。

以上就是Nginx处理请求的11个阶段涉及的常用模块使用的介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_12767.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

慢查询 MySQL 定位优化技巧,从10s优化到300ms

1.如何定位并优化慢查询SQL? 一般有3个思考方向 1.根据慢日志定位慢查询sql 2.使用explain等工具分析sql执行计划 3.修改sql或者尽量让sql走索引 2.如何使用慢查询日志? 先给出步骤,后面说明 有3个步骤 1.开启慢查询日志 首先开启慢查询…

office project【图文详解】

Office Project是一款全面实用的项目管理软件。 Office Project2021正式版来自推出的项目管理软件。最新版本的Microsoft Office Project2021软件拥有最简单的项目管理方法,用户可以根据每个人的工作情况轻松分配工作量和项目执行时间。Project 安装包各个版本 htt…

(附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740

摘 要 本文介绍了使用PHPMySQL数据库和微信应用为儿童艺术学校实现教育应用的过程。本文介绍的教育应用是为儿童艺术学校设计的,这意味着该系统可用于教授儿童艺术和艺术视频。该系统的主要功能是可以将儿童艺术教育的线下方式转变为线上,从教育机构的角…

微信小程序组件介绍

组件view 普通视图区域 类似于html中的div是一个块级元素 .wxml代码 <view class"container1" ><view>温度</view><view>湿度</view> <view>光照强度</view> </view> .wxss代码—— .container1 view{width: 100…

linux 内存管理

用户空间与内核空间 人间还是仙界&#xff1f;聊一聊linux系统的用户空间和内核空间 以32 位Linux系统为例&#xff0c;虚拟地址的大小是4GB (0x0000_0000 ~ 0xffff_ffff)。 Linux 用户空间和 内核空间的大小可以通过设置宏 PAGE_OFFSET 来配置&#xff0c;默认PAGE_OFFSET 0…

Oracle数据库中的包(七)

目录 1.Oracle中包 2.包的创建 &#xff08;1&#xff09;可视化方式创建包 &#xff08;2&#xff09;以命令方式创建包 ①创建包头 ②创建包体 ③删除包 3.包的初始化 4.重载 ①相关概念和注意事项 ②系统内置的包 Oracle学习的相关知识点&#xff08;汇总&#x…

UGeek大咖说 | 直播预告:顺丰高难度可观测性压测实践与应用

本月「UGeek大咖说-大厂可观测」又双叒……来和大家见面了&#xff01;本期大咖说特邀到顺丰科技应用架构高级工程师——李卓做客直播间&#xff0c;用实际案例带我们一起剖析大型复杂系统下可观测性在全链路压测中的落地实践。 往期大咖说我们对可观测性做了很多诠释和分享&a…

2022安徽省赛赛题——B-2任务二:流量分析

有题有环境有解析,要的私我,勿喷! B-2任务二:流量分析 *任务说明:仅能获取Server2的IP地址 1.使用Wireshark查看并分析Server2桌面下的capture.pcapng数据包文件,找出黑客获取到的可成功登录目标服务器Telnet服务的账号密码,并将黑客获取到的账号密码作为Flag值(用户…

开创性的区块链操作系统项目——去中心化簿订单交易所

关于区块链操作系统上的 Web2 和 Web3 先驱系列今天向大家介绍来自Dakai的 Peter、Laszlo 和 Mark 。Web3 开发人员通过他们的去中心化簿订单交易所推进了区块链技术的发展。他们正在使用 Python 和 SQLite 作为数据库引擎来进行开发&#xff0c;他们发现他们可以在区块链操作系…

js与jquery实例-拖动改变列宽和行高

如何通过javascript或者jquery实现改变表格宽度或者行高的功能?今天就把这个功能代码分享给大家,绝对原创哦,代码少而且易懂。先看效果图:html结构:html结构:<!DOCTYPE HTML> <html> <head><meta charset="utf-8"><title>table&…

最适合从事游戏建模这类高薪职业的是这些人,快来看看有你吗?

随着游戏行业的发展&#xff0c;游戏建模受到越来越多的人的关注&#xff0c;那游戏建模的学习适用于什么样的人群呢&#xff1f;今天就来介绍一下吧 01 大学毕业&#xff0c;就业方向不明确 大学期间&#xff0c;本专业知识没有深度掌握&#xff0c;无法从事本专业相关的工作…

Vue3 i18国际化

本文参考了两片文章如下&#xff0c;博文原创&#xff0c;转载附上本博文链接即可 1、基于Vue3.0和ElementPlus开发后台框架(loginbacki18n)_zzzzzzzzzz的博客-CSDN博客_vue3后台框架 &#xff08;这个有点没看懂&#xff09; 2、https://www.jianshu.com/p/fa85595642cd&am…

盘点一个Python网络爬虫实战问题

大家好,我是皮皮。 一、前言 前几天在Python铂金交流群【红色基因代代传】问了一个Python网络爬虫的问题,提问截图如下:代码截图如下:报错截图如下:要么就是原始网页没那么多数据,要么就是你自己取到的数据没那么多,有的有排名,有的没有,可以考虑加个try异常处理。首先…

基于单片机的老人防摔GSM报警

目录 1 跌倒报警器研究现状........................................................................................ 8 2.1单片机的功能及最小系统的电路设计.................................................. 9 内置闪存存储器......................................…

雷鸟乐队 VoxEdit 大赛启动啦,24,500 SAND 奖励等你们来赢取!

是鸟……是飞机……是雷鸟&#xff01; 如果你们选择接受它&#xff0c;那么你们的任务是创造一个受 1960 年代标志性电视剧启发的车辆资产&#xff08;汽车、轮船摩托车等&#xff09;。 不要使用雷鸟的 logo 或对现有的雷鸟作品进行二次创作。 24,500 SAND 将按以下方式分配给…

手机远程控制之scrcpy(一)

有线投屏 无线投屏 屏幕录制 常见问题 错误检查 ERROR: Exception on thread 投屏模糊 scrcpy 是免费开源的投屏软件&#xff0c;支持将安卓手机屏幕投放在 Windows、macOS、GNU/Linux 上&#xff0c;并可直接借助鼠标在投屏窗口中进行交互和录制。 市面上主流的多屏协…

机器人地面站-[QGroundControl源码解析]-[7]-[api]

目录 前言 一.QmlComponentInfo 二.QGCSettings 三.QGCOptions 四.QGCCorePlugin 总结 前言 上篇讲完了Analyize中内容&#xff0c;主要对应界面上AnalyzeTool模块的功能。本篇我们来过api文件夹下的代码。api下的代码主要实现了qgc的核心接口&#xff0c;应用所有的选项…

为什么2022年7月的PMP考试通过率这么低?

2022年 7月考的是新考纲&#xff0c;有50%的敏捷题型&#xff0c;考题相对旧考纲灵活很多&#xff0c;混合型项目内容较多&#xff0c;要是不好好备考&#xff0c;很有可能挂哦&#xff0c;所以 PMI 官方都发布通知&#xff0c;7、8、9 月没考过的考生可以免费重考一次。 但是&…

rk3368-双以太网口

RK芯片以太网补丁android5-12 就打一个补丁就行, 1.\sdk\device\rockchip\common\init.rockchip.rc service dhcpcd_eth1 /system/bin/dhcpcd -aABDKLclass late_startdisabledoneshot 2.添加文件EthernetNetworkFactoryExt.java 给eth1使用:sdk\frameworks\opt\net\ethern…

docker images 命令详解

文章目录一、docker images 命令选项二、docker images 使用实例2.1 显示最近创建的镜像2.2 根据镜像名和tag值查询2.3 查询结果中显示完整的镜像ID2.4 显示镜像的摘要信息2.5 显示未打tag值的镜像2.6 删除未打tag值额镜像2.7 根据标签筛选镜像2.8 根据时间筛选镜像2.9 通过模糊…