如何配置 Nginx 监控 ngx_http_addition_module 产生的子请求级详细日志

夏辰君_6226

夏辰君_6226

2026-05-01

210人浏览

原创

Nginx的ngx_http_addition_module本身不产生独立日志,但通过启用log_subrequest on;并配合internal指令和自定义日志格式,可使add_before_body/add_after_body触发的子请求被记录到access log中,实现可观测性。

如何配置 nginx 监控 ngx_http_addition_module 产生的子请求级详细日志

Nginx 的 ngx_http_addition_module 本身不产生独立日志,它通过子请求(subrequest)注入内容,而子请求默认不会记录在 access log 中——它们是内部调用,不经过常规请求生命周期的日志写入环节。

但你可以通过组合配置和模块能力,间接实现对 addition 模块所触发子请求的可观测性。关键在于:让子请求“显形”并留下痕迹。


一、启用子请求日志记录(核心方法)

Nginx 提供了 log_subrequest on; 指令,它会让所有子请求(包括 add_before_body 和 add_after_body 发起的)被记录到 access log 中,前提是该子请求走完了完整的日志流程(即有明确的 status、uri、处理时长等)。

✅ 正确配置方式:

http {
    log_format subreq '$remote_addr - $remote_user [$time_local] '
                       '"SUBREQ $request_method $uri $http_version" '
                       '$status $body_bytes_sent '
                       '"$http_referer" "$http_user_agent" '
                       'rt=$request_time uct="$upstream_connect_time" '
                       'uht="$upstream_header_time" urt="$upstream_response_time"';

    access_log /var/log/nginx/subreq.log subreq;
    log_subrequest on;  # ← 必须开启!否则子请求完全静默

    server {
        listen 80;
        server_name example.com;

        location / {
            add_before_body /_header;
            add_after_body  /_footer;
        }

        location = /_header {
            internal;  # ← 强制仅允许子请求访问(安全必需)
            default_type text/html;
            return 200 '<header>Site Header</header>';
        }

        location = /_footer {
            internal;
            default_type text/html;
            return 200 '<footer>© 2026</footer>';
        }
    }
}

⚠️ 注意:

  • log_subrequest on; 必须放在 http{} 块中(全局生效),不能只在 server 或 location 中;
  • 子请求 URI(如 /_header)会以完整请求行形式出现在日志里,例如:
    SUBREQ GET /_header HTTP/1.0
  • internal; 指令必须添加,防止外部直接访问这些子请求端点,否则可能被滥用或绕过缓存。

二、区分主请求与子请求日志(增强可读性)

默认日志无法直观判断某条日志是主请求还是子请求。可通过自定义变量 + map 实现标记:

Nginx Reverse Proxy
Nginx Reverse Proxy

配置 Nginx 反向代理,实现域名绑定。用户说“绑定域名”“配置 Nginx”“反向代理”时触发,将域名绑定到指定 IP:端口。

下载
http {
    map $request_uri $is_subreq {
        ~^/_header|/_footer  "1";
        default               "0";
    }

    log_format detailed '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        'subreq=$is_subreq rt=$request_time';

    access_log /var/log/nginx/detailed.log detailed;
    log_subrequest on;
}

这样每条日志末尾都会带 subreq=1 或 subreq=0,便于 grep、ELK 过滤或 Prometheus 抓取。


三、验证子请求是否真正被记录

重启 Nginx 后,发起一次主请求(如 curl http://example.com/),然后检查日志:

tail -f /var/log/nginx/subreq.log

你应看到三条日志(典型情况):

  • 一条主请求(GET / HTTP/1.1)
  • 一条子请求(SUBREQ GET /_header HTTP/1.0)
  • 一条子请求(SUBREQ GET /_footer HTTP/1.0)

若只看到主请求,说明:

  • log_subrequest on; 未生效(检查是否在 http{} 块内、是否 reload 成功);
  • 子请求 location 缺少 internal; 或被其他规则拦截(导致未执行);
  • add_before_body/add_after_body 的 URI 返回非 2xx(Nginx 默认忽略失败子请求,也不记日志)。

四、补充可观测性(可选)

  • 监控响应时间:子请求耗时会体现在 upstream_response_time 字段中,可用于定位注入瓶颈;
  • 错误日志跟踪:在子请求 location 中加 error_log /var/log/nginx/addition.err notice;,配合 ngx.log()(OpenResty)或简单 return 状态码调试;
  • 禁用缓存观察行为:临时加 add_header X-Addition-Debug "active"; 到子请求 location,方便 curl 验证是否命中。

不复杂但容易忽略:log_subrequest on; 是唯一打开子请求日志的开关,其余都是锦上添花。只要它开着,且子请求能正常返回,日志就自然出现。

相关专题

更多
nginx 重启
nginx 重启

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

2023.07.27

423

5

nginx 配置详解
nginx 配置详解

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

2023.08.04

4087

6

nginx配置详解
nginx配置详解

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

2023.08.04

6945

6

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

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

2024.02.23

601

5

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

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

2024.07.09

1516

5

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

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

2024.08.07

3998

3

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

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

2026.01.13

122

12

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

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

2026.01.13

557

23

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

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

2026.03.16

179

12

热门下载

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

精品课程

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

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习