总字符数: 3.24K

代码: 无, 文本: 1.31K

预计阅读时间: 6 分钟

Nginx处理阶段

Nginx处理请求的过程一共划分为11个阶段,按照执行顺序依次是

  • post-read(读取请求内容阶段)

NGX_HTTP_POST_READ_PHASE:nginx读取并解析完请求头之后就立即开始运行:例如模块ngx_realip就在post-read阶段注册了处理程序,它的功能是迫使Nginx认为当前请求的来源地址是指定的某一个请求头的值

  • server-rewrite(server请求地址重写阶段)

NGX_HTTP_SERVER_REWRITE_PHASE:当ngx_rewrite模块的set配置指令直接写在server配置块中时,基本上都是运行在server-rewrite阶段

  • find-config(配置查找阶段)

NGX_HTTP_FIND_CONFIG_PHASE:这个阶段并不支持Nginx模块注册处理程序,而是由Nginx核心来完成当前请求与location配置块之间的配对工作.

  • rewrite(location请求地址重写阶段)

NGX_HTTP_REWRITE_PHASE:当ngx_rewrite指令用于location中,就是再这个阶段运行的;另外ngx_set_misc(设置md5、encode_base64等)模块的指令,还有ngx_lua模块的set_by_lua指令和rewrite_by_lua指令也在此阶段.

  • post-rewrite(请求地址重写提交阶段)

NGX_HTTP_POST_REWRITE_PHASE:当nginx完成rewrite阶段所要求的内部跳转动作,如果rewrite阶段有这个要求的话;

  • preaccess(访问权限检查准备阶段)

NGX_HTTP_PREACCESS_PHASE:ngx_limit_req和ngx_limit_zone在这个阶段运行,ngx_limit_req可以控制请求的访问频率,ngx_limit_zone可以控制访问的并发度;

  • access(访问权限检查阶段)

NGX_HTTP_ACCESS_PHASE:标准模块ngx_access、第三方模块ngx_auth_request以及第三方模块ngx_lua的access_by_lua 指令就运行在这个阶段.配置指令多是执行访问控制相关的任务,如检查用户的访问权限,检查用户的来源IP是否合法;

  • post-access(访向权限检查提交阶段)

NGX_HTTP_POST_ACCESS_PHASE:主要用于配合access阶段实现标准ngx_http_core模块提供的配置指令satisfy的功能.satisfy all(与关系),satisfy any(或关系)

  • try-files(配置项try_files处理阶段)

NGX_HTTP_TRY_FILES_PHASE:专门用于实现标准配置指令try_files的功能,如果前N-1个参数所对应的文件系统对象都不存在,try-files阶段就会立即发起"内部跳转"到最后一个参数(即第N个参数)所指定的URI.

  • content(内容产生阶段)

NGX_HTTP_CONTENT_PHASE:是所有请求处理阶段中最为重要的阶段,因为这个阶段的指令通常是用来生成HTTP响应内容并输出HTTP响应的使命;

  • log(日志模块处理阶段)

NGX_HTTP_LOG_PHASE:记录日志

注意:Nginx的Conf中的指令的书写顺序和执行顺序是两码事,不支持Nginx模块注册处理程序的阶段:find-config post-rewrite post-access(主要用于Nginx本身完成一些自己的逻辑),常用的有rewite阶段 access阶段 content阶段

Nginx下Lua处理阶段与使用范围

OpenResty处理请求大致分为四个阶段

  1. 初始化阶段
  2. 重写与访问阶段
  3. 内容生成阶段
  4. 日志记录阶段

注意:生产环境中要加入lua_code_cache onhttp指令中中.lua_code_cache:开启或关闭Lua代码缓存

阶段的存在,应该是OpenResty不同于其他多数Web Server编程的最明显特征了.由于nginx把一个会话分成了很多阶段,这样第三方模块就可以根据自己行为挂载到不同阶段进行处理达到目的. 指令可以在http server server if location location if几个范围进行配置:

指令

处理阶段

使用范围

解释

init_by_lua

init_by_lua_file

loading-config

http

Nginx Master进程加载配置时执行;通常用于初始化全局配置/预加载Lua模块

init_worker_by_lua

init_worker_by_lua_file

starting-worker

http

每个Nginx worker进程启动时调用的计时器,如果Master进程不允许则只会在init_by_lua之后调用;通常用于定时拉取配置/数据,或者后端服务的健康检查

set_by_lua

set_by_lua_file

rewrite

server,server if,location,location if

设置nginx变量,可以实现复杂的赋值逻辑;此处是阻塞的,Lua代码要做到非常快;

rewrite_by_lua

rewrite_by_lua_file

rewrite tail

http,server,location, location if

可以实现复杂的转发/重定向逻辑;

access_by_lua

access_by_lua_file

access tail

http,server,location,location if

实现访问控制

content_by_lua

content_by_lua_file

content

location,location if

header_filter_by_lua

header_filter_by_lua_file

output-header-filter

http,server,location,location if

响应HTTP过滤处理(例如添加头部信息),设置HeaderCookie

body_filter_by_lua

body_filter_by_lua_file

output-body-filter

http,server,location,location if

Body过滤处理(完成应答内容统一成大写)对响应数据进行过滤,比如:截断,替换

log_by_lua

log_by_lua_file

log

http,server,location,location if

响应完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)阶段处理,比如记录访问量/统计平均响应时间