nginx的十一个阶段详解
Nginx将请求处理分为多个阶段,如POST_READ、SERVER_REWRITE、FIND_CONFIG、REWRITE、POST_REWRITE、PREACCESS、ACCESS、POST_ACCESS、PRECONTENT、CONTENT、LOG等。每个阶段有不同的模块介入,执行特定的任务。
Nginx 的请求处理流程被划分为多个阶段(Phases),这些阶段按照固定顺序执行,每个阶段负责不同的任务。以下是 Nginx 的 11 个核心阶段的详细解析,涵盖请求从接收到响应的全生命周期:
1. POST_READ 阶段
-
作用:读取请求头后的预处理。
-
典型模块:
ngx_http_realip_module
。 -
功能:
-
修正客户端 IP(如通过代理后的真实 IP)。
-
示例配置:
set_real_ip_from 192.168.1.0/24; real_ip_header X-Forwarded-For;
2. SERVER_REWRITE 阶段
-
作用:在
server
块内执行 URL 重写。 -
典型模块:
ngx_http_rewrite_module
。 -
功能:
-
通过
rewrite
指令修改请求 URI。 -
示例
server { rewrite ^/old-url /new-url permanent; }
-
-
3. FIND_CONFIG 阶段
-
作用:根据请求的 URI 匹配
location
块。 -
核心机制:Nginx 内部通过 前缀匹配、正则匹配 等规则确定最终的
location
。 -
不可配置:此阶段由 Nginx 自动完成,无显式指令。
4. REWRITE 阶段
-
作用:在
location
块内执行 URL 重写。 -
典型模块:
ngx_http_rewrite_module
。 -
功能:
-
进一步修改 URI,可能循环执行(最多 10 次)。
-
示例:
location /api { rewrite ^/api/(.*) /$1 break; }
-
5. POST_REWRITE 阶段
-
作用:重写操作后的收尾处理。
-
功能:
-
检查是否因
rewrite
导致 URI 变化,决定是否重新进入FIND_CONFIG
阶段。
-
-
不可配置:由 Nginx 内部自动处理。
6. PREACCESS 阶段
-
作用:访问控制前的预处理。
-
典型模块:
-
ngx_http_limit_conn_module
(限制并发连接数)。 -
ngx_http_limit_req_module
(限制请求速率)。
-
-
示例:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
7. ACCESS 阶段
-
作用:访问权限验证。
-
典型模块:
-
ngx_http_access_module
(基于 IP 的访问控制)。 -
ngx_http_auth_basic_module
(HTTP 基本认证)。
-
-
示例
location /admin { allow 192.168.1.0/24; deny all; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; }
8. POST_ACCESS 阶段
-
作用:访问控制后的处理。
-
功能:
-
处理
ACCESS
阶段的拒绝请求(如返回 403)。
-
-
不可配置:由 Nginx 自动处理。
9. PRECONTENT 阶段
-
作用:内容生成前的预处理。
-
典型模块:
ngx_http_try_files_module
(try_files
指令)。 -
示例:
location / { try_files $uri $uri/ /index.html; }
10. CONTENT 阶段
-
作用:生成响应内容。
-
典型模块:
-
ngx_http_proxy_module
(反向代理)。 -
ngx_http_static_module
(静态文件服务)。 -
ngx_http_fastcgi_module
(FastCGI 处理)。
-
-
示例:
location / { proxy_pass http://backend; }
11. LOG 阶段
-
作用:记录请求日志。
-
典型模块:
ngx_http_log_module
。 -
功能:
-
将请求信息写入日志文件。
-
示例:
access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log warn;
阶段执行顺序总结
-
POST_READ → SERVER_REWRITE → FIND_CONFIG → REWRITE → POST_REWRITE → PREACCESS → ACCESS → POST_ACCESS → PRECONTENT → CONTENT → LOG
关键注意事项
-
阶段不可跳过:所有请求必须按顺序经过各阶段(即使未配置相关模块)。
-
模块优先级:同一阶段内的模块按
nginx.conf
中的加载顺序执行。 -
性能影响:复杂重写规则(如正则)或频繁的访问控制可能增加延迟。
-
实战应用
-
限流与防护:在
PREACCESS
阶段配置limit_req
防止 DDoS 攻击。 -
动态路由:在
REWRITE
阶段修改 URI 实现灰度发布。 -
日志定制:在
LOG
阶段记录自定义字段(如用户 ID)。