如何快速实现一个基于Nginx网站的监控场景

news/2024/5/12 15:43:11/文章来源:https://blog.csdn.net/weixin_34032827/article/details/90385141

如何快速实现一个基于Nginx网站的监控场景

一切从应用服务监控说起

小明所在的一家小型互联网创业公司一直将应用运行在阿里云上。该应用采用通用的分布式 Nginx+App 架构为用户提供电商数据统计的 webservice 服务。应用运行至今除偶发各类 Bug,性能问题以外,情况还算良好。

undefined

最近,小明的老板给小明布置了一个任务,希望把应用服务监控起来,以提高应用运行质量。老板的需求有三点:

1.先以应用服务监控为抓手,能

  1. 实时统计应用各类服务的调用次数
  2. 基于 a,实时统计各类服务各类返回值的次数,如 200,404,500,等。
  3. 基于 b,如果某类返回值调用超限,进行实时报警。

2.提供历史查询功能,能返回任意时段任意服务任意返回值调用次数统计。

3.以后未来公司各类定制的业务监控能快速扩展到该系统上,如各接口响应统计时间,用户特征统计等。

“方案尽量多快好省,而且搭建的监控平台最好就在阿里云上,数据不要外放在第三方云上,主要是为了公网流量成本和以后大数据分析作准备”,老板最后提到。

技术选项

小明接到任务以后开始着手进行技术选型。摆在他面前貌似可行的有三个选择,传统 OLAP 式处理方式,搜索引擎,以及实时计算方式。

undefined

在调研现状和众多技术后,他发现,

由于公司业务规模不小,白天峰段的平均 QPS 已经上百,而且业务还在快速增长,因此将每秒上百次调用信息每次直接存放到数据库中再实时查询肯定不合适,成本太高且不适合扩展。

阿里云提供搜索引擎服务,错误统计功能基本能满足老板需求。但是不确定因素有两个。一方面搜索引擎价格存储成本偏高(搜索引擎需要引入索引存储),而且各类聚合查询如接口响应时间统计等查询响应时间不太好保证,另一方面考虑到实时报警还需要编写 API 不停进行各类调用的错误次数的轮询,性能和成本都不太确定。

基于实时计算的架构,可以将线上所有日志通过服务,返回值错误类型,和时间等维度在内存中进行实时的聚合计算,然后再持久化到存储中。一方面实时计算效率高,聚合后的结果大小会比原始数据大大减少,因此持久化成本低,实时能保证;另一方面还可以在内存中实时校验报警策略,让报警的性能开销足够小。

综上考虑,基于实时计算的架构看来最能满足当前公司的需求。决定了以后,小明开始思考进一步架构设计。

架构设计

决定了基于实时计算的技术以后,小明开始进行架构设计。通过参考各类技术网站,他发现要架构一个靠谱的网站监控方案,需要的组件以下缺一不可。

  • 数据通道:负责将数据从 Nginx 拉取出来,传送到搜索引擎。数据通道同时肩负数据堆积和数据重算的任务。
  • 计算引擎:基于 Nginx 服务,错误码,时间的维度的聚合实时计算逻辑需要基于选定的引擎进行编写。计算引擎最好能同时负责一些报警的逻辑。
  • 存储:存放最终 Nginx 监控结果的地方。考虑到监控结果虽然表结构简单,但是各种维度查询比较多,最好是类似于 OLAP 的存储类型。
  • 展示门户:针对所有 Nginx 监控结果作各类维度的快速分析和展示。

undefined

好在针对前三个组件,阿里云提供了一些现成的产品组件,小明不需要自己手动一个个去搭建,因此入门门槛还不算高。

数据通道这块,小明在阿里云上选取了一款类似于 Kafka 的数据通道,在支持性能和消息堆积等特性的同时,在数据接入上提供了一定的简便性。

计算引擎上,小明为了简易入手,选择了一款基于 spark-stream 计算引擎组件,可以上面直接写 SQL 语句进行实时计算编排而不需要自己写流式计算程序。

存储方面,由于没有太强事物需求,而且在容量上要求较高,小明选择了一款类似 Hbase 的云上存储产品。

展示门户方面,没有直接对应产品。小明挠了挠头,决定还是只能自己突击一下前段编程技术,基于开源展示框架来编写一个简单的查询门户。

跟老板申请了预算以后,小明开始陆续开通各类产品进行开发测试。预计一个月完成任务,

漫漫开发路程

开通流程很简单。花了半天不到,kafka、storm、hbase 的租户集群到手。可惜常言道,开发项目 80% 的时间花费在最终 20% 的坑上。项目过了一个月,但是功能尚未完成 70%。小明在自己的技术博客上默默的记录下以下踩过的坑。

集成故障排查成本

由于需要集成的组件包括数据通道,实时计算层,后台存储,并在代码中集成推送数据逻辑以及报警查询逻辑。每个环节稍有出错将造成整个链路阻塞,调试成本显得非常高。

日志清洗

开发期间为了获取到相关应用为了调整对于日志的推送逻辑,需要在每台 Nginx 日志内容变更以后再在每个服务端变更 API 的推送逻辑,变更过程冗长且容易出错。

持久化表设计

除了要针对监控项做出适合的表库设计,并尽量避免索引热点以外,还需要考虑当数据结果由于实时计算层不稳定重复计算时如何保证数据库写入幂等性,这对表结构设计是一个不小的挑战。

延迟数据合并

如果由于应用原因导致 Nginx 日志数据被延迟发送,如何保证比如晚到 1 个小时的数据能被实时计算引擎准确计算并将结果合并到之前的结果。

报警

针对所有结果需要设置定时任务每分钟对数据进行遍历查询。比如针对任何返回 500 调用错误超过 5% 占比的服务,需要所有服务进行多次的调用结果进行遍历查询。如何不遗漏所有的服务错误检查的同时保证高效率查询也是个不小的挑战。

报警准确性

有的时候由于日志延迟,上一分钟部分服务器正常日志还没采集全,导致局部 500 调用错误的服务暂时超过 5%,类似错误是否需要报警?如果报警,有可能误报,不报警的话,可能漏报,怎么处理呢?

如何统计 UV、TopN

以 UV 为例。如果要跨任意时间度查询 UV,则常规手段还需要在数据库中存入每单位时间(如分钟级别)的全量 IP 访问信息。这对于存储利用率来讲显然是无法接受的。有没有更优化的方案?

针对错误场景的诊断方法

针对各类返回值 500 的调用错误,业务方提出希望出现 500 错误时能根据时间和调用服务维度查询到详细的调用入参和其他详情,其场景和日志搜索类似。对于类似新加入需求,貌似通过实时聚合计算和存储不能直接办到。需要对日志另辟蹊径另行处理。

以上问题还不包括前段展示的各类问题。

掐指一算,两个月晃眼过了。项目还没弄完一半,小明有点急了。

另外一种新的思路

小明晚上约了自己的同门师兄老丹搓串。就着小酒,小明把自己最近的烦心事从头到尾跟老丹说了一遍。

老丹听了一拍大腿:“小明,你这就奥特了。其实在阿里云上有一款云产品, 叫做业务实时监控,简称 ARMS,基本上你遇到的这些问题,在 ARMS 上已经提供了一站式的解决方案,你只需要快速接入即可。”。

“噢,是么?我们业务的监控逻辑很多都是基于 Nginx 日志定制,ARMS 具备接入 Nginx 日志的能力,并允许让我定制业务监控能力么?“小明问道。

“当然。ARMS 上不仅提供监控 Nginx 的任务模板,本身自带报警和监控报表,同时还全程开放定制能力。如果你要增加自己的业务监控逻辑,或者删除或修改自己不要的通用监控逻辑,直接在其平台上定制即可。”老丹答道。

undefined

“听起来不错。最终结果除了报表和报警外,公司的下游业务平台也能用么?”

“可以的,ARMS 提供 API, 下游系统直接对接数据 API 即可,跟你在云上直接读数据库没什么本质区别。”

“听起来不错,看来我的项目有救了,我赶紧去看看。”

实现一个基于 Nginx 的网站监控场景

1. ARMS 的 Nginx 监控方案概述和准备

目前在监控领域上比较流行的数据处理方法有很多种,例如,搜索引擎,时间序列数据库,实时计算,甚至是大数据离线计算,等。

ARMS 采用的是实时计算+列式存储。这种方案的优势是数据实时性高,而且对于固定的数据查询接口查询效率非常块。在 Nginx 的监控方案中,其架构概要如下所示, 蓝色部分为 ARMS 所集成的 Nginx 监控开箱即用的黑盒。

由于 ARMS 的分析是针对 Nginx 的 access.log 日志,因此对 Nginx 日志有一定要求,需要用户在 nginx.config 中配置出打印内容,包括:“$upstream_response_time” “$request_time” 等代表请求消耗时间的日志信息。如下例:

 
  1.  log_format   main '$remote_addr - $remote_user [$time_local]  $status ' 
  2. '"$request" $body_bytes_sent "$http_referer" ' 
  3. '"$http_user_agent" "$http_x_forwarded_for"' 
  4. '"$upstream_response_time" "$request_time" "$ user_cookie_id"' ;   

这样的话,打印出的日志,大致如下表所示。

 
  1. 58.211.119.29 144288 - [16/Mar/2017:21:47:07 +0800] "POST http://arms.console.aliyun.com/api/query.json?action=DataQueryAction&eventSubmitDoQueryData=1" 200 594 "https://arms.console.aliyun.com/" "127.0.0.1:8080" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4" "0.144" "0.144" "EX866MB1-Y70JO57WM37ST3HWDVFK3-JWPNH30J-Z" 
  2. 58.211.119.29 148219 - [16/Mar/2017:21:47:08 +0800] "POST http://arms.console.aliyun.com/api/query.json?action=DataQueryAction&eventSubmitDoQueryData=1" 200 583 "https://arms.console.aliyun.com/" "127.0.0.1:8080" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4" "0.148" "0.148" "EX866MB1-Y70JO57WM37ST3HWDVFK3-JWPNH30J-Z" 

完成上述日志配置定制以后,即可开始在 ARMS 上进行配置。以下篇幅从 ARMS 数据集,报警,和交互大盘,三个部分进行配置概要描述。关于数据源如何添加到ARMS可参见文档,在此不赘述。

2. 基于 ARMS 的 Nginx 监控 数据集实现

在 Nginx 监控模板中,用户数据分为两类,一类是指标,相当于数据仓库中的 Measure;一类是维度,相当于数据仓库中的 Dimension。

对于Nginx监控,最常见的指标为以下几类指标:

页面的 PV, UV

  • PV: 页面的 PV 通过对 access.log 中的每一条日志做 coun t来统计,
  • UV: 通过日志中代表用户 ID 的对应的 $cookie_id 来做 count distinct 来统计。对应的 cookie_id 需要开发人员进行手动统计。

页面响应时间

  • 平均页面响应时间: 在 ARMS 中通过对$request_time做sum操作来统计出total_request_time,然后在通国际 total_request_time / pv 来得到某维度下的瓶平均响应时间。
  • 最大响应时间: 则对单条日志 request_time 进行 max 统计。

页面流量

  • 平均页面流量和最大页面流量:针对 $body_bytes_sent 来进行统计。统计方式和页面响应时间类似,不赘述。

对于 Nginx 监控,最常见的维度有以下几类:

  • 页面 URL: $request。用户可以针对特定 URL 进行访问统计,甚至可以在不同 URL 之间进行访问排行。
  • 页面返回状态:$status。用户可以针对不同的返回值维度进行统计,如仅统计 200 返回值的正常页面访问情况,或是非 200 返回值的错误页面访问情况。
  • 浏览器类型:根据 $http_user_agent 统计出的用户的浏览器客户端,如 Chrome, Sofari, IE, Firefox, 甚至 Curl 命令,等。用户可以根据此类维度统计客户端的分布情况。
  • 用户 ID:根据 $cook_id 统计出的用户的使用习惯,如哪一类页面被哪一些用户经常访问,等。

对于 ARMS 的数据集设计,其实就是针对用户感兴趣的 Nginx 监控结果,进行各类维度的排列组合。

  • 例如,以页面URL维度,统计 UV, PV,页面响应时间,则可以统计出不同页面的各自的UV, PV和页面响应时间,甚至根据例如PV进行TopN排行。

下图是一个数据集配置的例子,该数据集配置出两个维度: URL 和 Status (支持由 URL 下钻到 Status 的查询方式),分别统计两个指标:PV 和 UV。这样用户可以依次下钻页面路径和返回值来查询 PV, UV 情况。

下图是另个数据集配置的例子,该数据集配置出和上例相同但是顺序相反的两个维度: Status 和 URL (支持由 Status下钻到 URL 的查询方式),分别统计两个指标:PV,平均响应时间,最高响应时间 。其中,平均调用时间是复合指标,由总体调用时间 / PV 间接得出。

3. 基于 ARMS 的 Nginx 监控报警实现

常见的 Nginx 报警有以下几种:

  • 某类页面的响应时间过长。
  • 某类页面的错误率页面过高。

使用 ARMS 的原生报警的一些特性天然支持 Nginx 监控报警的各种场景。以下举例。

  • 支持某类指标的维度下钻遍历

例如检查(遍历)所有页面维度的响应时间是否超过 100ms.

  • 支持不同指标之间的复合计算

典型如错误码为 5xx 占总调用的占比,通过不同指标复合计算而得。

  • 支持各种其他报警高级报警配置

包括最近 N 分钟同比,环比,最大,最小值比较,等。例如,最近5分钟同比PV下跌50%这种典型的场景。

以下例子结合以上三个特点,介绍了一种如何在 ARMS 定义”任意 URL 调用一分钟 500 返回占比超过 10%”的报警定义例子,如下所示。

4. 基于 ARMS 的 Nginx 监控大盘配置

监控大盘一般有以下几个用途:

  • 挂在作战室,全面掌控运行状态。
  • 用于实时查看,并下钻分析每个具体用户或网页的网站实际使用情况。

针对 Nginx 监控,ARMS 可以基于类似用户维度,页面维度,IP 维度,甚至地域维度,展示不同的数据。以展示用户总体UV, PV 为例,假设对应的数据集为”整站 UV PV”,则配置如下:

集成各类 UV, PV,响应时间等统计的最终交互式大盘效果图如下:

5. 马上快速上手

以上各类 Nginx 监控场景,目前在 ARMS 上已有成熟商业模板支持,用户只需要在 ARMS 首页点击 “新建标准模板监控”,并选择 Nginx 高级模板,即可。

想了解更多关于分布式监控方面的信息,请参加线上举办的首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS 与 TDDL 负责人等大咖出场,干货分享,不可错过!




作者:中间件小哥
来源:51CTO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_754979.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转载】如何查看自己网站的搜索引擎收录量和索引量

针对于个人站长或者企业站长而言,一般都非常关注自己网站的收录情况以及索引量信息,针对于新上线的网站,搜索引擎一般都还会给予新站保护期进行保护。其实如果要查看自己网站的收录量以及索引量等,可以注册百度站长平台、搜狗站长…

【转载】通过百度站长平台查看网站搜索流量及关键字

无论是个人站还是企业站,都希望网站内容丰富后,网上用户可以通过搜索引擎搜索到网站的内容信息,其实如果站长已经入住了百度站长平台,则我们可以通过百度站长平台的数据监控功能中的查看流量和关键词的菜单来查看具体多少用户通过…

【转载】通过搜狗站长平台查看网站的搜狗流量及搜索关键字

无论是个人站还是企业站,都希望网站内容丰富后,网上用户可以通过搜索引擎搜索到网站的内容信息,其实如果站长已经入住了搜狗站长平台,则可以通过搜狗站长平台的数据监控功能中的查看流量和关键词的菜单来查看具体多少用户通过搜狗…

【转载】通过搜狗站长平台提交网站域名变更后的文章地址

在实际的网站运维过程中,有时候可能会进行网站域名信息的变更,将一个网站的内容全部迁移到另一个域名下,之前的网站域名作废的情况,如果网站收录量不多,直接迁移即可,如果网站收录量很多,则可能…

【转载】通过百度站长平台提交网站死链

运维过网站的人员都知道,网站在运维过程中,因为各种原因如文章删除、网站改版等原因会产生一些失效的网页链接,即我们通常所说的死链,如果死链过多,可能会影响到搜索引擎对我们网站质量权重的判定以及造成不好的用户体…

Redis升级到 6.x 版本后,12306网站起飞了!

提起业务量,除了京东618,淘宝双11,当数全民抢票平台 12306最有发言权。后台有位粉丝问了个很典型的问题,同样是架设在阿里云上的服务器,为什么12306经常会宕机,而双11阿里每秒钟50多万笔订单,都…

获取了网站源码有什么用_环保做推广用什么平台_广告投放-多网站信息推广

环保做推广用什么平台_广告投放-多网站信息推广 讯呱呱(深圳)网络科技有限公司成立于2020-06-18,法定代表人为刘宪玲,注册资本为101万元,统一社会信用代码为91440300MA5G8KKX6D。企业地址位于深圳市龙华区龙华街道清华社区和平路64号中国振华…

怎样获取网站的域名_网站如何被百度收录?

百度搜索引擎对网站的收录与很多方面的因素有关,网站如果想要得到百度搜索引擎收录的话,站长需要不断对网站的整体结构进行调整和完善,从网站结构、内容、链接等细节方面着手优化,才能突破收录困境,循序渐进的提升网站…

教你用 docker 搞个网站

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天 14:00 更新文章,每天掉亿点点头发...源码精品专栏 原创 | Java 2021 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框…

web文件 群晖_群晖NAS安装wordpress博客,构建属于自己的web网站

学习网络技术的话可以关注我,每天都会有相应的教程发布的!群晖NAS主要的作用就是网络储存,你可以理解为百度云,但这个百度云的服务器放在了家里。个人而言,有了NAS以后,家里的所有设备(台式电脑&#xff0c…

# 解析bt文件_一键查看BT下载记录,用这网站一秒知道你下载过哪些资源

既然刷到了,就收藏起来吧!以备不时之需!想要知道自己过去用BT或磁力链下载过哪些电影、游戏或软件等资源吗?你可能还不知道,其实在 BT 下载时,自己的 IP 位置就已经被记录,通过「iknowwhatyoudo…

html网页主题有哪些,网站的专题页面是什么?

做SEO的时候,很多时候一个权重高的网站做久了,就会有很多的权重排名高的目标关键词和长尾关键词排获取不错的流量。但是有一些关键词热度较高,而普通的文章因为多数是采用模板输出所以页面权重较低,导致在竞争中排名不靠前。而这时…

apache配置完django后启动失败_Django建站之旅(三):Hello world

1创建blog应用上一篇我们配置完了Django的项目环境,这一篇我们就来讲讲如何创建应用。关于Django的应用,我以我的理解来简单介绍一下,在Django中我们可以创建多个应用,用来实现多个功能。比如说我们现在要做的个人博客网站&#x…

html显示蒙古语乱码,做网站用UTF-8编码还是GB2312编码?

经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符,WordPress程序是用的UTF-8,很多cms用的是GB2312。● 为什么有这么多编码?● UTF-8和GB2312有什么区别&#xf…

flask+uwsgi+nginx部署网站

2019独角兽企业重金招聘Python工程师标准>>> 1.写在前面 本文重要介绍,flask框架写的web网站如果正确部署在正常环境中。因为flask自带的web服务不足以支持实际使用情况。只是方便开发人员调试开发,并不具备可靠的性能。 以下介绍适用…

一个服务器上可以放几个网站,一个云服务器上可以放几个网站吗

一个云服务器上可以放几个网站吗 内容精选换一换内网域名解析是基于VPC网络的域名解析过程,通过华为云内网DNS把域名(如ecs.com)转换成私网IP地址(192.168.1.1)。内网域名解析实现云服务器在VPC内直接通过内网域名互相访问。同时,还支持不经公网&#xf…

关于“网上社会实践”网站的设计

前段时间,辅导员发了一封邮件,是关于学校要建设“网上社会实践”创新项目的通知。因为广外学习ASP.NET的人不多,所以不出意外地是我接了。 这个项目是用于学生网上社会实践的东西。也是一个创新项目来的。但是这些对于我们学技术的人来说&…

京东一面:如何用 Nginx 禁止国外 IP 访问网站,直接凉凉!

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天 14:00 更新文章,每天掉亿点点头发...源码精品专栏 原创 | Java 2021 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框…

Slog50_支配vue框架初阶项目之博客网站-单页-客户端(浏览器)更新头像2

ArthurSlogSLog-50Year1GuangzhouChinaAug 26th 2018GitHub掘金主页简书主页segmentfault要成就一番事业 既要靠本事上位 又得懂拉拢站队 开发环境MacOS(High Sierra 10.13.5) 需要的信息和信息源: 统一资源定位符(URL)XMLHttpRequestvue模版语法 v-bindFormDataFor…

使用Apache服务部署静态网站

使用Apache服务部署静态网站 1.网站服务程序Web网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。Apache程序是目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。Apache也是RHEL…