实战演示 Nginx 结合 log_subrequest 追踪内部重定向、SSI 与镜像子请求的执行详情

老敏小哥_3999

老敏小哥_3999

2026-04-13

655人浏览

原创

启用 log_subrequest 后,nginx 会记录子请求日志,包括 rewrite last 重定向、ssi 包含、mirror 镜像等内部动作,配合 $request_id 和 $subrequest 变量可完整追踪单次用户请求的全链路。

实战演示 nginx 结合 log_subrequest 追踪内部重定向、ssi 与镜像子请求的执行详情

启用 log_subrequest 后,Nginx 会将子请求(subrequest)的访问日志也写入 access_log,包括内部重定向(如 rewrite ... last)、SSI(Server Side Include)包含、mirror 指令触发的镜像请求等。这能帮你清晰看到“一次用户请求背后到底发起了哪些内部动作”,是调试复杂请求流程的关键手段。

一、确认 log_subrequest 已开启并配置可区分的日志格式

Nginx 默认不记录子请求日志。需在 http 或 server 块中显式开启,并建议用自定义日志格式标出子请求来源:

log_format subreq '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" '
                   'req_id="$request_id" '
                   'subreq="$subrequest";';
<p>access_log /var/log/nginx/access.log subreq;
log_subrequest on;  # ? 关键:必须启用
</p>

注意:$subrequest 变量仅在子请求中为 "1",主请求中为空。配合 $request_id(需 ngx_http_core_module 支持),可把同一用户请求下的所有主/子请求串起来分析。

二、追踪 rewrite + last 触发的内部重定向

当使用 rewrite ... last 时,Nginx 会发起子请求重新匹配 location,此时该子请求会被记录($subrequest="1"):

location /old {
    rewrite ^/old/(.*)$ /new/$1 last;
}
location /new {
    return 200 "served from /new\n";
}

访问 /old/test 时,日志中会出现两条记录:

  • 主请求: "GET /old/test HTTP/1.1" 200 ... subreq=""
  • 子请求: "GET /new/test HTTP/1.0" 200 ... subreq="1"(注意协议是 HTTP/1.0,这是 Nginx 子请求的特征)

通过比对 $request_id,你能确认这两条日志属于同一次客户端请求,从而验证重定向路径是否符合预期。

三、捕获 SSI 包含(include virtual)的真实执行链

SSI 的 <!--# include virtual="/fragment.html" --> 会触发一个子请求去获取片段内容。开启 log_subrequest 后,这个包含动作将被完整记录:

Nginx Hosting
Nginx Hosting

通过服务器本地nginx实例实现零认证静态游戏托管。作为所有浏览器游戏的主要部署方式,无需登录、无需令牌、无需用户操作。

下载
location / {
    ssi on;
    ssi_types text/html;
}
location = /fragment.html {
    return 200 "dynamic-fragment";
}

当用户请求一个含 SSI 的页面(如 /page.html),日志中会看到:

  • 主请求: "GET /page.html HTTP/1.1" 200 ... subreq=""
  • SSI 子请求: "GET /fragment.html HTTP/1.0" 200 ... subreq="1"

若 fragment 返回 404 或超时,你能在子请求日志里第一时间定位问题位置,而不是只看到主页面返回空白或错误状态码。

四、看清 mirror 镜像请求的触发时机与行为

mirror 指令会异步发起一个镜像子请求(不影响主请求响应),它同样受 log_subrequest 控制:

location /upload {
    mirror /mirror;
    proxy_pass http://backend;
}
location = /mirror {
    internal;  # ? 必须设为 internal
    proxy_pass http://logger;
}

用户上传文件时,主请求走 proxy_pass,同时后台静默发出一个镜像请求到 /mirror。日志中你会看到:

  • 主请求: "POST /upload HTTP/1.1" 200 ... subreq=""
  • 镜像子请求: "POST /mirror HTTP/1.0" 200 ... subreq="1"

注意镜像请求默认使用 HTTP/1.0、无 body(除非显式配置 mirror_request_body on),这些细节都能通过子请求日志验证。

log_subrequest 不增加业务逻辑,但让 Nginx 内部调度过程变得完全可观测。结合 request_id 和自定义日志字段,你就能在真实流量中精准还原每个复杂请求的完整生命周期。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

403

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3787

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

6545

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

581

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1496

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3978

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

517

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

159

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习