文章目录

  • 一、简介
  • 二、监控的主要指标
    • 1、基本活跃指标
    • 2、每秒请求数–QPS
    • 3、服务器错误率
  • 三、指标收集
    • 1、Nginx stub 模块监控
      • (1)模块安装
      • (2)Nginx 状态查看
      • (3)Stub Status 参数说明
    • 2、Nginx Reqstat 模块监控
      • (1)模块安装
      • (1)Reqstat监控配置
      • (2)Nginx 状态查看
  • 四、补充(扩展):
    • 1、日志分析
    • 2、常用分析命令
      • (1)相关概念
      • (2)具体命令
    • 3、公司监控nginx需要的指标
      • (1)请求时长
      • (2)nginx是否存活
      • (3)请求返回错误
      • (4)流量
      • (5)服务损耗

一、简介

web 服务器 nginx 以其高性能与抗并发能力越来越多的被用户使用。Nginx 提供了 ngx_http_stub_status_modulengx_http_reqstat_module模块,这两个模块提供了基本的监控功能。

  • 进程监控
  • 端口监控

注意: 这两个是必须要加在zabbix监控,加触发器有问题及时告警。

二、监控的主要指标

即主要监控对象:

1、基本活跃指标

名称 描述 指标类型
Accepts (接受) NGINX 所接受的客户端连接数 资源: 功能
Handled (已处理) 成功的客户端连接数 资源: 功能
Dropped (已丢弃,计算得出) 丢弃的连接数(接受 - 已处理) 工作:错误*
Requests (请求数) 客户端请求数 工作:吞吐量

2、每秒请求数–QPS

通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了。

3、服务器错误率

通过监控固定时间间隔内的错误代码(4XX代码表示客户端错误,5XX代码表示服务器端错误),可以了解到客户端收到的结果是否是正确的错误率突然的飙升很可能是你的网站漏洞发出的信号。
如果你希望通过 access log 分析错误率,那么你需要配置 nginx 的日志模块,让 nginx 将响应码写入访问日志。

三、指标收集

1、Nginx stub 模块监控

(1)模块安装

确保Linux上已安装配置好Nginx,一定要有--with-http_stub_status_module这个模块,可以在Nginx的sbin目录下输入./nginx -V 进行查看,如果没有可以在编译时加上此模块。

./configure –with-http_stub_status_module

默认情况下,status是关闭的,我们需要开启,并指定uri来访问数据。通过配置,在nginx配置文件中的server块中增加

server {listen 80;server_name localhost;location /nginx-status {stub_status     on;access_log      on;}
}

(2)Nginx 状态查看

配置完成后在浏览器中输入http://10.0.105.207/nginx-status 查看

(或者用 curl localhost/nginx-status),显示信息如下:

Active connections: 2
server accepts handled requests26 26 48
Reading: 0 Writing: 1 Waiting: 1
  • Active connections:与后端建立的服务连接数
  • server accepts handled requests:Nginx总共处理了26个连接,成功创建了26次握手,总共处理了48个请求
  • Reading:nginx读取到客户端的Header信息数
  • Writing:nginx返回到客户端的Header信息数
  • Waiting:开启Keep-alive的情况下,这个值等于 Active -(Reading + Writing)。表示nginx已经处理完成,正在等候下次一次请求的连接数。

(3)Stub Status 参数说明

正常情况下waiting数量是比较多的,并不能说明性能差。如果reading+writing数量比较多说明服务并发有问题。

2、Nginx Reqstat 模块监控

可以监控Nginx的性能、主要监控、连接数、请求数、各种响应码范围的请求数、输入输出流量、rt、upstream访问等。现在通过ngx_req_status_module能够统计Nginx中请求的状态信息。需要安装第三方模块。

./configure  --add-module=/usr/local/ngx_req_status-master

(1)模块安装

1.下载ngx_req_status_module 模块, 这是第三方模块需要添加
[root@nginx-server ~]# wget https://github.com/zls0424/ngx_req_status/archive/master.zip -O ngx_req_status.zip
[root@nginx-server ~]# unzip ngx_req_status.zip
[root@nginx-server ~]# cp -r ngx_req_status-master/ /usr/local/ #与解压的nginx在同一级目录下
[root@nginx-server ~]# cd /usr/local/nginx-1.16.0/
[root@nginx-server nginx-1.16.0]# yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++   zlib zlib-devel
[root@nginx-server nginx-1.16.0]# yum -y install patch.x86_64
[root@nginx-server nginx-1.16.0]# patch -p1 < ../ngx_req_status-master/write_filter-1.7.11.patch
[root@localhost nginx-1.16.0]# ./configure 添加上原来的参数 --add-module=/usr/local/ngx_req_status-master2.由于原先已有nginx,所以不能执行make install
否则会覆盖掉以前的配置文件及内容
[root@localhost nginx-1.16.0]# make 3.更换二进制文件
[root@localhost nginx-1.16.0]# mv /usr/sbin/nginx /usr/sbin/nginx_bak
[root@localhost nginx-1.16.0]# cp objs/nginx /usr/sbin/
[root@localhost nginx-1.16.0]# systemctl restart nginx
[root@localhost nginx-1.16.0]# nginx -V
如果发现编译的配置文件有变化就成功了!

(1)Reqstat监控配置

[root@localhost ~]# vim /etc/nginx/nginx.conf
req_status_zone server_name $server_name 256k;(开启的req监控)
req_status_zone server_addr $server_addr 256k;
req_status_zone server_url  $server_name$uri 256k;
req_status server_name server_addr server_url;
server {server_name localhost;location /req-status {req_status_show on;}
}

指令介绍

 req_status_zone
语法: req_status_zone name string size
默认值: None
配置块: http
定义请求状态ZONE,请求按照string分组来排列,例如:
req_status_zone server_url  $server_name$uri 256k;
域名+uri将会形成一条数据,可以看到所有url的带宽,流量,访问数req_status
语法: req_status zone1[ zone2]
默认值: None
配置块: http, server, location
在location中启用请求状态,你可以指定更多zones。req_status_show
语法: req_status_show on
默认值: None
配置块: location
在当前位置启用请求状态处理程序

(2)Nginx 状态查看

192.168.187.164/req-statuszone_name  key max_active  max_bw  traffic requests    active  bandwidth
server_addr 192.168.187.164 2    432    17K 18  1    0
server_name 192.168.187.164 2    432    17K 18  1    0
server_url  192.168.187.164/    1    0   0  8   0    0

请求状态信息包括以下字段:

  • zone_name - 利用req_status_zone定义的分组标准。例如,按照服务器名称对请求进行分组后;
  • key - 请求按分组标准分组后的分组标识(即组名)。例如按服务器名称分组时,组名可能是localhost;
  • max_active - 该组的最大并发连接数;
  • max_bw - 该组的最大带宽;
  • traffic - 该组的总流量;
  • requests - 该组的总请求数;
  • active - 该组当前的并发连接数;
  • bandwidth - 该组当前带宽。

四、补充(扩展):

1、日志分析

nginx 的 access log 中可以记录很多有价值的信息,通过分析 access log,可以收集到很多指标。制作nginx的日志切割,每天凌晨切割并压缩。

log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';

打印的日志实例

39.105.66.117 - mp [11/Sep/2019:19:03:01 +0800] "POST /salesplatform-gateway/users HTTP/1.1" 200 575 "-" "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" "-" 0.040 0.040
39.105.66.117 - mp [11/Sep/2019:19:03:08 +0800] "POST /salesplatform-gateway/users HTTP/1.1" 200 575 "-" "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" "-" 0.008 0.008

参数详情

  • $remote_addr: 客户端的ip地址
  • $remote_user: 用于记录远程客户端的用户名称
  • $time_local: 用于记录访问时间和时区
  • $request: 用于记录请求的url以及请求方法
  • $status: 响应状态码
  • $body_bytes_sent: 给客户端发送的文件主体内容字节数
  • $http_referer: 可以记录用户是从哪个链接访问过来的
  • $http_user_agent: 用户所使用的浏览器信息
  • $http_x_forwarded_for: 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
  • $ request_time: 指的是从接受用户请求的第一个字节到发送完响应数据的时间,即$request_time包括接收客户端请求数据的时间、后端程序响应的时间、发送响应数据给客户端的时间
  • $upstream_response_time: 用于接收来自上游服务器的响应的时间

2、常用分析命令

(1)相关概念

  • PV:PV(访问量): 即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。

  • UV:UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。

(2)具体命令

1、根据访问IP统计UV

awk '{print $1}' paycenteraccess.log | sort -n | uniq | wc -l

2、查询访问最频繁的IP(前10)

awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c | sort -rn | head -n 10

3、查看某一时间段的IP访问量(1-8点)

awk '$4 >="[25/Mar/2020:01:00:00" && $4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c| sort -nr |wc -l

4、查看访问100次以上的IP

awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

5、查看指定ip访问过的url和访问次数

grep "39.105.67.140" /var/log/nginx/access.log|awk '{print $7}' |sort |uniq -c |sort -n -k 1 -r

6、根据访问URL统计PV

cat /var/log/nginx/access.log |awk '{print $7}' |wc -l

7、查询访问最频繁的URL(前10)

awk '{print $7}' /var/log/nginx/access.log | sort |uniq -c | sort -rn | head -n 10

8、查看访问最频的URL([排除/api/appid])(前10)

grep -v '/api/appid' /var/log/nginx/access.log|awk '{print $7}' | sort |uniq -c | sort -rn | head -n 10

9、查看页面访问次数超过100次的页面

cat /var/log/nginx/access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

10、查看最近1000条记录,访问量最高的页面

tail -1000 /var/log/nginx/access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

11、统计每小时的请求数,top10的时间点(精确到小时)

awk '{print $4}' /var/log/nginx/access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 10

12、统计每分钟的请求数,top10的时间点(精确到分钟)

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

13、统计每秒的请求数,top10的时间点(精确到秒)

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

14、查找指定时间段的日志

awk '$4 >="[25/Mar/2020:01:00:00" && $4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log

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

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

16、列出/api/appid请求时间超过0.6秒的时间点

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

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

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

3、公司监控nginx需要的指标

Nginx 处理请求的过程被详细地记录在 access.log 以及 error.log 文件中

监控项目 所属性质 指标
请求时长 服务性质 从发出请求到结束需要的时间$request_time 和 $upstream_response_time
服务存活性 服务性质 nginx是否存活
请求返回错误 服务性质 服务器日志方式错误码4xx和5xx
流量 服务性质 pv 和 流量
服务损耗 服务性质 连接数 打开文件数 cpu使用率和绑定cpu核心的使用率

(1)请求时长

自定义日志中添加上"$request_time" 和"$upstream_response_time"
这样在后面显示请求体和时间,根据自己请求的时长容忍度来实现程序层面的请求接口优化或者缓存

(2)nginx是否存活

检查nginx访问 是否返回值和自己的理想的数据返回是否一致 或者状态码是否一致

(3)请求返回错误

必须添加对诸如 500/502/504 等 5xx 服务类错误状态码的监控,它们告诉我们服务本身出现了问题。

  • 5xx 类错误每分钟出现的频率应该在个位数,太多的 5xx 应及时排查问题并解决;
  • 4xx 类错误,在协助解决一些非预期的权限错误、资源丢失或性能等问题上可以给予帮助。

例如:
| connection refused 用户请求超时 | 用户请求超时 |
| -------- | -------- | -------- |
| connection timed out | nginx与后端服务器连接超时 |
| while connection upstream | nginx与后端服务器连接出现问题 |

(4)流量

可以适当的监控网络接口的流量

(5)服务损耗

location /nginx-status {stub_status on;access_log  off;allow      10.1.1.1/24;deny        all;}
  • 文件打开数:lsof |grep nginx|wc -l
  • cpu损耗: 监控cpu的使用率即可

| active connection | 当前正在处理的活跃连接数 |
| -------- | -------- | -------- |
| reading | 正在读取的客户连接数 |
|writing | 处理响应数据到客户端的数量 |
| waiting | Nginx等待下次请求的驻留的客户连接数 |

如何监控Nginx(看完这篇就会了)相关推荐

  1. 第六十二期:看完这篇还不了解Nginx,那我就哭了!

    看完这篇还不了解Nginx,那我就哭了! Nginx 同 Apache 一样都是一种 Web 服务器.基于 REST 架构风格,以统一资源描述符(Uniform Resources Identifie ...

  2. 看完这篇文章,还不懂nginx,算我输

    看完这篇文章,还不懂nginx,算我输 参考:https://mp.weixin.qq.com/s/PeNWaCDf_6gp2fCQa0Gvng 1. Nginx产生~ Nginx 同 Apache ...

  3. 学习Nginx,看完这篇超详细的文章就够了

    目录 本文简介 一.Nginx的基本概念 1.1.Nginx是什么? 1.2.Nginx能帮助我们做些什么? 1.3.Nginx的特性 二.Nginx的安装 2.1.环境介绍 2.2.安装Nginx ...

  4. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  5. [转帖]看完这篇文章你还敢说你懂JVM吗?

    看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...

  6. JVM难学?那是因为你没认真看完这篇文章

    JVM难学?那是因为你没认真看完这篇文章 一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理 ...

  7. redis hashmap过期_看完这篇再也不怕 Redis 面试了

    0.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版和集群版,不过现在 大一些的 公司都完全是运 ...

  8. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  9. 互联网黑话最全收录|还在说大白话?看完这篇包你成为职场“社牛”

    文章目录 互联网黑话是怎么产生的? 互联网黑话是好是坏? 互联网黑话入门级教学指南 写在最后 刚刚加入字节时,比起高强度.快节奏的工作,最先迎面而来的不适应居然是--沟通障碍! "你说这话的 ...

  10. 看完这篇再也不怕 Redis 面试了

    看完这篇再也不怕 Redis 面试了 0x00.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版 ...

最新文章

  1. Java怎么配置环境变量?
  2. android自动化持续集成,Android系统的持续集成自动化测试框架的研究与实践
  3. MindSpore小笔记
  4. 深入探讨JavaScript函数
  5. 各层作用_OSI模型中各层在通信中的作用
  6. python列表快速排序_python 实现快速排序
  7. EasyUI remote ajax方式提交验证
  8. [linux] redhat 7配置路由的方法
  9. 变量声明提升和函数声明提升
  10. java 字符串限制长度吗_[Java教程]限制字符串长度
  11. 电感耦合等离子体发射光谱法测定水样中的金属含量
  12. phpstudy安装配置教程
  13. 【Linux kernel/cpufreq】framework ----cpufreq governor
  14. 数学笔记13——定积分
  15. 中外消防传感器差距浅析
  16. HTML5 案例学习笔记
  17. 【STM32】HAL库 STM32CubeMX教程九---ADC
  18. 江苏中理网络科技有限公司介绍
  19. [实用电脑技术]Google Chrome谷歌浏览器下载完整离线安装版本
  20. udf,udaf,udtf区别与联系

热门文章

  1. AttributeError: ‘Embeddings‘ object has no attribute ‘d_model‘
  2. 西门子主程序调用子程序_西门子PLC如何在主程序,写入调用子程序的命令?
  3. flash+AS3制作的倒计时效果
  4. 《软件功能测试自动化实战教程》—第6章6.7节文件数据源的数据驱测试
  5. 五个小众好用的搜索引擎
  6. java中实现方法重试机制
  7. 2021年茶艺师(中级)复审考试及茶艺师(中级)复审模拟考试
  8. 搭建spring config的坑 记录一下
  9. 009地球系到地理系
  10. 计算机运算和控制核心的简称,计算机的核心是什么