`

基于Lua+Kafka+Heka的Nginx Log实时监控系统

阅读更多

背景

在我们的系统架构中,Nginx作为所有HTTP请求的入口,是非常重要的一层。每天产生大量的Nginx Access Log,闲置在硬盘上实在是太浪费资源了。所以,能不能把Nginx日志利用起来,实时监控每个业务的访问趋势、用户行为、请求质量和后端异常呢,这就是本文要探讨的主题。

目的

  1. 错误码告警(499、500、502和504);
  2. upstream_response_time超时告警;
  3. request_time超时告警;
  4. 数据分析;

关于错误和超时监控有一点要考虑的是收到告警时,要能够快速知道是哪个后端服务节点出现了问题。
在这之前,我们都是通过随机进入一个Nginx节点tail log才能定位到,效率有些低。

架构

废话不多说,先上架构图。整体架构没太复杂的地方,随便画了一张,莫笑话我~

架构图

日志采集

这部分结合lua-resty-kafka使用Lua扩展将数据按照一定格式拼接后写入Kafka集群。Nginx+Lua的性能就不用多说了,这样一来完全可以关掉Nginx本身的日志开关,减少磁盘消耗;

消息队列

我们数据分析组的同事在这之前就已经建立Kafka集群,无需再搞一套消息队列服务。另外一个很重要的点是,我们不希望日志数据取完就删掉了,运维组除了要做监控告警之外,数据组也要读取数据做分析。因此,如Redis此类的消息队列就直接被我们pass掉了;

异常监控计算

这部分使用Heka来做,Heka使用Go语言编写,内置丰富的插件可以满足大部分的需求。若不满足需求,可以使用Go或者Lua自行开发扩展。之前使用过Logstash做业务日志收集,但它有时的CPU占用实在太吓人,不敢再在业务机上使用,并且感觉扩展不方便。就我们目前的应用来看,Heka的性能和资源占用还是很不错的。

可以使用Filter做计算,有错误时向Heka消息流中写入告警消息,SMTPOuter匹配到告警消息后通过自定义的Encoder定制好邮件内容后再发送。

可视化

Heka层一方面做异常监控,另一方面使用Message Matcher Syntax匹配异常数据写入到Elasticsearch, 再架设一个Kibana。我们在收到告警邮件后,就可以进入Kibana后台查看异常的Log。

不足

  1. 邮件告警机制需要优化, 我们目前的设置是每分钟检查一次,发现错误就会一直告警。之后可以优化为发现异常时告警一次,异常结束时再发一次汇总邮件;
  2. Heka服务管理和进程监控需要优化,支持自动重启,不然进程挂了都不知道;
  3. Heka配置接入配置中心并支持自动重启(目前的配置主要是各业务的告警阀值,需要进入机器修改);

总结

整个开发过程还是比较顺利的,唯一比较耗时的是熟悉Heka的整个消息处理的流程和机制,以及如何开发扩展。另一个比较坑的是Heka的错误提示不全和调试不方便,有时完全靠猜,不过好在它本身并没有多复杂,有些问题看一看源代码就明白了。

关于消息队列的选择,前面已经提到我们已有Kafka集群就直接拿来用了。如果仅仅做异常监控,不需要消息留存, 倒可以考虑使用Redis之类轻量些的消息队列, Kafka未免有些重了。

原文地址: http://mlongbo.com/2015/NginxLog%E5%AE%9E%E6%97%B6%E7%9B%91%E6%8E%A7%E...

分享到:
评论

相关推荐

    nginx+lua+docker+docker-compose实现简单服务分发

    nginx+lua+docker+docker-compose实现简单服务分发

    nginx+lua+redis通过匹配客户端ip进行灰度发布

    nginx+lua+redis通过匹配客户端ip进行灰度发布 本文将讲述如何使用nginx、lua和redis来实现灰度发布,通过匹配客户端IP来实现灰度发布。灰度发布是一种常见的软件发布方式,它允许开发者在生产环境中发布新的版本,...

    nginx+lua+redis实现token验证

    本文将深入探讨如何利用`nginx+lua+redis`来实现`token`验证,以确保只有经过授权的用户才能访问受保护的资源。 首先,让我们理解`token`验证的基本原理。`token`验证是一种身份验证机制,它允许客户端通过提供一个...

    lua++与C++交互

    lua++是基于tolua++改进的库,它提供了一个简洁的API,使得C++开发者能够轻松地创建和管理Lua对象。通过lua++,你可以将C++类暴露给Lua,这样在Lua脚本中就可以像操作原生类型一样操作这些类。这极大地提高了开发...

    nginx+lua+redis 集群 连接插件和脚本

    本资源包“nginx+lua+redis集群 连接插件和脚本”正是为了解决这三者之间的协同工作,特别是针对原插件没有密码功能的问题进行了改进,使得安全性得到了提升。 首先,Nginx是一款轻量级的Web服务器/反向代理服务器...

    基于Springboot+Redis+Mysql+Kafka开发的高并发限时的商品秒杀系统.zip

    基于Springboot+Redis+Mysql+Kafka开发的高并发限时的商品秒杀系统.zip 毕业设计 基于springboot mysql Vue的系统开发,供参考,提供说明材料+源代码 毕业设计 基于springboot mysql Vue的系统开发,供参考,提供...

    nginx-lua-GraphicsMagick

    通过上述步骤,我们已经成功地搭建了一个基于Nginx-Lua-GraphicsMagick的图片处理服务。这个服务可以高效地处理大量图片请求,提供图片切割和缩放功能,减少了服务器的CPU和内存压力。为了进一步优化,你可以考虑...

    lua+nginx动态更新配置.zip

    在nginx初始化中使用init_worker_by_lua_file 指令创建一个循环定时器,每次超时的时候去判断配置文件是否更新了。如果更新了重新加载。 通过在工作线程中使用rewrite_by_lua_block指令,获取任意时刻的配置情况测试...

    lua+redis+nginx

    总结起来,`Lua+Redis+Nginx` 构建的服务器架构具有以下优点: 1. 高性能:`Nginx` 的非阻塞I/O模型和 `Lua` 的快速执行使得系统能处理大量并发请求。 2. 扩展性:通过 `Lua` 实现动态逻辑,减少对后端应用的压力,...

    nginx实战-基于lua语言

    5. **日志处理**:通过Lua对请求日志进行实时分析,提供实时监控和报警功能。 ### 三、Lua脚本的编写与执行 1. **Nginx配置中的Lua**:在Nginx配置文件中,使用`location`块定义 Lua 脚本的入口点,例如`content_...

    Nginx+Lua+GraphicsMagick图片缩略图

    Nginx+Lua+GraphicsMagick实现动态生成指定尺寸的图片

    nginx、lua、jwt安装包及蓝绿发布代码

    nginx安装lua、jwt模块,通过lua验证jwt实现蓝绿发布样例demo,配置直接可用 luajit2-2.1-20220411.tar.gz #luajit官网存在一定的坑,下载openresty的优化版本 lua-nginx-module-0.10.22.tar.gz # 0.10.16 以后都...

    基于nginx+lua+dyups实现服务自定义调度资源整理

    `ngx_dyups`是另一个用于动态更新`upstream`的`nginx`模块,它可以实时监控服务器状态并进行调度决策。 1. 参考资料:[Dyups 模块动态修改 upstream](https://github.com/yzprofile/ngx_http_dyups_module) 2. ...

    基于lua的nginx自定义负载均衡

    基于lua的nginx自定义负载均衡基于lua的nginx自定义负载均衡

    跟我学Nginx+Lua开发_nginxlua原理_nginx_

    可以借助 ngx.log 输出日志,使用luac或luadump 进行脚本编译和分析,以及通过Nginx的错误日志和访问日志了解运行状态。 总结,《跟我学Nginx+Lua开发》这本书深入浅出地讲解了如何利用Nginx与Lua进行Web服务开发,...

    nginx+lua+php+redis实现单业务排队系统架构.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发Node.js、C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    idea+openresty+lua运行nginx服务器.zip

    idea+openresty+lua运行nginx服务器, 代码和软件都有, 参考资料: https://blog.csdn.net/dongyuxu342719/article/details/90413904

    缩略图OpenResty(Nginx)+Lua+GraphicsMagick

    首先,OpenResty是一个基于Nginx Web服务器的扩展平台,它集成了LuaJIT,允许开发者用Lua语言直接编写高性能的HTTP服务器端应用。通过在Nginx中嵌入Lua脚本,我们可以利用Nginx的并发处理能力,以及Lua的轻量级和高...

    Nginx+Lua+Redis+Json

    "Nginx、Lua、Redis 和 Json 的结合应用" Nginx 是一个高性能的 ...本文介绍了如何使用 Nginx、Lua、Redis 和 Json 来构建一个高效的系统,能够处理高并发的请求,并提供了丰富的功能和模块来满足大多数的应用场景。

    2 OpenResty+Lua+Redis 高性能后端接口.docx

    OpenResty+Lua+Redis 高性能后端接口 OpenResty 是基于 Nginx 的高性能 web 服务器,它使用 Lua 语言作为脚本语言来实现动态内容生成和处理。 Lua 是一种轻量级的脚本语言,广泛应用于游戏、嵌入式系统和 web 开发...

Global site tag (gtag.js) - Google Analytics