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 EOF2、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-vts2.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-sts3.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;}}