深入剖析Nginx日志:常用分析技巧汇总

2023-11-19

前言



本来只是想写一篇Nginx日志的常用统计分析命令填充一下线上文档,虽然有点用但是觉得光写命令,文档太水了
于是就顺便总结一下,在nginx或web服务中,需要有哪些进行分析的内容以及为什么有这些需求


ps:
统计命令的原因 在于不是每个公司或web所在的服务器上都有配置elk或其他开源日志分析工具的,而且即使有工具有时也不能筛出自己想要的内容,这是个基础操作
虽然文档里直接cat access.log,但是这是个演示。如果日志很小,没什么问题。10多个G直接cat,内存和cpu资源又很小,系统会直接卡死,记得切片



日志格式



无论进行哪种日志的分析,首先要注意日志输出的格式,不要网上的拿来就直接用
以nginx来说,默认情况下没有特殊需求的,日志的配置如下:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
$remote_addr                客户端IP地址
$remote_user                客户端用户名称,一般为空
[$time_local]               访问时间
"$request"                  记录请求HTTP的方式以及URL
$status                     状态码
$body_bytes_sent            发送给客户端的文件大小
"$http_referer"             记录从哪个页面访问过来的
"$http_user_agent"          记录客户端相关信息
"http_x_forwarded_for"      客户端的ip地址
日志输出示例:
下面的IP,url仅为示例,如有雷同,纯属巧合

111.111.111.111 - - [28/Apr/2021:14:44:11 +0800] "GET /api/channel/unread.jsp?callback=jQuery17106116_1651126328463&action=bannerinfo&_=1651128251884 HTTP/1.1" 200 65 "https://www.xxxx.cn/group/" www.xxxx.cn "123.123.123.123" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" "-"
222.222.222.222 - - [28/Apr/2021:14:44:12 +0800] "GET /api/channel/message/unread.jsp?callback=jQuery1710046845505286&action=bannerinfo&_=1651 HTTP/1.1" 200 686 "https://www.xxxx.cn/group/" www.xxxx.cn "123.123.123.123" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400" "-"
110.110.110.110 - - [28/Apr/2021:14:44:12 +0800] "GET /api/channel/message/unread.jsp?callback=jQuery1710342055625248369&action=bannerinfo&_=16511289 HTTP/1.1" 200 765 "https://www.xxxx.cn/group/" www.xxxx.cn "123.123.123.123" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" "-"


PV 和 UV



通常情况下对一个网站的价值进行评估,如果要详尽的讨论,不同的行业人会给出不同的划分。但是大致的来说,主要是从 网站的内容本身和产品的价值,网站流量带来的附加值,网站的网络排名,以及访问量(PV UV)这些方便进行评估。而网络上大多数排名网站,例如Alexa对网站排名,主要是对网站的pv,uv,存续时间等多种因素等进行排名。

PV指的是访问量,即页面浏览量或点击量,用户每次刷新即被计算一次,用户对同一页面的多次访问,访问量值会累计,也就是说可以不断的请求,以作弊的方式提升网站的pv,提升Alexa排名

UV指的是独立访客数(访问网站的一台电脑客户端为一个访客;00:00-24:00内相同的客户端只被计算一次)每一个固定的访客只代表一个唯一的用户,一天内无论他访问这个网站多少次,都只记录为一次。独立访客数越多,通常越证明网站内容有价值,推广行为越有成效。

虽然独立访客很接近我们需要的数据但实际上统计出来的数据并不完全都是真实独立的人。因为
独立访客这个指标也会受浏览器设置的影响;当更换了IP,但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的;当不保存cookies访问、清除了cookies或者更换设备访问时,计数会加1;并且随着爬虫的兴起,常有人用大量的代理IP去刷uv

pv和uv虽然并不能完全的代表网站的价值,但是通常情况下仍是向客户展示网站价值的重要指标。最常见的是统计uv的一段时间内数据与用户访问频率较高网址,去展示用户的行为趋势,业务的相关人员再根据情况调整业务和推广



根据访问IP统计UV

awk '{print $1}'  access.log|sort | uniq -c |wc -l
or
cat access.log |awk '{print $1}' |sort | uniq -c |wc -l


根据访问url统计PV

awk '{print $7}' access.log | wc -l
or
cat access.log | awk '{print $7}' |wc -l


根据时间段统计查看日志
注意自己的时间的格式
为避免日志太大,注意日志切割

统计某时间段UV
cat  access.log| sed -n '/28\/Apr\/2021:14/,/28\/Apr\/2021:20/p'  |awk '{print $1}' |sort | uniq -c |wc -l
or
统计某时间段PV
cat  access.log| sed -n '/28\/Apr\/2021:14/,/28\/Apr\/2021:20/p'  | awk '{print $7}' |wc -l


IP 和 URL



这2个数据通常不会单独统计,单一的数据无法证明是否异常

常见于分析某断时间内对网站频繁访问的ip和url,判断是否受到其攻击或某些接口存在bug.被频繁的请求。通常在网站流量报警时,进行排查



查询访问最频繁的URL

awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more


查询访问最频繁的IP

awk '{print $1}' access.log |sort | uniq -c |sort -n -k 1 -r|more


查看某时间段访问频繁的IP和url

统计某时间段频繁访问的URL
cat  access.log| sed -n '/28\/Apr\/2021:14/,/28\/Apr\/2021:20/p'  | awk '{print $7}' |sort | uniq -c |sort -n -k 1 -r|more
or
统计某时间段频繁访问的IP
cat  access.log| sed -n '/28\/Apr\/2021:14/,/28\/Apr\/2021:20/p'  | awk '{print $1}'  |sort | uniq -c |sort -n -k 1 -r|more


查看指定的ip在某时间段访问了什么url

cat access.log | grep /28/Apr/2021" | grep "111.111.111.111" | awk '{print $7}' | sort | uniq -c | sort -nr 


备注:
实际上可通过计划任务或elk等方式监控日志,当5分钟或10分钟内的pv,超过平时正常的阈值,就列出该段时间内频繁访问的IP和url的top10,并展示ip所属地址

如果发现异常的访问,例如:
发现爬虫或大量IP请求不存在的网址的,要用iptables或配置nginx屏蔽IP或IP段



爬虫和每秒请求数



统计爬虫目的是确认是否是因不讲规矩的爬虫的大量访问,出现了访问的报警或功能异常

对请求数的统计,排列时间段内不同时间点的请求数(和前面的排列一段时间内的pv有些像),这个是以时间为重点,目的是查看具体从哪个时间点请求较大可能存在异常



统计蜘蛛抓取次数

grep 'spider' access.log |wc -l


统计每秒的请求数并根据请求数排列(前20)

awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 20

统计每分钟的请求数并根据请求数排列(前20)

awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 20

备注:
cut -c 指的 取第几个字节的区间



传输时间



要在nginx的日志配置中最后一个字段加入$request_time
$request_time 是nginx开始收到client 请求,到将请求发回给client 期间过去的时间

通过对不同页面或接口的响应时间的统计,来分析不同接口的性能,排查接口是否有问题,是否需要优化



列出传输时间超过 3 秒的url,显示前10条

cat access.log |awk '(substr($NF,2,5) > 3){print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' |sort -k3 -rn | head -10


列出某个接口请求时间超过3秒的时间点

/user/search/
cat access.log |awk '(substr($NF,2,5) > 3 && $7~//user/search/){print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' |sort -k3 -rn | head -10


获取前10条最耗时的请求时间、url、耗时

cat access.log |awk '{print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn 


备注:

substr($NF,20)     是从最后一个字段里的第20个字符开始,一直到设定的分隔符结束
substr($NF,2,5)    是从最后一个字段里的第2个字符开始,截取5个字符结束
substr($3,6)       是从第3个字段里的第6个字符开始,一直到设定的分隔结束


连接数和并发量



统计当前80端口的TCP连接数(并发)

netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l


查看当前TCP连接中的各个状态的数据

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入剖析Nginx日志:常用分析技巧汇总 的相关文章

  • 找不到 NGINX brew 安装命令

    I do brew install nginx and get gt Downloading http nginx org download nginx 1 2 2 tar gz Already downloaded Library Cac
  • 我应该使用哪个 Linux 发行版作为 Xen 主机? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我为家庭办公室订购了一台服务器 我想用 Xen 对其进行分区 我认为这将使事情保持干净并且更容易维护 我将运行 MySQL PostgreSQL
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • 如何从linux命令行运行.exe可执行文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 Windows 中有一个 abc exe 可执行文件 我可以使用 DOS 命令提示来执行此应用程序 并为其提供一些运行时变量 我想从
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • Docker 中的 NGINX 缓存 IP 地址并提供错误的 Content-Type

    Summary 我想让NGINX 不是NGINX Plus 通过使用变量从DNS名称重新解析IP地址proxy pass 如建议的这篇 Nginx 官方文章 在变量中设置域名 部分 https www nginx com blog dns
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • Openresty 中的并发模型是什么?

    我很难理解 openresty 或 nginx 的并发模型 我读了Lua变量作用域 http wiki nginx org HttpLuaModule Lua Variable Scope 它解释了变量的生命周期 但它没有说明对它们的并发访
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗

随机推荐

  • react-dnd 拖拽能力教程

    前言 近几年来 低代码 零代码的热度在国内逐年递增 复杂度同力一样不会消失 也不会凭空产生 它总是从一个物体转移到另一个物体或一种形式转为另一种形式 用户在使用低零代码构建应用程序时 这些能力只是被平台研发人员提前编写完了 作为低零代码的基
  • Spark 任务调度机制

    1 Spark任务提交流程 Spark YARN Cluster模式下的任务提交流程 如下图所示 图YARN Cluster任务提交流程 下面的时序图清晰地说明了一个Spark应用程序从提交到运行的完整流程 图Spark任务提交时序图 提交
  • 不要一上来就学框架

    问 有两年多前端经验 但感觉自己对后端知之甚少 没有安全感 但是后端语言又多 不知道学哪一门性价比好一些 求教 语言不是重点 尤其是你已经会一门语言的情况下 后端编程最最基本的技术是这些 1 浏览器和服务器是怎么打交道的 重点就是HTTP协
  • Faster RCNN代码详解(四):关于anchor的前世今生

    在上一篇博客中介绍了数据处理的整体结构 Faster RCNN代码详解 三 数据处理的整体结构 这一篇博客介绍数据处理的细节 关于anchor的前世今生 代码在脚本的 mx rcnn rcnn io rpn py的assign anchor
  • React路由懒加载的实现

    React lazy 通过引入lazy Suspense两个方法实现路由懒加载 首先 我们需要在组件中引入lazy Suspense这两个方法 然后我们需要通过Suspense组件 包裹着注册路由 import React Componen
  • 有码变无码:Google Brain 把模糊人脸变成清晰画面

    转自 新浪科技 tech sina com cn it 2017 02 08 doc ifyaexzn9228446 shtml 谷歌旗下人工智能部门 谷歌大脑 设计了一款全新软件 可以把马赛克一样的源图片还原成清晰图片 简而言之 原本 打
  • mapper中resultMap生成器

    public class MybatisUtil 获取bean的属性 根据属性评价 resultMap 并将驼峰修改为 public static String getResultMap Class
  • Vue框架--Ruoyi解析(前端)

    路由router注册 router目录下的 index js 配合 permission js 是整套vue前端项目的权限判断核心 index js 里面的path 配置都是一些不会与权限挂钩的路由 例如 404 登录页面路径等 permi
  • JDK1.8 新特性之常用函数式接口

    目录 常用4种函数式接口 Supplier接口 Consumer接口 Function接口 Predicate 接口 常用的函数式接口主要在java util function包下 函数式接口是Lambda表达式使用的前提 而Lambda表
  • 2023年最详细零基础Python爬虫教程,入门学习分三个阶段

    爬虫Python入门好学吗 学爬虫需要具备一定的基础 有编程基础学Python爬虫更容易学 但要多看多练 有自己的逻辑想法 用Python达到自己的学习目的才算有价值 如果是入门学习了解 开始学习不难 但深入学习有难度 特别大项目 大部分爬
  • 基于Matlab的门控循环单元GRU数据预测

    基于Matlab的门控循环单元GRU数据预测 随着人工智能技术的迅猛发展 数据预测成为重要的挑战之一 门控循环单元GRU是一种新兴的神经网络结构 其在处理序列数据方面具有优异的性能 本文将介绍如何使用Matlab实现门控循环单元GRU进行数
  • Office2016简体中文专业版32/64

    仅供参考 链接 https pan baidu com s 1QklpJzxzWDuFnsXX 6z9SA 提取码 4kd0
  • 黑盒测试与白盒测试的定义与区别

    白盒测试 是指实际运行被测程序 通过程序的源代码进行测试而不使用用户界面 这种类型的测试需要从代码句法发现内部代码在算法 溢出 路径和条件等方面的缺点或者错误 进而加以修正 黑盒测试 又称功能测试 数据驱动测试或基于规格说明的测试 是通过使
  • reactnative环境搭建-windows

    一 安装依赖 1 Node 以下为两种安装方式 1为基本安装 2为通过管理工具安装 1 按照教程步骤安装指定版本的node Node js 安装配置 注意 Node 的版本应大于等于 14 默认安装在C盘 如果自定义安装了其他盘需要配置环境
  • OpenCV入门【C++版】

    OpenCV基础入门 C 语言 Chapter1 读取图片 视频 摄像头 从文件读取图片 从文件读取视频 读摄像头 Chapter2 基础函数 Chapter3 调整和剪裁 Chapter4 绘制形状和文字 Chapter5 透视变换 Ch
  • Logback 自定义Appender发送预警

    1 自定义Appender 目的 接收日志消息 现将日志通过http接口发送到预警服务 package com test service appender import ch qos logback classic spi LoggingE
  • Unity -Input

    Unity Input详解 Unity中的InputManager输入控制器 Input属性方法详解 属性 方法 Unity中的InputManager输入控制器 Name 按键名 该键的名称 可以在脚本编程中直接引用他 比如 Input
  • 硬件基础之集成运放

    一 技术理论 1 集成电路 集成电路是采用专门的制造工艺 在半导体单晶硅上 把晶体管 场效应管 二极管 电阻和电容等元器件以及它们之间的连线所组成的电路制作在一起 使其具有特定功能的芯片 2 集成运放 集成运放 全称集成运算放大器 是具有超
  • 部署多台服务器,动态配置前端请求的ip地址

    需求 前后端分离的项目 需要部署多台服务器 但是不想频繁修改前端配置的ip地址 故需要需要动态配置 解决 发送请求时的url默认获取服务器的ip function getBaseUrl const url location href toS
  • 深入剖析Nginx日志:常用分析技巧汇总

    前言 本来只是想写一篇Nginx日志的常用统计分析命令填充一下线上文档 虽然有点用但是觉得光写命令 文档太水了 于是就顺便总结一下 在nginx或web服务中 需要有哪些进行分析的内容以及为什么有这些需求 ps 统计命令的原因 在于不是每个