当前位置: 首页 > article >正文

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_moduletry_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)。

 


http://www.kler.cn/a/548554.html

相关文章:

  • unity学习40:导入模型的 Animations文件夹内容,动画属性和修改动画文件
  • Mongodb数据管理
  • Apollo 9.0 速度动态规划决策算法 – path time heuristic optimizer
  • python旅游推荐系统+爬虫+可视化(协同过滤算法)
  • 【Leetcode 每日一题】1552. 两球之间的磁力
  • 1-2 gitee创建远程仓库
  • Docker与容器交互——attach和exec
  • 【DeepSeek】解决 DeepSeek 服务器不响应指南
  • Pytest快速入门
  • 软考网络工程师笔记
  • LeetCodehot 力扣热题100 二叉树的右视图
  • 如何正确安装Stable Diffusion Web UI以及对应的xFormers
  • mysql的rpm包安装
  • 【C++指南】不允许你不了解C++命名空间
  • Spring Boot 定时任务:轻松实现任务自动化
  • SQL-leetcode—1581. 进店却未进行过交易的顾客
  • EtherNetIP转ModbusTCP网关,给风电注入“超级赛亚人”能量
  • SQL数据清理:去除字段值中的多余符号(Demo例子)
  • 【NLP 24、模型训练方式】
  • 负载均衡集群——LVS-DR配置