收集及分析经过Nginx的请求

默认情况下,我们的项目中都会对接口的请求以及响应记录日志,然后我们可以把这条日志发给消息中间件(kafka),然后去做大数据的分析与统计。

但是,有时候并发过高导致50x错误,实际上,有些请求是没有转发出去的,也就没法在项目中去做记录了,比如,想知道服务器崩掉时的实际请求并发数。于是,我们需要对nginx的access.log日志做处理。

默认配置下,日志是记录在一个文件里的,文件会很大,需要修改配置,按小时来记录日志

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
{
    set $year $1;
    set $month $2;
    set $day $3;
    set $hour $4;
    set $minutes $5;
    set $seconds $6;
}
access_log  /var/logs/xxxx/access/xxxxx_xx_access_$year-$month-$day-$hour.log  main;

其中 $time_iso8601为内嵌变量,格式如下:2018-09-21T16:01:02+02:00
此时,日志将会以小时为文件单位记录,当然还需要做一个shell脚本和定时任务定期清理的机制。

默认nginx的日志格式为

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';
# access_log  logs/access.log  main;

表现形式为

127.0.0.1 - - [03/Jul/2019:00:25:36 +0800] "GET /phpinfo.php HTTP/1.1" 200 25049 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"

修改配置,使用时间格式 $time_iso8601

 log_format  test1  '$remote_addr - $remote_user [$time_iso8601] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
  access_log  logs/access.log  test1;

表现形式为

127.0.0.1 - - [2019-07-03T00:27:05+08:00] "GET /phpinfo.php HTTP/1.1" 200 25048 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"

这样就方便通过时间来筛选日志了。
多项目的话可以将配置写入location中

修改 nginx/logs 目录的权限

此时完成了日志文件的记录工作。

于是,就可以定时做一些统计了:
参考地址:https://www.cnblogs.com/david-cloud/p/8166159.html

以上是针对流量不大的服务器,当流量大时,性能不好。

大流量场景的应对方案

日志采集
可选择的工具比较多,比如 logstash、flume 等,我推荐使用 lua-resty-kafka 模块编写Lua扩展将数据按照一定格式拼接后写入消息队列。而且也完全可以关掉 Nginx 本身的日志开关,减少磁盘消耗。

消息队列
可以选择 Redis 或者 Kafka,主要取决于你们是否需要对日志做其它的利用。Redis 轻量级一些,Kafka的优势是高吞吐量、分布式架构, 并且除了做异常监控,还可以将数据放到 Hadoop/离线数据仓库中做用户行为分析。

异常监控计算
这一步其实和最开始的简单方案的类似,需要实现指标计算、告警发送和异常数据输出保存。如果日志采集时使用了logstash,那么这一步也推荐使用logstash保持一致,具体做法我就不多说了,看官方文档吧。但如果是使用Lua扩展采集的自定义格式数据,我推荐使用Heka来做。Heka使用Go语言编写,性能不错,内置丰富的插件可以满足大部分的需求。若不满足需求,可以使用Go或者Lua自行开发扩展。在Filter阶段做指标计算,有错误时向Heka消息流中写入告警消息,SMTPOuter匹配到告警消息后通过自定义的Encoder定制好邮件内容后发送,使用ElasticSearchOutput匹配异常数据写入ES节点。

可视化
前面使用Message Matcher Syntax匹配异常数据写入到Elasticsearch后, 搭建一个Kibana。这样在收到告警邮件后,就可以进入Kibana后台查看异常的Log。还可以定制一些图表以查看系统的错误趋势情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值