mod_unique_id模块可为每个请求生成24字符base64唯一id并存入unique_id环境变量,需手动注入响应头、透传下游、写入日志,并确保集群中ntp同步、主机名唯一且可解析。

mod_unique_id 是 Apache 自带模块,能为每个请求生成一个 24 字符 Base64 编码的唯一字符串(如 WvXaYz1bC2dE3fG4hI5jK6lM),存入环境变量 UNIQUE_ID。但它本身不输出、不透传、不跨服务——要用于全链路追踪,必须手动注入响应头、透传给后端、写入日志,并确保集群环境满足基础前提。
启用 mod_unique_id 模块
该模块默认未加载,直接配置会报错 Invalid command 'UniqueIDHeader'。
- Linux(Debian/Ubuntu):
a2enmod unique_id && systemctl reload apache2 - RHEL/CentOS:取消
httpd.conf中LoadModule unique_id_module modules/mod_unique_id.so前的注释,再执行systemctl reload httpd - 验证是否生效:
httpd -M | grep unique_id应输出unique_id_module (shared) - 若启动失败并提示
unable to find IPv4 address of "xxx",说明主机名解析失败;需在/etc/hosts中补全本机主机名映射,例如:127.0.0.1 localhost your-hostname
将 UNIQUE_ID 注入响应头与下游请求
仅生成 ID 不够,必须显式暴露并传递,否则前端和后端都不可见。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 返回给客户端(如供前端埋点或调试):
Header always set X-Request-ID "%{UNIQUE_ID}e" - 透传给后端服务(如 PHP/Python/Node.js):
RequestHeader set X-Request-ID "%{UNIQUE_ID}e" env=UNIQUE_ID
⚠️ 必须加env=UNIQUE_ID,否则未生成 ID 时会传空值,导致下游收到X-Request-ID:(冒号后为空) - 若入口是负载均衡器(如多台 Apache 做反代),建议用
setifempty兜底:RequestHeader setifempty X-Request-ID "%{UNIQUE_ID}e",避免上游已携带 ID 时被覆盖
写入访问日志并关联上下文
把 UNIQUE_ID 写进 access.log,是实现日志聚合追踪的基础。
- 定义含 ID 的日志格式:
LogFormat "%{UNIQUE_ID}e %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" trace_log - 应用到虚拟主机或全局:
CustomLog /var/log/apache2/access.log trace_log - 验证方式:发起请求后查日志,首字段应为 24 位字符串;若看到
-,说明该请求未进入完整处理流程(如被 mod_security 拦截、SSL 握手失败、缓存直出等)
集群环境注意事项
mod_unique_id 在合理配置下支持多机唯一,但有硬性前提:
- 所有服务器必须启用 NTP 时间同步(误差建议 ≤ 1 秒),否则时间戳部分可能重复
- 每台机器的
Hostname必须不同,且能通过gethostbyname()解析出唯一 IPv4 地址 - Apache 进程 PID 需在 32 位范围内(主流系统默认满足)
- ID 本身不含服务名或路径信息,如需区分业务线,可组合使用:
Header always set X-Trace-ID "web-%{UNIQUE_ID}e"









