全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
日志服务

分析-Nginx监控数据采集与分析

更新时间:2018-02-02 17:53:47

Nginx和php-fpm、Docker、Apache等很多软件一样内建了一个状态页,对于Nginx的状态查看以及监控提供了很大帮助。本文档主要介绍通过日志服务Logtail采集Nginx status信息,并对采集的status信息进行查询、统计、搭建仪表盘、建立自定义报警,对您的Nginx集群进行全方位的监控。

环境准备

请按照以下步骤,开启Nginx status插件。

  1. 确认Nginx是否具备status功能

    执行以下命令查看Nginx是否具备status功能:

    1. nginx -V 2>&1 | grep -o with-http_stub_status_module
    2. with-http_stub_status_module

    如果回显信息为with-http_stub_status_module,表示支持status功能。

  2. 配置Nginx status

    在Nginx的配置文件(默认为/etc/nginx/nginx.conf)中开启status功能,样例配置如下:

    1. location /private/nginx_status {
    2. stub_status on;
    3. access_log off;
    4. allow 11.132.232.238;
    5. deny all;
    6. }

    注意: 该配置只允许ip为11.132.232.238的机器访问nginx status功能。

  3. 验证Logtail安装的机器具有nginx status访问权限。

    可通过如下命令测试:

    1. $curl http://11.132.232.59/private/nginx_status
    2. Active connections: 1
    3. server accepts handled requests
    4. 2507455 2507455 2512972
    5. Reading: 0 Writing: 1 Waiting: 0

数据采集

  1. 安装Logtail

    根据文档安装logtail,确认版本号在0.16.0及以上。若低于0.16.0版本请根据文档提示升级到最新版本。

  2. 填写采集配置

    实现方式

    1. 在日志服务控制台创建一个新的Logstore,采集向导中选择自建软件中的Nginx监控。

    2. 根据提示配置Nginx监控的URL以及相关参数(基于http采集功能实现)。

      注意

      • 将样例配置中Addresses字段内容修改为您需要监控的url列表。
      • 如果您的Nginx status返回的信息和默认的不同,请修改processors用以支持http的body解析,详细信息请参考数据处理配置

      样例配置如下:

      1. {
      2. "inputs": [
      3. {
      4. "type": "metric_http",
      5. "detail": {
      6. "IntervalMs": 60000,
      7. "Addresses": [
      8. "http://11.132.232.59/private/nginx_status",
      9. "http://11.132.232.60/private/nginx_status",
      10. "http://11.132.232.62/private/nginx_status"
      11. ],
      12. "IncludeBody": true
      13. }
      14. }
      15. ],
      16. "processors": [
      17. {
      18. "type": "processor_regex",
      19. "detail": {
      20. "SourceKey": "content",
      21. "Regex": "Active connections: (\\d+)\\s+server accepts handled requests\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+Reading: (\\d+) Writing: (\\d+) Waiting: (\\d+)[\\s\\S]*",
      22. "Keys": [
      23. "connection",
      24. "accepts",
      25. "handled",
      26. "requests",
      27. "reading",
      28. "writing",
      29. "waiting"
      30. ],
      31. "FullMatch": true,
      32. "NoKeyError": true,
      33. "NoMatchError": true,
      34. "KeepSource": false
      35. }
      36. }
      37. ]
      38. }

数据预览

应用配置1分钟后,点击预览可以看到状态数据已经成功采集。Logtail的http采集除了将body解析上传,还会将url、状态码、方法名、响应时间、是否请求成功一并上传。注意: 若无数据,请先检查配置是否为合法json;若配置正常,请参考数据采集异常排查文档自助排查。

  1. _address_:http://11.132.232.59/private/nginx_status
  2. _http_response_code_:200
  3. _method_:GET
  4. _response_time_ms_:1.83716261897
  5. _result_:success
  6. accepts:33591200
  7. connection:450
  8. handled:33599550
  9. reading:626
  10. requests:39149290
  11. waiting:68
  12. writing:145

查询分析

自定义查询

查询相关帮助文档参见日志服务查询

  1. 查询某一ip的status信息: _address_ : 10.168.0.0
  2. 查询响应时间超过100ms的请求: _response_time_ms_ > 100
  3. 查看状态码非200的请求: not _http_response_code_ : 200

统计分析

统计分析语法参见日志服务统计语法

  • 每5分钟统计 waiting reading writing connectio 平均值:

    1. *| select avg(waiting) as waiting, avg(reading) as reading, avg(writing) as writing, avg(connection) as connection, from_unixtime( __time__ - __time__ % 300) as time group by __time__ - __time__ % 300 order by time limit 1440
  • 统计top 10的 waiting:

    1. *| select max(waiting) as max_waiting, address, from_unixtime(max(__time__)) as time group by address order by max_waiting desc limit 10
  • 目前Nginx总数以及invalid数量:

    1. * | select count(distinct(address)) as total
    1. not _result_ : success | select count(distinct(address))
  • 最近 top 10 失败的请求:

    1. not _result_ : success | select _address_ as address, from_unixtime(__time__) as time order by __time__ desc limit 10
  • 每5分钟统计统计请求处理总数:

    1. *| select avg(handled) * count(distinct(address)) as total_handled, avg(requests) * count(distinct(address)) as total_requests, from_unixtime( __time__ - __time__ % 300) as time group by __time__ - __time__ % 300 order by time limit 1440
  • 每5分钟统计平均请求延迟:

    1. *| select avg(_response_time_ms_) as avg_delay, from_unixtime( __time__ - __time__ % 300) as time group by __time__ - __time__ % 300 order by time limit 1440
  • 请求有效数/无效数:

    1. not _http_response_code_ : 200 | select count(1)
    1. _http_response_code_ : 200 | select count(1)

仪表盘

日志服务默认对于Nginx监控数据提供了仪表盘,您可以在Nginx status的仪表盘,仪表盘搭建参见日志服务仪表盘设置

仪表盘效果

设置报警

  1. 将以下查询另存为快速查询,名称为invalid_nginx_status : not _http_response_code_ : 200 | select count(1) as invalid_count

  2. 根据该快速查询创建报警规则,样例如下:

    选项
    报警规则名称 invalid_nginx_alarm
    快速查询名称 invalid_nginx_status
    数据查询时间(分钟) 15
    检查间隔(分钟) 5
    触发次数 1
    字段名称 invalid_count
    比较符 大于
    检查阈值 0
    通知类型 通知中心
    通知内容 nginx status 获取异常,请前往日志服务查看具体异常信息,project : xxxxxxxx, logstore : nginx_status
本文导读目录