You need to enable JavaScript to run this app.
导航
检索分析 Nginx 访问日志
最近更新时间:2024.11.08 10:53:42首次发布时间:2024.11.08 10:53:42

您可以通过 Nginx 访问日志监控网站运行状况以及快速定位网站异常问题。本文介绍 Nginx 访问日志的常见分析场景及示例。

背景信息

Nginx 是一款主流的网站服务器,其日志在运维过程中是不可或缺的重要信息来源。您可以将 Nginx 访问日志上传到日志服务,然后通过日志实时检索分析功能,更好地了解网站运行状况,及时发现并解决问题,提高用户体验和服务质量。例如:

  • 通过分析客户端 IP 地址,可以获取客户端分布情况,了解用户来源地域,从而优化网站的地域针对性服务。
  • 通过分析请求状态码,获取不同状态码的请求比例,了解网站健康情况,及时发现及解决潜在问题。
  • 通过统计页面访问量(PV)和独立访客数(UV),可以评估网站流量和用户活跃度,为市场推广和运营决策提供数据支持。
  • 通过统计访问来源,了解流量最多的渠道,从而优化营销策略。
  • 通过分析请求的响应时间,及时发现性能瓶颈,优化服务器性能。
  • 通过计算每秒系统能处理的查询数量(QPS),了解服务器的负载情况,及时调整资源。

前提条件

  • 已创建日志项目和日志主题。具体操作,请参考创建资源
  • 已根据日志字段创建索引。具体操作,请参考配置索引

日志样例

下述表格罗列了 Nginx 访问日志的重要字段样例。

字段

说明

__time__

日志记录的时间戳。

app_id

应用的唯一标识符。

host

请求的目标主机。

hostname

服务器的主机名。

referer

请求的来源页面地址(HTTP Referer 头)。

remote_addr

客户端的 IP 地址。

request_method

HTTP 请求方法(如 GET、POST 等)。

request_time

请求处理的时间。

request_uri

请求的 URI(统一资源标识符)。

server_protocol

服务器使用的协议(如 HTTP/1.1、HTTP/2 等)。

status

HTTP 响应状态码。

time_local

本地时间戳。

upstream

上游服务器的信息,通常用于反向代理场景。

upstream_response_time

上游服务器响应的时间。

upstream_status

上游服务器的响应状态码。

user_agent

客户端的用户代理字符串,用于识别客户端的浏览器和操作系统信息。

x_forwarded_for

HTTP 头,用于识别经过代理服务器的客户端 IP 地址。

x_real_ip

客户端的真实 IP 地址,通常在经过代理时使用。

索引配置示例

本案例基于上述日志样例创建了如下索引配置。索引配置的具体操作及注意事项,请参考配置索引
Image

典型检索分析场景

Nginx 访问日志的典型分析场景主要覆盖业务监控、性能调优、监控告警等方面。

业务监控

场景 1:统计每天的 PV、UV

  • 场景:统计最近一天内每 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 以及变化趋势。更多信息,请参考折线图
    Image

场景 2:统计 QPS

  • 场景:统计最近一天的 QPS 变化趋势。

  • 检索分析语句:

    * | SELECT __time__-__time__%60000 AS time, COUNT(*)/60 AS qps GROUP BY time ORDER BY time LIMIT 10000
    
  • 检索分析结果:
    通过折线图(开启时序模式)展示最近一天的 QPS 变化趋势。更多信息,请参考折线图
    Image

场景 3:统计请求方法分布

  • 场景:计算请求方法分布情况。

  • 检索分析语句:

    * | SELECT  COUNT(*) AS count, "request_method" GROUP BY "request_method"
    
  • 检索分析结果:
    通过饼图展示请求方法分布情况。更多信息,请参考饼图
    Image

场景 4:统计请求失败率

  • 场景:统计每分钟请求的总失败率、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
    
  • 检索分析结果:
    通过折线图展示总失败率、各个错误的失败率以及变化趋势。更多信息,请参考折线图
    Image

场景 5:统计 Top 100请求的应用

  • 场景:统计 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
    
  • 检索分析结果:
    Image

场景 6:统计 Top 10 请求数量

  • 场景:统计 Top 10 请求数量以及其对应的请求页面

  • 检索分析语句:

    * | SELECT SPLIT_PART(request_uri,'?',1) AS path, COUNT(1) AS pv  GROUP BY path ORDER BY pv DESC LIMIT 10
    
  • 检索分析结果:
    Image

性能调优

通过分析Nginx 访问日志掌握请求延时等信息,及时识别网站瓶颈,从而优化网站性能。

场景 1:统计平均时延和最大时延

  • 场景:统计最近一天内每小时的请求平均时延和最大时延。

  • 检索分析语句:

    * | 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
    
  • 检索分析结果:
    通过折线图展示最近一天内每小时的请求平均时延、最大时延以及变化趋势。更多信息,请参考折线图
    Image

场景 2:统计最大时延及其对应的请求页面

  • 场景:统计最近一天内每小时的最大请求时延以及其对应的请求页面。

  • 检索分析语句:

    * | 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
    
  • 检索分析结果:
    Image

场景 3:统计 Top 3 请求时间

  • 场景:统计最近一天内最大的三个请求时间。

  • 检索分析语句:

    * | SELECT MAx(request_time,3) AS "TOP 3"
    
  • 检索分析结果:
    Image

场景 4:查询请求的平均延时、P50 延时和 P99 延时

  • 场景:统计每小时的错误数,发生错误时触发告警。

  • 检索分析语句:

    * | 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 延时以及变化趋势。更多信息,请参考折线图
    Image

场景 5:统计请求时长直方图

  • 场景:统计请求时长直方图。

  • 检索分析语句:

    * |SELECT NUMERIC_HISTOGRAM(10,request_time)
    
  • 检索分析结果:
    Image

场景 6:页面调优

  • 场景:通过计算目标页面(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
    
  • 检索分析结果:
    Image

监控告警

针对请求错误等问题,您可以通过告警功能实时监控网站,及时感知并处理异常情况。

场景 1:请求错误告警

  • 场景:统计每小时的错误数,发生错误时触发告警。

  • 检索分析语句:

    status >= 400 | SELECT COUNT(*) as count
    
  • 检索分析结果:
    Image

  • 告警策略配置:
    创建告警策略的具体操作,请参考快速设置日志告警
    Image

场景 2:请求平均延迟告警

  • 场景:基于 healthz 页面的平均请求延时创建告警,监控 healthz 页面相关请求的基本延时情况。

  • 检索分析语句:

    request_uri:"healthz" | SELECT AVG(request_time) AS avg
    
  • 检索分析结果:
    Image

  • 告警策略配置:
    创建告警策略的具体操作,请参考快速设置日志告警
    Image

场景 3:请求时延 P99 告警

  • 场景:使用平均延时无法有效反映个别较高延迟的请求,不足以展示网站真实的运行情。而通过统计时延的百分数(例如 P99 延时)来创建告警,可以更及时感知处于较高延迟的请求。

  • 检索分析语句:

    request_uri:"healthz" | SELECT APPROX_PERCENTILE(request_time, 0.99) AS p99
    
  • 检索分析结果:
    Image

  • 告警策略配置:
    创建告警策略的具体操作,请参考快速设置日志告警
    Image