0%

《OpenResty精华整理》2.一次完整的请求流程是怎样的

OpenResty 一次完整的请求流程是怎样的

OpenResty 使用 Nginx 作为底层的 Web 服务器。

Nginx 是如何接收到请求的

Nginx 整体架构


Nginx 整体架构图

Nginx 里有一个 master 进程和多个 worker 进程。

master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。
worker 进程负责处理网络请求与响应。

master 进程主要用来管 理worker 进程,具体包括如下 4 个主要功能:

  • 接收来自外界的信号。
  • 向各 worker 进程发送信号。
  • 监控 woker 进程的运行状态。
  • 当 woker 进程退出后(异常情况下),会自动重新启动新的 woker 进程。

woker 进程主要用来处理基本的网络事件:

  • 多个 worker 进程之间是对等且相互独立的,他们同等竞争来自客户端的请求。
  • 每个 worker 进程是单线程。
  • 一个请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。

Nginx 模块化设计


Nginx 常用模块及其之间的关系

Nginx 执行阶段

下面是详细的 11 个阶段,每个阶段都可能对应着一个甚至多个 HTTP 模块:


Nginx 11 个执行阶段表格

1. POST_READ:在 read 完请求的头部之后,在没有对头部做任何处理之前,想要获取到一些原始的值,就应该在这个阶段进行处理。这里面会涉及到一个 realip 模块。 2. SERVER_REWRITE:和下面的 REWRITE 阶段一样,都只有一个模块叫 rewrite 模块,一般没有第三方模块会处理这个阶段。 3. FIND_CONFIG:做 location 的匹配,暂时没有模块会用到。 4. REWRITE:对 URL 做一些处理。 5. POST_WRITE:处于 REWRITE 之后,也是暂时没有模块会在这个阶段出现。 接下来是确认用户访问权限的三个模块:

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

  1. PREACCESS:是在 ACCESS 之前要做一些工作,例如并发连接和 QPS 需要进行限制,涉及到两个模块:limt_conn 和 limit_req
  2. ACCESS:核心要解决的是用户能不能访问的问题,例如 auth_basic 是用户名和密码,access 是用户访问 IP,auth_request 根据第三方服务返回是否可以去访问。
  3. POST_ACCESS:是在 ACCESS 之后会做一些事情,同样暂时没有模块会用到。

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

  1. PRECONTENT:在处理 CONTENT 之前会做一些事情,例如会把子请求发送给第三方的服务去处理,try_files 模块也是在这个阶段中。
  2. CONTENT:这个阶段涉及到的模块就非常多了,例如 index, autoindex, concat 等都是在这个阶段生效的。
  3. LOG:记录日志 access_log 模块。

Nginx 11 个执行阶段示例

OpenResty 的运行机制


OpenResty 的运行机制

OpenResty 执行阶段

lua-nginx-module 以第三方模块的方式嵌入到 Nginx 的各个执行阶段里。


OpenResty 执行阶段

常用的阶段有:

  • init_by_lua*: master 启动,里面的变量会复制到各个 worker
  • init_worker_by_lua*: worker 启动
  • set_by_lua*: 流程分支处理判断变量初始化
  • rewrite_by_lua*: 转发、重定向、缓存等功能(例如特定请求代理到外网)
  • access_by_lua*: IP 准入、接口权限等情况集中处理(例如配合 iptable 完成简单防火墙)
  • content_by_lua*: 内容生成
  • header_filter_by_lua*: 响应头部过滤处理(例如添加头部信息)
  • body_filter_by_lua*: 响应体过滤处理(例如完成应答内容统一成大写)
  • log_by_lua*: 会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)

OpenResty 执行阶段和 Nginx 的对照


OpenResty 执行阶段对照