前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nginx日志分析系统全景探秘

Nginx日志分析系统全景探秘

作者头像
用户1682855
发布于 2019-03-06 09:59:10
发布于 2019-03-06 09:59:10
2.2K0
举报
文章被收录于专栏:前沿技墅前沿技墅

Nginx的访问日志记录每条请求的来龙去脉,通过日志可以分析出很多有用的监控信息,如下面的这些信息。

  1. 请求的响应时间。
  2. 请求到达的后端服务器的地址和端口。
  3. 请求是否存在缓存配置。
  4. 请求体、请求头、响应体和响应头的大小等。
  5. 客户端的IP地址、User_Agent等信息。
  6. 自定义变量的内容。

通过这些信息,可以对请求的各项指标进行监控,这对应用级别的服务来说是非常重要的。下面将会对Nginx日志分析中常见的需求进行说明。

实战需求分析

首先需要确认Nginx日志分析应该使用什么类型的工具。与筛选动态upstream管理工具的方式一样,它应该至少满足如下条件。

  • 可以计算出URI响应的平均值,以及p90、p99等任意比例的值。

URI在指定的某段时间内按照请求的响应时间进行升序排列,p99的意思是指在99%这个位置的响应时间,即确认出99%的请求所花费的时间,用于体现服务的响应能力。

  • 可以对URI进行分组和汇总统计,特别是当URI为正则表达式类型时。

在很多业务中,URI会使用正则表达式类型的路由,以“折800商城”的详情页为例:shop.zhe800 .com/products/ze171126205509136896和 shop. zhe800.com/products/ze170814104348738286。这两个网址属于同一个URI服务类型,只是后面的数字不一样,它们在服务中都可以表示为shop.zhe800.com/products/[a-z0-9]+的正则表达式。如果不将这些带有正则表达式的URI进行归类,在汇总时URI会非常分散,从而无法做到准确的定位和报警。因此对URI进行归类分组是非常重要的。

  • 可以监控URI的走向,确认是否存在缓存,确认后端服务器属于哪个Web应用。

确认是否存在缓存的主要目的是避免出现上线时需要加缓存的服务没加的情况。可以通过日志分析定期梳理这些服务,找到没有添加缓存的服务,然后和业务部门确认是否需要配置缓存。(URI是否有缓存可以通过在响应头中加入特定的头信息进行标识,例如CDN缓存一般有Cache-Control头。)

  • 可以支持集群模式,大多数互联网公司会使用多台Nginx服务器,数据的分析需要在日志集中搜集后再进行。
  • 可以提供实时监控,及时进行分析并反馈异常信息。
  • 可以提供定制化服务,满足不同业务的需求。

上述功能的实现不必一蹴而就,可以在使用中通过不断迭代完成,在高并发、多业务模式下的服务均可参考这些需求。但如果Nginx的服务单一且并发程度较低,只需用一些简单的分析工具甚至脚本即可。

下面将会介绍一些工具,利用它们来完成上述各种需求。

ngxtop实时分析

ngxtop是用Python语言开发的在线分析工具,它可以对Nginx请求进行实时分析,使用方法也非常简单。

首先,安装ngxtop。ngxtop是Python的包,所以使用Python的pip命令安装即可(ngxtop支持Python 2和Python 3):

# yum install python-pip

# pip install ngxtop

在使用ngxtop时,需要确保Nginx日志格式是默认格式,因为ngxtop是通过对日志格式进行匹配得到数据的,所以格式改变将会导致数据分析异常。如果有新的变量要加入日志格式,请将其添加到默认配置的后面(新的变量在ngxtop中无法被分析,只能将其记录到硬盘上,以方便业务的其他需求),代码如下:

执行分析命令如下:

ngxtop会找到配置文件中access_log的位置,-n的作用是显示所输出URI的行数,默认是10行。ngxtop日志分析结果如图1所示。

图1 ngxtop日志分析结果

从图1中可以看到请求的总量、URI的访问次数、平均发送字节数及HTTP状态码。

ngxtop还支持如下功能。

  • 支持直接分析指定的日志文件,命令为“ngxtop -l“Nginx日志文件路径”;”。
  • 支持对IP地址进行不同条件的排名,命令为“ngxtop --config/usr/local/nginx/ conf/nginx. conf top remote_addr”。
  • 支持日志过滤,若只需要HTTP状态码为502的数据,则命令为“ngxtop -l /data1/access.log --filter 'status == 502'”。

在网站搭建初期,使用ngxtop对实时分析有很大的帮助,但随着网站规模的扩大、业务的增多,继续使用此工具会遇到瓶颈。总结ngxtop的优缺点如下。

优点:

  • 安装和使用非常简单。
  • 有多种实时工具和数据分析模型。
  • 对Nginx版本没有依赖性,不必担心Nginx版本升级造成的兼容问题,只要日志格式符合要求即可。

缺点:

  • 无法自定义监控数据。
  • 数据汇总能力欠佳,无法对有正则表达式的服务进行监控。
  • 不支持集群化,适合对单点的Nginx服务器进行分析。
  • 日志格式不灵活,只能在后面追加格式。

总而言之,它比较适合小型单机网站或临时问题的分析。另外,还有一个工具GoAccess与ngxtop比较类似。

Flume方案的日志分析

由于ngxtop工具的局限性,特别是它在集群化方面的缺陷,我们需要重新寻找工具,经过筛选决定采用Flume来收集数据完成日志汇总,并利用比较流行的Elasticsearch来进行数据存储。Flume方案的日志分析流程图如图2所示。

图2 Flume方案的日志分析流程图

  • Flume负责收集日志,并将数据格式规范化后写入Kafka
  • Kafka中的数据被Storm实时分析,并在计算后写入Elasticsearch。
  • Elasticsearch中的数据被用于实时和离线的各类数据统计。

先说说这个方案的优缺点。

优点:

  • 使用Flume来收集日志,性能有保证,并且可以自定义日志格式。
  • Kafka可以横向扩展,性能好且数据不易丢失,适用于资源消耗压力较大的情况。
  • Storm是非常有名的实时分析工具,可以很方便地实现自定义的需求。
  • Elasticsearch也支持扩展,并支持多种SQL查询,使数据的汇总分析变得更加简单。

缺点:

  • 使用了过多的组件,如果只是用来监控服务,有点小题大做。
  • 当自定义需求时,如把正则表达式类型的URI服务归类,此时,在Storm中计算需要和开发语言(如Java)进行互动,在高并发状态下,资源消耗会过多。
  • Elasticsearch的SQL功能虽多,但仍然无法满足各种数据分析的需要,会导致很多计算仍须依靠代码分析或混用多条SQL语句来完成。
  • 在高并发情况下,Flume的收集和格式化操作容易对Nginx服务器的资源产生过多消耗。

组件的安装和使用方法在网上有很多资料,这里不再赘述。

Flume方案对资源消耗过多,维护成本也高,随着业务的发展,最终会被放弃,取而代之的是一个全新的数据收集和分析工具,这也是本文要介绍的重点内容——智能化nginx_log_ analysis。

智能化nginx_log_analysis

  • 架构重构

现在除进行日志分析外,日志分析工具还需要同时满足高性能、低消耗、迭代方便等需求。看上去确实有点令人头疼,毕竟在开源社区中,能够产品化的Nginx日志分析工具非常少,那么可以自己开发一套工具来实现这些功能。

如果可以在Nginx上将数据格式化后直接通过网络发送给数据库,再由数据库完成分析,这样中间的其他环节(如读取硬盘、格式化日志等)都可以省略了,那么将会极大地降低维护成本。但如何才能让这种设想得以实现呢?这就要用到前面学习过的Ngx_Lua(参见《Nginx实战》的相关章节)了。具体流程分析如下。

  1. Nginx的日志内容是由Nginx的变量组成的,Ngx_Lua可以直接获取这些变量。
  2. Ngx_Lua可以对Nginx变量进行数据处理,如格式化、对URI进行分类等。
  3. Ngx_Lua可以利用log_by_lua*在log执行阶段将整合好的数据传到远程服务器上。
  4. 远程服务器是一个时序数据库,它可以执行多种函数,如p90计算、平均数计算、热点数据计算、分组、正则匹配,甚至设置定时任务等。
  5. 数据库要求是高性能的,能处理实时的数据分析。

最后,将计算后的数据和监控系统打通,以便提供报表和报警的功能。但是,鉴于代码过多,笔者选择将这个系统的所有代码在GitHub上进行了开源,地址是https://github.com/leehomewl/nginx_ log_analysis。

注意:本文不会对所有代码都进行讲解,但会选取一部分代码进行说明,主要目的是让读者了解如何在开发中使用Ngx_Lua来完成架构设计和流程规划,从而提升开发水平。

  • 日志远程传输

首先,需要解决日志远程传输的问题,而且要支持集群化,即数据的传输要统一存储、统一计算。

这里需要用到模块lua-resty-logger-socket,它的主要功能是以非阻塞I/O的方式推送数据到远程服务器上。它属于Nginx的log执行阶段,是在请求反馈给客户端后执行的操作,所以在此处传输日志,即使数据推送失败,也不会影响客户端的响应。

  • 时序数据库

Nginx对日志的分析基于时间的维度,如波动的报表、请求PV(Page View,即页面浏览量)的涨幅、平均响应时间的对比等都是在时间的基础上进行的。再如常用的Nagios和Zabbix,在报警和监控中也是以时间为基础的,所以需要找一个时序数据库来支撑数据分析。

在时序数据库的选择上,可以使用InfluxDB,它是一款基于Go语言开发的开源分布式时序、事件和指标数据库,非常适合处理监控数据,它提供了很多函数,这些函数包含了绝大部分的数据计算方式,可以简化数据分析的代码。关于InfluxDB的用法请参考《Nginx实战》的相关章节。

  • 日志规则设计

在Nginx中,用来记录后端响应时间的变量是$upstream_response_time,但有时它会有多个值,各值之间以逗号来分隔,这样做是因为受proxy_next_upstream的控制,当后端服务响应异常时会将请求代理到另一台后端服务器上进行响应,所以就出现了多个值。这样会导致存放在数据库中的响应时间字段的部分数据不是数字,InfluxDB函数无法执行计算。为了避免出现这种情况,在Nginx写入时就要将以逗号分隔的数字累加后再插入数据库中。

在Nginx中URI的变量是$uri,它不包含URL中的参数,$uri即服务。之前提到过,如果URI无法区分正则表达式,就会导致计算分散化,从而失去分析和监控的意义。因此需要在Nginx中将这些正则表达式的数据区分出来。

那么如何让Ngx_Lua知道URI是否是正则表达式的呢?这就涉及URI认领的问题了,大致方式如下。

  1. 清理公司业务线上使用的URI。
  2. 对URI进行筛选,确认哪些是精确URI、哪些是可以合并到正则URI上的URI。
  3. 将筛选后的URI数据存放到MySQL中。
  4. Ngx_Lua从MySQL读取URI数据并将其存放到内存中。
  5. 当客户端请求发送到Nginx时,Ngx_Lua在log阶段判断当前请求属于哪个URI服务(正则URI或精确URI)。

URI认领并非只为了方便数据汇总,它还可以实现更多功能,例如,想要判断某个项目是否使用了新的URI,可以用Ngx_Lua在测试环境下做一层验证,判断请求的URI是否为认领中的服务,如果不是,则为新URI。这样每次上线前都可以提前配置和监控URI。在补充监控时也可以对新增的URI添加其他属性,如配置缓存、监控POST的数据长度范围、进行降级容灾处理等。总之,通过这种方式,可以对URI做非常细致的监控。

关于正则表达式URI的存放和匹配格式,下面举例说明。例如,MySQL中存放了一个路由是/a/b/[0-9]+的URI服务,并由Nginx将该数据读取到内存中进行缓存,当客户端请求Nginx且URI是/a/b/123或/a/b/345时,就会被Ngx_Lua匹配成/a/b/[0-9]+,最后将/a/b/[0-9]+写入InfluxDB,并会用它来完成数据分析。

通过这套流程,就可以得到想要的分析报告了。

注意:以上对MySQL的应用,只是为了区分URI是正则表达式还是精确类型,有些读者的服务可能只有精确的URI,在这种情况下,MySQL是可以去掉的,但如果读者希望使用更多的监控功能,MySQL还是非常重要的,这在《Nginx实战》的相关章节中会有详细的讲解。

本文节选自新书《Nginx实战:基于Lua语言的配置、开发与架构详解》中对于“Nginx日志分析系统”的精彩剖析。在这一部分,更不乏关于日志远程传输、时序数据库等具体用法和实战案例。这本书是作者多年来在Nginx方面技术积累以及实践的结晶,深入浅出地讲解了Nginx+Lua在实战场景中的各种使用技巧和方法,涉及配置、模块、缓存、日志分析、静态容灾、反向代理、爬虫、性能分析与优化等众多方面,帮助提升服务性能。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前沿技墅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用Python+MySQL实现2017年web日志分析报告
日志分析在web系统中故障排查、性能分析方面有着非常重要的作用。目前,开源的ELK系统是成熟且功能强大的选择。但是部署及学习成本亦然不低,这里我实现了一个方法上相对简单(但准确度和效率是有保证的)的实现。另外该脚本的侧重点不是通常的PV,UV等展示,而是短期内(如三天历史or一周历史)提供细粒度的异常和性能分析。 先说一下我想实现这个功能的驱动力(痛点)吧: 我们有不少站点,前边有CDN,原站前面是F5,走到源站的访问总量日均PV约5000w。下面是我们经常面临一些问题: CDN回源异常,可能导致我们
小小科
2018/05/03
1.2K0
用Python+MySQL实现2017年web日志分析报告
『学习笔记』Nginx日志分析与性能调优
🎈今日推荐——https://cloud.tencent.com/developer/article/2472042
数字扫地僧
2024/11/29
4020
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
1、Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等。 Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。其中模块化设计是nginx的一大卖点,甚至http服务器核心功能也是一个模块。要注意的是:n
用户1177713
2018/02/24
23.2K0
玩转 Nginx 之:使用 Lua 扩展 Nginx 功能
『学习笔记』Nginx 中的 Rewrite 规则与应用示例详解
🎈今日推荐——https://cloud.tencent.com/developer/article/2471396
数字扫地僧
2024/11/27
5250
项目实践|基于Flink的用户行为日志分析系统
用户行为日志分析是实时数据处理很常见的一个应用场景,比如常见的PV、UV统计。本文将基于Flink从0到1构建一个用户行为日志分析系统,包括架构设计与代码实现。本文分享将完整呈现日志分析系统的数据处理链路,通过本文,你可以了解到:
Spark学习技巧
2020/09/08
2.4K0
项目实践|基于Flink的用户行为日志分析系统
五分钟学NGINX-详解nginx的11个请求阶段
Nginx,作为当今最流行的开源Web服务器之一,以其高性能、高稳定性和丰富的功能而闻名。在处理HTTP请求的过程中,Nginx采用了模块化的设计,将整个请求处理流程划分为若干个阶段,每个阶段都可以由特定的模块来处理。这种设计不仅使得Nginx具有极高的灵活性和可扩展性,而且也方便了开发者对Nginx进行定制和优化。我们将深入探讨Nginx处理HTTP请求的11个阶段,揭示其背后的工作原理。
五分钟学SRE
2024/04/22
2.6K0
系统日志分析: 从日志文件到关键洞察
在当今数字化世界中,系统日志分析变得至关重要。作为一名博主,我将分享关于系统日志分析的深入研究,展示如何从日志文件中提取关键信息,以及如何应用这些信息来优化系统性能和安全性。在这篇博客中,我将为您提供详细的指导,并演示如何使用各种工具和技术来进行系统日志分析。
默 语
2024/11/20
2850
Python老司机带你快速搞定日志分析工具
转载自:Python中文社区 ID:python-china 日志分析在web系统中故障排查、性能分析方面有着非常重要的作用。该工具的侧重点不是通常的PV,UV等展示,而是在指定时间段内提供细粒度(最小分钟级别,即一分钟内的日志做抽象和汇总)的异常定位和性能分析。 环境安装 Python 3.4+ pymongo 3.4.0+ MongoDB server 先明确几个术语 uri指请求中不包含参数的部分; request_uri指原始的请求,包含参数或者无参数; args指请求中的参数部分。(参
小小科
2018/05/04
9920
Python老司机带你快速搞定日志分析工具
Nginx 静态资源部署
上网去搜索访问资源对于我们来说并不陌生,通过浏览器发送一个 HTTP 请求实现从客户端发送请求到服务器端获取所需要内容后并把内容回显展示在页面的一个过程。这个时候,我们所请求的内容就分为两种类型,一类是静态资源、一类是动态资源。
用户9615083
2022/12/25
5.7K0
Nginx 静态资源部署
史上最简单的 Nginx 教程,没有之一!
原文链接:https://juejin.im/post/5d81906c518825300
业余草
2019/09/25
3.7K0
史上最简单的 Nginx 教程,没有之一!
OpenResty的安装与使用
OpenResty是一个基于Nginx与Lua的高性能Web平台,可以用于Web服务动态网关等,能够处理极高的并发。所以对于我们来说学好OpenResty是很有必要的。
杜金房
2024/05/11
7670
OpenResty的安装与使用
Nginx---静态资源处理
前面我们已经对Nginx服务器默认配置文件的结构和涉及的基本指令做了详细的阐述。通过这些指令的合理配置,我们就可以让一台Nginx服务器正常工作,并且提供基本的web服务器功能。
大忽悠爱学习
2021/12/08
2.8K0
Nginx---静态资源处理
Nginx日志实时分析利器(Ngxtop)
Ngxtop实时解析nginx访问日志,并且将处理结果输出到终端,功能类似于系统命令top,所以这个软件起名ngxtop。有了ngxtop,你可以实时了解到当前nginx的访问状况,再也不需要tail日志看屏幕刷新。
子润先生
2021/07/07
2K0
腾讯技术课|基于Elastic Stack 搭建日志分析平台
为了让读者们可以更好的理解「如何基于Elastic Stack 搭建日志分析平台」,腾讯技术工程公众号特别邀请腾讯基础架构部的陈曦工程师通过语音录播分享的方式在「腾讯技术课」小程序里同步录制了语音+PPT解说版,点击小程序卡片即可收听: 以下为课程文字稿: 随着互联网、物联网的飞速发展,软硬件系统架构变得越来越复杂,分析各种系统产生的日志也变得越来越困难。在日志分析过程中,相信大部分同学会碰到以下问题: 1. 定位问题耗费大量时间 通常一个系统的各模块是分散在各个机器上的,定位问题时运维同学只能逐
腾讯技术工程官方号
2018/08/29
1.5K0
腾讯技术课|基于Elastic Stack 搭建日志分析平台
基于Elastic Stack搭建日志分析平台
(本次课程是通过小程序对外推广的,所以PPT是竖版的。电脑端浏览体验可能不太好,望大家见谅)
用户1644123
2018/08/25
1.5K0
基于Elastic Stack搭建日志分析平台
APISIX架构分析:如何动态管理Nginx集群?
开源版Nginx最为人诟病的就是不具备动态配置、远程API及集群管理的能力,而APISIX作为CNCF毕业的开源七层网关,基于etcd、Lua实现了对Nginx集群的动态管理。
陶辉
2023/10/18
1.1K0
APISIX架构分析:如何动态管理Nginx集群?
写给前端同学的Nginx配置指南
找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。
linwu
2023/08/15
1.8K0
写给前端同学的Nginx配置指南
Nginx Lua扩展模块
淘宝开发的 ngx_lua 模块通过将 Lua 解释器集成进 Nginx,可以采用 Lua 脚本实现业务逻辑,由于 Lua 的紧凑、快速以及内建协程,所以在保证高并发服务能力的同时极大地降低了业务逻辑实现成本。
用户9615083
2022/12/25
3.7K0
Nginx Lua扩展模块
了解Nginx
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
java架构师
2019/01/28
6360
了解Nginx
初识nginx——配置解析篇
一、nginx的介绍     nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理。相比较于其他的服务器,具有占用内存少,稳定性高等优势 二、nginx的配置      nginx的安装时配置文件默认在nginx程序安装目录的conf目录下,启动主配置文件默认为为nginx.conf 安装的时候可以通过—conf-path来指定配置文件的放置路径,同时启动的时候可以通过 -c指令来另行指定启动的配置文件 在修改配置后可以通过使用./nginx -t来检查配置文件是否正确,
magicsoar
2018/02/06
2.5K0
初识nginx——配置解析篇
相关推荐
用Python+MySQL实现2017年web日志分析报告
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档