Nginx将一个HTTP请求分成多个阶段。以模块为单位进行处理。这样做的优点是使处理过程更加灵活、减少耦合度。HTTP框架将处理分成了11个阶段,各个阶段能够包括随意多个HTTP模块并以流水线的方式处理请求。这11个HTTP阶段例如以下所看到的:
一个请求到达黄色框里的时候,首先会读取请求头部,并且决定使用哪个server块上的配置指令来处理请求。
先介绍一下含有POST的就是之后,PRE就是之前
1. POST_READ:
realip模块默认不会编译进Nginx需要通过 --with-http_realip_module启⽤功能变量:如果还想要使⽤原来的TCP连接中的地址和端⼝,需要通过这两个变量保存realip_remote_addrrealip_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:
return指令的语法如下:
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
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
3. FIND_CONFIG:
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个阶段的顺序
依次调用每个阶段的模块。一个阶段可能会有多个模块。