$scheme 是 Nginx 内置变量,直接记录客户端请求协议(http/https),由 SSL 握手状态自动确定,比 $server_port 和 $http_x_forwarded_proto 更可靠;配置 log_format 即可启用,支持精准统计 HTTPS 占比。

$scheme 是 Nginx 日志格式中一个内置的变量,用于记录客户端发起请求时所使用的协议(即 http 或 https)。它不依赖于后端应用或代理配置,而是由 Nginx 在接收请求的第一时间就确定并记录,因此是统计 HTTP/HTTPS 流量占比最直接、最可靠的依据。
为什么用 $scheme 而不是 $server_port 或 $http_x_forwarded_proto
很多人误以为通过端口(如 80/443)或转发头(如 X-Forwarded-Proto)就能准确判断协议类型,但这些方式存在明显局限:
-
$server_port只反映 Nginx 监听的端口,无法体现真实客户端协议——例如反向代理场景下,用户访问 HTTPS,但 Nginx 与上游之间走的是 HTTP 80 端口,此时端口值为 80,却不代表流量是 HTTP -
$http_x_forwarded_proto完全依赖上游代理主动设置,可被伪造或遗漏,不具备可信性;若未启用 proxy_set_header,则该变量为空,导致日志缺失 -
$scheme由 Nginx 内部根据 SSL 握手状态或监听套接字类型自动设定,无需额外配置,天然防篡改、零延迟、始终可用
如何在 access_log 中启用 $scheme 统计
只需修改 Nginx 配置中的 log_format,将 $scheme 加入自定义日志字段即可。例如:
然后在 access_log 指令中引用该格式:
重启或重载 Nginx 后,每条日志末尾就会多出 http 或 https 字样,便于后续解析与聚合。
快速计算 HTTPS 占比的常用方法
日志就绪后,可通过简单命令行分析获取实时占比:
- 统计总请求数:
wc -l /var/log/nginx/access.log - 统计 HTTPS 请求数:
awk '$12 == "https" {n++} END {print n+0}' /var/log/nginx/access.log(假设 $scheme 是第 12 列,列数需根据实际 log_format 调整) - 一次性输出占比(保留两位小数):
awk '$12=="https"{h++} {t++} END{printf "%.2f%%\n", h/t*100}' /var/log/nginx/access.log
也可导出日志到 ELK、Grafana + Loki 等平台,用可视化图表持续监控趋势。
注意事项与典型陷阱
使用 $scheme 时需注意几个易错点:
- 确保日志格式中没有多余的空格或引号干扰字段分隔,否则 awk 按空格切分会出错;建议用固定分隔符(如
|)替代空格,提升解析稳定性 - 如果启用了多个 server 块且监听不同协议(如一个只 listen 80,另一个只 listen 443),
$scheme仍能正确工作,无需额外判断 - 在 HTTP/2 或 QUIC 场景下,
$scheme同样生效,Nginx 会如实记录为https(即使底层是 h2) - 不要混淆
$scheme和$request_scheme:后者是非标准变量,部分旧版本不支持,应统一使用$scheme











