安安 - 阶段
type: channel
link: https://blog.90.vc/tag/%E9%98%B6%E6%AE%B5/
items: nginx 处理请求的11个阶段

nginx 处理请求的11个阶段
type: item
date: 2020-05-05T09:58:48+00:00
description: nginx的处理用户请求的11 个阶段nginx将一个HTTP请求分为11个处理阶段，这样做让每个HTTP模块可以仅仅专注于完成一个独立，简单的功能。而一个请求的完整处理过程可以由多个HTTP模块共同合作完成。可以极大的提高多个模块合作的协同性，可测试性，可扩展性。换言之，nginx在处理每一个http请求，和配置文件上的顺序没有关系。1 post-read接受到完整的http头部后，读取请求内容阶段，nginx读取并解析完请求头之后就立即开始执行；2 server-rewrite在uri与location匹配之前修改请求的URI（重定向），在server块中的请求地址重写阶段；3 find-config配置查找阶段，根据请求uri匹配location表达式，这个阶段不支持nginx模块注册处理程序，而是由ngx_http_core_module模块来完成当前请求与location配置快之间的配对工作；4 rewritelocation块中的请求地址重写阶段，当rewrite指令用于location中，即运行。另外，ngx_lua模块中的set_by_lua指令和rewrite_by_lua指令也在此阶段；5 post-rewrite请求地址重写提交阶段，防止递归修改uri造成死循环，（一个请求执行10次就会被nginx认定为死循环）该阶段只能由ngx_http_core_module模块实现6 preaccess访问权限检查准备阶段，http模块介入处理阶段，标准模块ngx_limit_req和ngx_limit_zone就运行在此阶段，前置可以控制访问的频率，后者限制访问的并发度7 access访问权限检查阶段，标准模块ngx_access,第三方模块nginx_auth_request以及第三方模块ngx_lua的access_by_lua 指令运行在此阶段，配置指令多是执行访问控制性质的任务，比如检查用户的访问权限，检查用户的来源IP地址是否合法；8 post-access访问权限检查提交阶段；如果请求不被允许访问nginx服务器，该阶段负责向用户返回错误响应；9 try-files配置项try_files处理阶段如果http请求访问静态文件资源，try_files配置项可以使这个请求顺序地访问多个静态文件资源，直到某个静态文件资源符合选取条件；10 content内容产生阶段，大部分HTTP模块会介入该阶段，是所有请求处理阶段中最重要的阶段，因为这个阶段的指令通常是用来生成HTTP响应内容的；11 log日志模块处理阶段，记录日志；