Nginx处理http请求的11个阶段

Nginx将一个HTTP请求分成多个阶段。以模块为单位进行处理。这样做的优点是使处理过程更加灵活、减少耦合度。HTTP框架将处理分成了11个阶段,各个阶段能够包括随意多个HTTP模块并以流水线的方式处理请求。这11个HTTP阶段例如以下所看到的:

一个请求到达黄色框里的时候,首先会读取请求头部,并且决定使用哪个server块上的配置指令来处理请求。

整个11个阶段所涉及到的模块和先后顺序如下图所⽰:

 

先介绍一下含有POST的就是之后,PRE就是之前

1. POST_READ:

postread阶段,是11个阶段的第1个阶段,这个阶段刚刚获取到了请求的头部,还没有进⾏任何处
理,我们可以拿到⼀些原始的信息。例如,拿到⽤⼾的真实IP地址
realip模块
默认不会编译进Nginx
需要通过 --with-http_realip_module
启⽤功能
变量:如果还想要使⽤原来的TCP连接中的地址和端⼝,需要通过这两个变量保存
realip_remote_addr
realip_remote_port
功能
修改客⼾端地址 指令
set_real_ip_from
指定可信的地址,只有从该地址建⽴的连接,获取的realip才是可信的
real_ip_header
指定从哪个头部取真实的IP地址,默认从 X-Real-IP
中取,如果设置从 X -
Forwarded-For
中取,会先从最后⼀个IP开始取
real_ip_recursive
环回地址,默认关闭,打开的时候,如果 X-Forwarded-For
最后⼀个地址与客⼾端地址
相同,会过滤掉该地址

2. SERVER_REWRITE:

⾸先rewrite阶段分为两个,⼀个是server_rewrite阶段,⼀个是rewrite,这两个阶段都涉及到
⼀个rewrite模块,⽽在rewrite模块中,有⼀个return指令,遇到该指令就不会再向下执⾏,直
接返回响应

return指令的语法如下:

返回状态码,后⾯跟上body
返回状态码,后⾯跟上URL
直接返回URL
Syntax: return code [text];
 return code URL;
 return URL;
Default: —
Context: server, location, if

 

返回状态码包括以下⼏种:
Nginx⾃定义
444:⽴刻关闭连接,⽤⼾收不到响应 HTTP1.0标准
301:永久重定向
302:临时重定向,禁⽌被缓存 HTTP1.1标准
303:临时重定向,允许改变⽅法,禁⽌被缓存
307:临时重定向,不允许改变⽅法,禁⽌被缓存
308:永久重定向,不允许改变⽅法

 rewrite

指令⽤于修改⽤⼾传⼊Nginx的URL。来看下 rewrite
的指令规则:
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if

3. FIND_CONFIG:

当经过rewrite模块,匹配到URL之后,就会进⼊find_config阶段,开始寻找URL对应的
location配置
location指令
指令语法
Syntax: location [ = | ~ | ~* | ^ ~ ] uri { ... }
 location @name { ... }
Default: —
Context: server, location
Syntax: merge_slashes on | off;
Default: merge_slashes on;
Context: http, server

1:带有“=“的精确匹配优先
2:没有修饰符的精确匹配
3:正则表达式按照他们在配置文件中定义的顺序
4:带有“^~”修饰符的,开头匹配
5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
6:没有修饰符的,如果指定字符串与URI开头匹配

4.REWRITE:

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对uri进行匹配
rewrite:主要是针对用户请求的url或者uri做具体处理。

语法

Syntax:rewrite regex replacement [flag]; regex匹配需要改写的url或者路径。replacement目标要替换成哪个url或路径
Dfault:-
Context:server,location,if

5. POST_REWRITE:

该阶段不能注册handler,仅仅只是检查上一阶段是否做了uri重写,如果没有重写的话,直接进入下一阶段;如果有重写的话,则利用next跳转域往前跳转到FIND_CONFIG阶段重新执行。Nginx对uri重写次数做了限制,默认是10次。

接下来是确认⽤⼾访问权限的三个模块:

6.PREACCESS:

limit_conn, limit_req

7.ACCESS:

如 auth_basic, access, auth_request

8.POSTACCESS:

常用模块比较少。POST_ACCESS和POST_REWRITE阶段一样,只是处理一下上一阶段的结果,而不能挂载自己的handler,具体为如果ACCESS阶段返回了NGX_HTTP_FORBIDDEN或NGX_HTTP_UNAUTHORIZED(记录在r->access_code字段),该阶段会结束掉请求。

最后的三个阶段处理响应和⽇志:

9.PRECONTENT:

ngx_http_try_files_module 模块。

syntax : tryfiles file... uri
tryfiles file... code;
default: --
context: server,location

10.CONTENT :

这个阶段的模块比较多 如index, autoindex, concat 还有一些反向代理都是在这个阶段。

11.LOG:

这个阶段 都比较熟悉就是打印access log的。

这里需要注意的是,当Nginx接收完用户请求head的时候,就会按照这11个阶段的顺序

依次调用每个阶段的模块。一个阶段可能会有多个模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值