news 2026/10/5 10:38:25

Nginx应用与运维——Nginx监控配置及管理(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx应用与运维——Nginx监控配置及管理(一)

Nginx监控配置及管理

    • 1、Nginx连接状态监控
      • 1.1、Nginx连接状态
      • 1.2、Nginx连接状态模块指令
      • 1.3、基于Zabbix的连接状态监控
    • 2、HTTP主机状态监控
      • 2.1、模块编译
      • 2.2、模块配置指令
      • 2.3、主机状态监控配置
    • 3、TCP/UDP主机状态监控
      • 3.1、模块编译
      • 3.2、模块配置指令
      • 3.3、TCP/UDP主机状态监控配置

在Nginx的日常运维管理工作中,Nginx的监控管理是一项重要工作。Nginx监控的内容主要包括Nginx的进程数、创建的TCP连接数、等待的连接数等。通过监控软件的实时数据采集功能,工作人员可以及时发现及排查Nginx服务器在运行时发生的问题,同时也能通过连接状态中各环节的监控数据了解客户端请求响应的性能情况。

1、Nginx连接状态监控

1.1、Nginx连接状态

当客户端发送请求给Nginx服务器时,每个连接会被Nginx按照执行情况标记为接受、处理和活跃3个状态。通过对这3个状态数据的监控,可以清晰地了解当前Nginx服务器请求连接的处理状态。Nginx连接状态如图所示。

  • 接受(Accepts)状态,建立并接受客户端的HTTP连接状态。
  • 处理(Handled)状态,开始处理客户端的HTTP连接状态。
  • 活跃(Active)状态,对客户端HTTP请求读取请求数据、处理请求数据,以及当启用保持连接(keep-alive)机制时,使当前HTTP连接处于保持连接机制的连接状态。
  • 请求(Requests),客户端发送的数据请求,当启用保持连接(keep-alive)机制时,客户端请求会在同一HTTP连接内多次使用。
  • 等待中(Waiting)状态,当启用保持连接机制时,等待下一次客户端请求的状态。
  • 读取中(Reading)状态,正在被读取请求头的客户端连接状态。
  • 回写中(Writing)状态,正在向客户端返回响应数据的连接状态。

当有客户端与Nginx新建立连接时,接受状态计数器会加1,处理状态计数器通常与接受状态的计数器统计数值是相等的,在HTTP并发连接数超过worker_connection的限制时,处理状态计数器数值将因受worker_connection指令值的限制而小于接受状态计数器的数值。

客户端连接被处理后将进入活跃状态,Nginx会读取数据请求的请求头数据,当前活动连接标记为读取中状态,请求计数器会加1。当请求处理完毕向客户端返回响应数据时,当前活动连接标记为回写中状态,对启用保持连接的活动连接将标记为等待中状态,直到超过Nginx保持连接相关指令限定值时,关闭连接。

1.2、Nginx连接状态模块指令

Nginx提供了ngx_http_stub_status_module模块,可用于获取Nginx运行时客户端连接各种状态的计数器数据。该模块需要在编译时添加–with-http_stub_status_module来启用。模块配置指令如表所示。

  • 连接状态信息指令
  • 连接状态数据

1.3、基于Zabbix的连接状态监控

Nginx连接状态模块仅提供了各种连接状态的数据统计和输出,各状态数据可以通过Zabbix Agent脚本采集,并通过Zabbix服务端配置为监控项实现Nginx连接状态的监控。首先在Nginx服务器上启用连接状态统计并配置统计数据输出接口。Nginx配置如下:

server{listen8080;access_log off;error_log off;location /status{stub_status;# 启用连接状态数据输出功能allow127.0.0.0/8;allow10.0.0.0/8;allow192.168.0.0/16;deny all;}}

Zabbix Agent脚本可以通过Nginx本机8080端口的status路径获取Nginx连接状态的数据。因连接状态在不同状态下的数据都在一个页面中展示,所以采集脚本需要通过不同的外部参数获取对应的数据。Zabbix Agent数据采集脚本如下:

mkdir-p/etc/zabbix/scriptscat>/etc/zabbix/scripts/nginx_status.sh<<EOF #!/bin/bash HOST=127.0.0.1:8080/status function accepts { result='/usr/bin/curl "http://$HOST" 2>/dev/null| awk NR==3 | awk '{print int($1)}'' echo$result} function handled { result='/usr/bin/curl "http://$HOST" 2>/dev/null| awk NR==3 | awk '{print int($2)}'' echo$result} function drops { server='/usr/bin/curl "http://$HOST" 2>/dev/null| awk NR==3 | awk '{print$1" "$2}'' accepts='echo$server|awk '{print int($1)}'' handled='echo$server|awk '{print int($2)}'' echo $[$accepts-$handled] } function requests { result='/usr/bin/curl "http://$HOST" 2>/dev/null| awk NR==3 | awk '{print int($3)}'' echo$result} function active { result='/usr/bin/curl "http://$HOST" 2>/dev/null| grep 'Active' | awk '{print$NF}'' echo$result} function reading { result='/usr/bin/curl "http://$HOST" 2>/dev/null| grep 'Reading' | awk '{print int($2)}'' echo$result} function writing { result='/usr/bin/curl "http://$HOST" 2>/dev/null| grep 'Writing' | awk '{print int($4)}'' echo$result} function waiting { result='/usr/bin/curl "http://$HOST" 2>/dev/null| grep 'Waiting' | awk '{print int($6)}'' echo$result}$1EOF

在Zabbix Agent端添加监控项的脚本如下:

cat>/etc/zabbix/zabbix_agentd.d/nginx_status.conf<<EOF UserParameter=nginx.accepts,/etc/zabbix/scripts/nginx_status.sh accepts UserParameter=nginx.handled,/etc/zabbix/scripts/nginx_status.sh handled UserParameter=nginx.drops,/etc/zabbix/scripts/nginx_status.sh drops UserParameter=nginx.requests,/etc/zabbix/scripts/nginx_status.sh requests UserParameter=nginx.connections.active,/etc/zabbix/scripts/nginx_status.sh active UserParameter=nginx.connections.reading,/etc/zabbix/scripts/nginx_status.sh reading UserParameter=nginx.connections.writing,/etc/zabbix/scripts/nginx_status.sh writing UserParameter=nginx.connections.waiting,/etc/zabbix/scripts/nginx_status.sh waiting EOF

2、HTTP主机状态监控

Nginx连接状态是Nginx服务器整体连接数据的统计,在实际使用中,Nginx会配置很多虚拟主机,每个虚拟主机的客户端连接的处理状况也各不相同。当Nginx作为缓存服务或代理服务时,所需的统计项也有不同的需求,在Nginx的商业版本中由ngx_http_status_module提供基于主机状态的细粒度监控。对于Nginx开源版本,推荐用第三方开源模块nginx-module-vts来实现Nginx HTTP主机状态监控。该模块覆盖了对主机连接数、HTTP请求、缓存及upstream等状态数据的监控。

2.1、模块编译

nginx-module-vts模块可以通过GitHub获取并在Nginx编译时添加。

gitclone https://github.com/vozlt/nginx-module-vts.git

在Nginx代码目录中使用–add-module参数添加nginx-module-vts模块即可。

./configure --add-module=../nginx-module-vts

2.2、模块配置指令

nginx-module-vts模块为主机监控提供了多个配置指令,可实现监控数据html、json等格式的输出,并可以自定义关键字的方式进行连接数据统计,甚至通过统计数据进行限制请求连接数或流量的配置。模块配置指令如表所示。

  • 指令vhost_traffic_status_zone、vhost_traffic_status_dump、vhost_traffic_status_filter_max_node仅可在http指令域中编写。其他指令均可在http及其所包含的server、location指令域中编写。
  • vhost_traffic_status_display指令启用时,将提供主机状态监控数据输出功能,监控数据包括Nginx服务器连接状态(Server Main)、Nginx主机连接状态(ServerZones)、过滤关键字连接状态(Filters)和上游服务器组连接状态(Upstreams)4个部分的内容。
  • Nginx服务器连接状态包括了Nginx连接状态模块自带的连接状态统计数据。
  • Nginx主机连接状态由配置指令vhost_traffic_status_filter_by_host设置是否启用。启用该功能后,会对当前Nginx服务器配置的每个主机名的请求数(Requests Total)、请求时间(Requests Time)、请求频率(Requests Req/s)、响应(Responses)状态码、响应总数(Responses Total)、流量(Traffic)进行统计。如果所在主机配置了缓存(Cache),还会对缓存的各种状态进行数据统计。
  • 过滤关键字连接状态模块会按照配置指令vhost_traffic_status_filter_by_set_key设置的关键字进行状态统计,通常会把$uri配置为关键字,这样就会将每条URL的请求数(Requests Total)、请求时间(RequestsTime)、请求频率(Requests Req/s)、响应(Responses)状态码、响应总数(Responses Total)、流量(Traffic)的数据统计出来。如果被配置了缓存,则该URL在缓存中的当前状态也会被输出。
  • 当Nginx服务器是代理服务器时,会按照每个上游服务器组的名称对上游服务器组连接状态包含的每个被代理服务器的IP、端口、状态(State)、响应时间(ResponseTime,仅被代理服务器返回响应的时间)​、权重(Weight)、最大失败次数(Max Fails)、失败超过的时间(Fail Timeout)、请求数(Requests Total)、请求时间(Requests Time)、请求频率(Requests Req/s)、响应(Responses)状态码、响应总数(Responses Total)、流量(Traffic)进行统计。
  • vhost_traffic_status_limit_traffic指令的member参数如表所示。
  • vhost_traffic_status_limit_traffic_by_set_key的指令参数limitkey的语法格式如下:
    group@[subgroup@]name
  • limitkey的group特定关键字分别为主机(NO)、独立上游服务器(UA)、上游服务器组(UG)、缓存(CC)、过滤器(FG),配置样例如下:
    # 设置按照关键字$geoip_country_code进行访问统计vhost_traffic_status_filter_by_set_key$geoip_country_codecountry::$server_name;# 将过滤器(FG)中标识名称为US的访问请求的最大下载量设置为1024GBvhost_traffic_status_limit_traffic_by_set_key FG@country::$server_name@US out:1024G;# 将上游服务器组(UG)中上游服务器组(upstream)名称为backend的被代理服务器10.10.10.17:80最大请求数设置为1000 vhost_traffic_status_limit_traffic_by_set_key UG@backend@10.10.10.17:80 request:1000;
  • vhost_traffic_status_set_by_filter指令可以获取当前Nginx服务器在共享内存中的统计数据并赋值给指定的变量,配置样例如下:
    # 将主机名为example.org的请求统计数据赋值给变量$requestCountervhost_traffic_status_set_by_filter$requestCounterserver/example.org/requestCounter# 将过滤区域country中,访问主机example.org且被标识为KR的请求统计数据赋值给变量$requestCountervhost_traffic_status_set_by_filter$requestCounterfilter/country::example.org@KR/requestCounter# 将上游服务器组名为backend的被代理服务器10.10.10.11:80的请求统计数据赋值给变量$requestCountervhost_traffic_status_set_by_filter$requestCounterupstream@group/backend @10.10.10.11:80/requestCounter# 将独立上游服务器10.10.10.11:80的请求统计数据赋值给变量$requestCountervhost_traffic_status_set_by_filter$requestCounterupstream@alone/10.10.10.11:80/requestCounter# 将缓存名称为my_cache_name的命中统计数据赋值给变量$cacheHitvhost_traffic_status_set_by_filter$cacheHitcache/my_cache_name/cacheHit

2.3、主机状态监控配置

模块nginx-module-vts为Nginx提供了很多监控统计功能。根据nginx-module-vts模块的配置指令,可以设计一个全局的配置。对于不同的主机站点可以按照具体的功能设置不同的状态统计配置。全局vts配置如下:

vhost_traffic_status_zone;# 主机状态监控共享内存vhost_traffic_status_filter_by_host on;# 启用以server_name的主机名为关键字# 进行过滤统计vhost_traffic_status_display_sum_key all_zone;# 将serverZones显示区域下总计条目的# 显示名称设置为all_zonevhost_traffic_status_dump /tmp/vts.db;# 主机状态监控数据存储在/tmp/vts.db中server{listen8080;# 用于查看监控页的监听端口access_log off;vhost_traffic_status off;# 关闭当前站点的监控统计location /vts{vhost_traffic_status_display;# 启用主机状态监控数据输出功能vhost_traffic_status_display_format html;# 主机状态监控数据输出格式为htmlallow127.0.0.0/8;allow10.0.0.0/8;allow192.168.0.0/16;deny all;}}
  • 按照uri关键字进行过滤统计,可以显示对应主机每条URL的请求统计数据。
    server{listen8002;server_name locahost www.nginxbar.org;root /opt/nginx-web;default_type text/xml;# 按照URI进行过滤统计vhost_traffic_status_filter_by_set_key$uriuri;}

3、TCP/UDP主机状态监控

Nginx服务器支持TCP/UDP的代理,但Nginx只在商业版中提供了TCP/UDP服务的状态监控功能,对于开源版本,可以使用第三方模块nginx-module-stream-sts实现TCP/UDP服务的状态监控。由于Nginx stream模块的特性,TCP/UDP服务的状态数据仅在日志处理阶段才会被统计计算。

3.1、模块编译

模块nginx-module-stream-sts可以通过GitHub获取,该模块依赖nginx-module-sts模块,也需要被下载。

gitclone https://github.com/vozlt/nginx-module-sts.gitgitclone https://github.com/vozlt/nginx-module-stream-sts.git

在Nginx代码目录使用–add-module参数添加nginx-module-sts模块和nginx-module-stream-sts模块。

./configure --add-module=../nginx-module-sts --add-module=../nginx-module-stream-sts

3.2、模块配置指令

模块nginx-module-sts与nginx-module-stream-sts共同组成了TCP/UDP监控的配置指令集。配置命令如表所示。

  • http配置指令

  • stream配置指令

  • 1)指令stream_server_traffic_status_zone仅可编写在http指令域中。

  • 2)其他指令均可编写在http及其所包含的server、location指令域中。

  • 3)指令server_traffic_status_zone及server_traffic_status_histogram_buckets仅可编写在stream指令域中。

  • 4)其他指令均可编写在stream及其所包含的server指令域中。

  • 5)stream_server_traffic_status_display指令启用后,才会启用监控数据输出功能,监控数据包括Nginx服务器连接状态(Server Main)、Nginx stream主机连接状态(Server Zones)、过滤关键字连接状态(Filters)和stream上游服务器组连接状态(Upstreams)4个部分的内容。

    • Nginx服务器连接状态:包括Nginx连接状态模块自带的连接状态统计数据。
    • Nginx stream主机连接状态:会对当前Nginx服务器配置的每个stream主机端口的请求数(Requests Total)、请求时间(Requests Time)、请求频率(Requests Req/s)、响应(Responses)状态码、响应总数(Responses Total)、流量(Traffic)进行统计。
    • 过滤关键字连接状态:模块会按照配置指令vhost_traffic_status_filter_by_set_key设置的关键字进行统计,会对包含关键字连接的请求数(RequestsTotal)、请求时间(Requests Time)、请求频率(RequestsReq/s)、响应(Responses)状态码、响应总数(ResponsesTotal)、流量(Traffic)的数据进行统计并显示输出。
    • stream上游服务器组连接状态:包括每个上游服务器组的名称及其包含的每个被代理服务器的IP、端口、状态(State)、建立连接时间(Response Time Connect)、首字节时间(Response Time FirstByte)、响应时间 (Response Time Response,仅被代理服务器返回响应的时间)​、权重(Weight)、最大失败次数(Max Fails)、失败超时时间(Fail Timeout)、请求数(Requests Total)、请求时间(Requests Time)、请求频率(Requests Req/s)、响应(Responses)状态码、响应总数(Responses Total)、流量(Traffic)数据的统计。
  • 6)server_traffic_status_limit_traffic指令的member参数值如表所示。

3.3、TCP/UDP主机状态监控配置

TCP/UDP主机监控状态页需要配置在http指令域中。

http{stream_server_traffic_status_zone;# 启用stream主机状态监控,并使用默认共享内存配置server{listen8080;# 用于查看监控页的监听端口access_log off;location /sts{stream_server_traffic_status_display;# 启用stream主机状态监控数据输出#stream主机状态监控数据输出格式为htmlstream_server_traffic_status_display_format html;allow127.0.0.0/8;allow10.0.0.0/8;allow192.168.0.0/16;deny all;}}}

在stream指令域配置全局启用stream主机状态监控功能。

stream{server_traffic_status_zone;# 启用stream主机状态监控,并使用默认# 共享内存配置upstream redis{server192.168.2.100:6379;}server{listen6379;proxy_bind$remote_addrtransparent;proxy_pass redis;proxy_connect_timeout 5s;access_log logs/redis_access.log tcp;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 10:37:54

一维卷积神经网络用于虚假评论检测实战指南

简介&#xff1a;本资源是一篇发表于《计算机时代》2019年第11期的核心期刊论文&#xff0c;面向深度学习初学者、自然语言处理研究者及电商风控算法工程师&#xff0c;聚焦虚假评论检测这一典型文本分类任务。论文提出基于CNN的端到端建模方案&#xff0c;详细阐述了在扩展Ott…

作者头像 李华
网站建设 2026/10/5 10:37:54

AI算法大赛实战指南:工业级部署与工程化避坑

简介&#xff1a;本资源是2024年第六届全球校园人工智能算法精英大赛的权威赛题解析与备赛指南&#xff0c;面向高校学生、AI方向教师及深度学习实践者&#xff0c;聚焦图像鉴别、工业检测、智能医疗等前沿落地场景。内容覆盖5大核心赛题&#xff1a;AI生成人脸图像鉴别&#x…

作者头像 李华
网站建设 2026/10/5 10:36:50

基于循环神经网络的航班延误预测模型实战指南

简介&#xff1a;这份PDF文档围绕基于循环神经网络的航班延误预测模型展开&#xff0c;面向民航运行管理、空管数据分析及机器学习应用方向的学习者与研究人员&#xff0c;帮助解决航班延误趋势预判与地面保障资源调配中的建模问题。资源包内仅含1个PDF文件&#xff0c;整体约1…

作者头像 李华
网站建设 2026/10/5 10:34:58

硬盘坏道修复原理:从CHS/LBA寻址到重映射与低级格式化

简介&#xff1a;这份文档面向计算机维护人员、数据恢复初学者及关注硬盘稳定性的普通用户&#xff0c;系统梳理硬盘坏道修复的原理与实用知识&#xff0c;帮助读者理解硬盘故障的成因、分类及应对思路。资源包内含1个docx文档&#xff0c;压缩后约24KB&#xff0c;内容涵盖硬盘…

作者头像 李华
网站建设 2026/10/5 10:33:24

软考网络工程师案例分析:网络设计与故障排除的备考突破路径

简介&#xff1a;针对2024年下半年网络工程师案例分析真题的答案解析资料&#xff0c;覆盖VLAN与QinQ配置、OSPF故障排查、综合布线规划、ACFIT AP无线部署、ACL安全策略、勒索病毒处置以及链路聚合带宽扩容等高频考点。适合备考网络工程师资格考试的考生&#xff0c;也适用于日…

作者头像 李华