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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ851301776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值