您可以通过 Nginx 访问日志监控网站运行状况以及快速定位网站异常问题。本文介绍 Nginx 访问日志的常见分析场景及示例。
Nginx 是一款主流的网站服务器,其日志在运维过程中是不可或缺的重要信息来源。您可以将 Nginx 访问日志上传到日志服务,然后通过日志实时检索分析功能,更好地了解网站运行状况,及时发现并解决问题,提高用户体验和服务质量。例如:
下述表格罗列了 Nginx 访问日志的重要字段样例。
字段 | 说明 |
---|---|
| 日志记录的时间戳。 |
| 应用的唯一标识符。 |
| 请求的目标主机。 |
| 服务器的主机名。 |
| 请求的来源页面地址(HTTP Referer 头)。 |
| 客户端的 IP 地址。 |
| HTTP 请求方法(如 GET、POST 等)。 |
| 请求处理的时间。 |
| 请求的 URI(统一资源标识符)。 |
| 服务器使用的协议(如 HTTP/1.1、HTTP/2 等)。 |
| HTTP 响应状态码。 |
| 本地时间戳。 |
| 上游服务器的信息,通常用于反向代理场景。 |
| 上游服务器响应的时间。 |
| 上游服务器的响应状态码。 |
| 客户端的用户代理字符串,用于识别客户端的浏览器和操作系统信息。 |
| HTTP 头,用于识别经过代理服务器的客户端 IP 地址。 |
| 客户端的真实 IP 地址,通常在经过代理时使用。 |
本案例基于上述日志样例创建了如下索引配置。索引配置的具体操作及注意事项,请参考配置索引。
Nginx 访问日志的典型分析场景主要覆盖业务监控、性能调优、监控告警等方面。
场景:统计最近一天内每 5 分钟的网站 PV、UV以及变化趋势。
检索分析语句:
*| SELECT DATE_FORMAT(__time__ - __time__ % 300000, 'Y-M-d HH:mm') AS time, APPROX_DISTINCT(RemoteAddr) AS UV ,count(1) AS PV GROUP BY time ORDER BY time LIMIT 1000
检索分析结果:
通过折线图展示最近一天内每 5 分钟网站 PV、UV 以及变化趋势。更多信息,请参考折线图。
场景:统计最近一天的 QPS 变化趋势。
检索分析语句:
* | SELECT __time__-__time__%60000 AS time, COUNT(*)/60 AS qps GROUP BY time ORDER BY time LIMIT 10000
检索分析结果:
通过折线图(开启时序模式)展示最近一天的 QPS 变化趋势。更多信息,请参考折线图。
场景:计算请求方法分布情况。
检索分析语句:
* | SELECT COUNT(*) AS count, "request_method" GROUP BY "request_method"
检索分析结果:
通过饼图展示请求方法分布情况。更多信息,请参考饼图。
场景:统计每分钟请求的总失败率、404 错误率、 4xx 错误率以及 5xx 错误率。
检索分析语句:
* | SELECT DATE_TRUNC('minute', __time__) AS time, ROUND(SUM(CASE WHEN status = 404 THEN 1.00 ELSE 0.00 END)/ CAST(COUNT(*) AS DOUBLE)*100,3) AS "404比例(%)", ROUND(SUM(CASE WHEN status >= 500 THEN 1.00 ELSE 0.00 END)/cast(count(*) AS DOUBLE)*100,3) AS "5XX比例(%)", ROUND(SUM(CASE WHEN status >= 400 AND status < 500 THEN 1.00 ELSE 0.00 END)/CAST(COUNT(*) AS DOUBLE)*100,3) AS "4XX比例(%)", round(sum(CASE WHEN status >= 400 THEN 1.00 ELSE 0.00 END)/CAST(COUNT(*) AS DOUBLE)*100,3) AS "总失败率(%)" GROUP BY time ORDER BY time LIMIT 10000
检索分析结果:
通过折线图展示总失败率、各个错误的失败率以及变化趋势。更多信息,请参考折线图。
场景:统计 Top 100 请求数量的应用以及其对应的具体请求数量、请求成功率以及 QPS。
检索分析语句:
* | SELECT app_id, COUNT(*) AS PV, COUNT(DISTINCT(remote_addr)) AS UV, ROUND(SUM(CASE WHEN status < 400 THEN 1.00 ELSE 0.00 END)/CAST(COUNT(*) AS double)*100,3) AS "请求成功率", ROUND(COUNT(*)/60 , 2) AS QPS GROUP BY app_id ORDER BY PV DESC LIMIT 100
检索分析结果:
场景:统计 Top 10 请求数量以及其对应的请求页面
检索分析语句:
* | SELECT SPLIT_PART(request_uri,'?',1) AS path, COUNT(1) AS pv GROUP BY path ORDER BY pv DESC LIMIT 10
检索分析结果:
通过分析Nginx 访问日志掌握请求延时等信息,及时识别网站瓶颈,从而优化网站性能。
场景:统计最近一天内每小时的请求平均时延和最大时延。
检索分析语句:
* | SELECT DATE_TRUNC('hour', __time__) AS time, AvG(request_time) as avg_latency, MAX(request_time) AS max_latency GROUP BY time ORDER BY time
检索分析结果:
通过折线图展示最近一天内每小时的请求平均时延、最大时延以及变化趋势。更多信息,请参考折线图。
场景:统计最近一天内每小时的最大请求时延以及其对应的请求页面。
检索分析语句:
* | SELECT DATE_TRUNC('hour', __time__) AS time, MAX(request_time) AS max_latency, MAX_BY(request_uri,request_time) AS uri GROUP BY time ORDER BY time
检索分析结果:
场景:统计最近一天内最大的三个请求时间。
检索分析语句:
* | SELECT MAx(request_time,3) AS "TOP 3"
检索分析结果:
场景:统计每小时的错误数,发生错误时触发告警。
检索分析语句:
* | SELECT DATE_TRUNC('minute', __time__) AS time, AVG(request_time) AS latency, APPROX_PERCENTILE(request_time, 0.5) as p50, APPROX_PERCENTILE(request_time, 0.99) as p99 GROUP BY time ORDER BY time
检索分析结果:
通过折线图展示请求的平均延时、P50 延时和 P99 延时以及变化趋势。更多信息,请参考折线图。
场景:统计请求时长直方图。
检索分析语句:
* |SELECT NUMERIC_HISTOGRAM(10,request_time)
检索分析结果:
场景:通过计算目标页面(healthz 页面)的访问 PV、UV、各个请求方法的请求次数、各个请求状态的请求次数、各个浏览器的请求次数、平均延时和最大延时等数据,来调优页面性能。
检索分析语句:
request_uri:"healthz" | SELECT COUNT(1) AS PV, APPROX_DISTINCT(remote_addr) AS UV, HISTOGRAM(request_method) AS method_c, HISTOGRAM(status) AS status_c, HISTOGRAM(user_agent) AS user_agent_c, AVG(request_time) AS avg_l, MAX(request_time) AS max_l
检索分析结果:
针对请求错误等问题,您可以通过告警功能实时监控网站,及时感知并处理异常情况。
场景:统计每小时的错误数,发生错误时触发告警。
检索分析语句:
status >= 400 | SELECT COUNT(*) as count
检索分析结果:
告警策略配置:
创建告警策略的具体操作,请参考快速设置日志告警。
场景:基于 healthz 页面的平均请求延时创建告警,监控 healthz 页面相关请求的基本延时情况。
检索分析语句:
request_uri:"healthz" | SELECT AVG(request_time) AS avg
检索分析结果:
告警策略配置:
创建告警策略的具体操作,请参考快速设置日志告警。
场景:使用平均延时无法有效反映个别较高延迟的请求,不足以展示网站真实的运行情。而通过统计时延的百分数(例如 P99 延时)来创建告警,可以更及时感知处于较高延迟的请求。
检索分析语句:
request_uri:"healthz" | SELECT APPROX_PERCENTILE(request_time, 0.99) AS p99
检索分析结果:
告警策略配置:
创建告警策略的具体操作,请参考快速设置日志告警。