跳到主要内容
版本:3.7.0

NginxAgent 支持矩阵

注意

仅测试验证了每个大版本的最低小版本号和最大小版本号。

  • 使用注意:不支持 reload 命令重启加载探针,有引入第三方模块请自行验证(可用 nginx -V 命令输出校验,部分第三方模块可能改动核心源码导致适配出错)
  • 编译注意事项:探针本质是 nginx 的动态扩展,依赖 nginx 导出的符号表。因此编译参数不能有 -fvisibility-hidden。检查命令:nginx -V | grep fvisibility-hidden
  • lua 模式:客户根据文档自行嵌码,需要在测试环境验证无问题再上线
  • 二次开发:修改过 nginx 源码的二次开发版本生产环境慎用,不在产品支持范围,请自行验证。风险较大,建议先在测试环境验证。
项目x86、x86_64aarch64备注
版本Nginx v1.13.* ~ v1.28.0Nginx v1.13.* ~ v1.28.01.23 [SINCE SmartAgent-6.10.0]
1.24 ~ 25 [SINCE SmartAgent-7.4.0]
1.26 ~ 27 [SINCE SmartAgent-9.2.2]
1.28.0 [SINCE SmartAgent-9.5.1]
注:不支持 reload 命令重启加载探针
OpenResty v1.13.* ~ v1.19.*、1.21.4.*、1.25.3.*、1.27.1.*OpenResty v1.13.* ~ v1.27.1.*JS 注入情况
1.27.1.x(nginx/v1.27.1) -- 支持
1.25.3.x(nginx/v1.25.3) -- 支持
1.21.4.x(nginx/v1.21.4) -- 支持
1.19.3.x(nginx/v1.19.3) -- 支持
1.17.8.x(nginx/v1.17.8) -- 支持
1.15.8.x(nginx/v1.15.8) -- 支持
1.13.6.x(nginx/v1.13.6) -- 不支持
注:不支持 reload 命令重启加载探针
Tengine v2.3.0 ~ v2.3.2、v2.4.0、v3.1.0 [SINCE SmartAgent-8.4.1]Tengine v2.3.0 ~ v2.3.2、Tengine-2.4.0、Tengine-3.1.0 [SINCE SmartAgent-8.4.1]不支持 JS 注入
注:不支持 reload 命令重启加载探针
Apisix 2.13.1-
ingress-nginx v0.46.0、0.49.3 [SINCE SmartAgent-9.2.0]ingress-nginx v0.46.0、0.49.3 [SINCE SmartAgent-9.2.0]
应用场景静态资源服务器静态资源服务器
http_proxy 反向代理http_proxy 反向代理
fastcgi 反向代理fastcgi 反向代理
uwsgi 反向代理uwsgi 反向代理
lua openresty 1.9.15.1 - 1.19.9.1 (nginx-agent-2.2.0 开始,对应 smartagent 6.8.0)-
容器dockerdocker
cri-ocri-o
podmanpodman
操作系统CentOS 7CentOS 7.3+、CentOS 8+
Red Hat 7统信 UOS V20+
Ubuntu 20.04Kylin Server (V10 Tercel)
CentOS 5.11NeoKylin Server (Chromium)
CentOS 6.10openEuler 20.03+
其他JS 注入(需要特定环境)JS 注入(需要特定环境)

traceid 追加日志说明 (自 smartagent-7.4.0, nginx-2.6.0 起支持)

支持将 trace 相关信息追加到 access.log 日志中,具体的追加格式取决于 nginx.conf 中配置的 log_format 格式。只有当 access.log 开启写入时(即未使用 access_log off; 配置)才会写入 trace 信息。

新增本地配置支持(自 nginxagent-3.1.0 起):配置项位于 /opt/bonree/apm/nginx/current/conf/bonree_module.conf 文件中的 enableTraceInfoAppendToLog 参数,默认为关闭状态(值为 0)。当设置为开启(值为 1)时,将在日志中添加相应的占位符。如果 web 追加开关关闭,在非 JSON 模式下占位符会显示为"-";如果 web 追加开关开启,则会显示如 "br.traceId=1d779b52211c8b7538e087ebcfe6f7eb br.spanId=b8ec8707ef69d385 br.traceFlag=01" 的信息。

本地配置修改后支持通过 reload 命令重新加载生效。

以下是不同配置下的日志追加格式示例:

1. 不支持注入的情况

只要使用了内置的 combined 格式都不支持 trace 信息注入。

access_log logs/access.log combined;

2. 使用 main 格式的日志配置

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;

带 trace 信息的日志输出示例:

192.168.44.1 - - [26/Jan/2024:10:31:14 +0800] "POST /ppinfo.php HTTP/1.1" 200 1916 "-" "PostmanRuntime/7.36.1" "-" "br.traceId=a6a525eecc758d1c1be07e9084cec692 br.spanId=98743c81d74cae8f br.traceFlag=00"

无 trace 信息时的日志输出示例:

192.168.44.1 - - [26/Jan/2024:10:31:14 +0800] "POST /ppinfo.php HTTP/1.1" 200 1916 "-" "PostmanRuntime/7.36.1" "-" "-"

3. 使用 JSON 格式的日志配置(示例1)

log_format json escape=json '{"@timestamp":"$time_iso8601",'
'"server_addr":"$server_addr",'
'"remote_addr":"$remote_addr",'
'"scheme":"$scheme",'
'"request_method":"$request_method",'
'"request_uri": "$request_uri",'
'"request_length": "$request_length",'
'"uri": "$uri",'
'"request_time":$request_time,'
'"body_bytes_sent":$body_bytes_sent,'
'"bytes_sent":$bytes_sent,'
'"status":"$status",'
'"upstream_time":"$upstream_response_time",'
'"upstream_host":"$upstream_addr",'
'"upstream_status":"$upstream_status",'
'"host":"$host",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent" '
' } ';
access_log logs/access.log json;

带 trace 信息的日志输出示例:

{"@timestamp":"2024-01-26T10:32:59+08:00","server_addr":"192.168.44.185","remote_addr":"192.168.44.1","scheme":"http","request_method":"POST","request_uri": "/ppinfo.php","request_length": "329","uri": "/ppinfo.php","request_time":0.002,"body_bytes_sent":1916,"bytes_sent":2256,"status":"200","upstream_time":"0.002","upstream_host":"0.0.0.0:9000","upstream_status":"200","host":"192.168.44.185","http_referer":"","http_user_agent":"PostmanRuntime/7.36.1" ,"bonree_trace":"br.traceId=0d9ded1fa040e88b918448eb8249c47a br.spanId=9938b7f5ce85c49e br.traceFlag=00"  }

无 trace 信息时的日志输出示例:

{"@timestamp":"2024-01-26T10:32:59+08:00","server_addr":"192.168.44.185","remote_addr":"192.168.44.1","scheme":"http","request_method":"POST","request_uri": "/ppinfo.php","request_length": "329","uri": "/ppinfo.php","request_time":0.002,"body_bytes_sent":1916,"bytes_sent":2256,"status":"200","upstream_time":"0.002","upstream_host":"0.0.0.0:9000","upstream_status":"200","host":"192.168.44.185","http_referer":"","http_user_agent":"PostmanRuntime/7.36.1" ,"bonree_trace":""  }

4. 使用 JSON 格式的日志配置(示例2)

log_format json escape=json '{  "s":"sdf2"  }';
access_log logs/access.log json;

带 trace 信息的日志输出示例:

{  "s":"sdf2", "bonree_trace":"br.traceId=9994383053fb010f6920bbc7e1dba7c9 br.spanId=2802794bff373e64 br.traceFlag=00"}

无 trace 信息时的日志输出示例:

{  "s":"sdf2", "bonree_trace":""}

5. 使用空 JSON 对象的格式

log_format json escape=json '{}';
access_log logs/access.log json;

带 trace 信息的日志输出示例:

{"bonree_trace":"br.traceId=50402067dc69ce99a4747d2251a5c859 br.spanId=1708755a253946b6 br.traceFlag=00"}

无 trace 信息时的日志输出示例:

{"bonree_trace":""}

6. 支持写入到 syslog

access_log syslog:server=unix:/dev/log,tag=nginx,severity=info json;

日志追加逻辑与前述 JSON 格式类似,示例输出在 /var/log/message 中:

Jan 26 10:44:53 localhost journal: localhost.localdomain nginx: {"@timestamp":"2024-01-26T10:44:53+08:00","server_addr":"192.168.44.185","remote_addr":"192.168.44.1","scheme":"http","request_method":"POST","request_uri": "/ppinfo.php","request_length": "329","uri": "/ppinfo.php","request_time":0.002,"body_bytes_sent":1915,"bytes_sent":2255,"status":"200","upstream_time":"0.002","upstream_host":"0.0.0.0:9000","upstream_status":"200","host":"192.168.44.185","http_referer":"","http_user_agent":"PostmanRuntime/7.36.1" ,"bonree_trace":"br.traceId=70cb58b0947d478cbee54c6e275fcfeb br.spanId=7f50335c7efcaf6c br.traceFlag=00"  }