草庐IT

zabbix开源监控系列三(自定义key监控nginx_status)

zhang406 2023-03-28 原文
需求场景

lnmp环境 3台nginx 每台nginx服务上有几个虚拟主机,分别跑了不同的域名,准备对主站做nginx

status 状态做监控,监控每一台nginx的活动链接数,和总的活动连接数。

解决方案1

每台nginx server的主配置文件 都配置status模块  代码端如下

location /ngst{   stub_status on;   access_log off;   allow 127.0.0.1;   allow xxx.xxx.xxx.xxx;   deny all;   }引用网上文档,是一种解决方案。

缺点:每一个zabbix agent 都需要配置/etc/zabbix/zabbix_agentd.conf 并重新启动zabbix客户端 ,繁琐。

2、nginx-status的取值脚本

#!/bin/bash #HOST=`ifconfig eth0 | sed -n '/inet /{s/.*addr://;s/ .*//;p}'` HOST="192.168.103.2" PORT="8888" function active {         /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Active' | awk  '{print $NF}'         } function reading {         /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Reading' |  awk '{print $2}'        } function writing {         /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Writing' |  awk '{print $4}'        } function waiting {         /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| grep 'Waiting' |  awk '{print $6}'        } function accepts {         /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk  '{print $1}'        } function handled {         /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk  '{print $2}'        } function requests {         /usr/bin/curl "http://$HOST:$PORT/nginx-status/" 2>/dev/null| awk NR==3 | awk  '{print $3}'        } # Run the requested function $1

HOST和PORT,是监控nginx对应的服务器IP和端口可以直接用命令测试一下

/usr/bin/curl "http://192.168.103.2:8888/nginx-status/"

Active connections: 2 

server accepts handled requests

 1968 1968 3907 

Reading: 0 Writing: 1 Waiting: 1 


3、修改zabbix_agentd.conf的配置

/etc/zabbix/zabbix_agentd.conf UserParameter=nginx.accepts,/home/zabbix/nginx-status.sh accepts UserParameter=nginx.handled,/home/zabbix/nginx-status.sh handled UserParameter=nginx.requests,/home/zabbix/nginx-status.sh requests UserParameter=nginx.connections.active,/home/zabbix/nginx-status.sh active UserParameter=nginx.connections.reading,/home/zabbix/nginx-status.sh reading UserParameter=nginx.connections.writing,/home/zabbix/nginx-status.sh writing UserParameter=nginx.connections.waiting,/home/zabbix/nginx-status.sh waiting
 解决方案2 

1.每台nginx server的主配置文件 都配置status模块 

2.在一台nginx server 获取到nginx status的值,写到本地一个临时文件

3.按需求处理临时文件,使用UserParameter=nginx_status[*] 自定义key值的方式,

4.crontab 每分钟获取一次nginx status值

优点,不比每台zabbix 客户端都配置 /etc/zabbix/zabbix_agentd.conf 大大节约时间,并减少错误


缺点,一分钟获取一次,有稍稍不妥,但是时间还是看监控需求,脚本开发需要时间,(其实脚本很

简单)

具体实现方法,脚本思路及解决方案2 不可直接拿来使用,根据实际环境编写,简单的小脚本。此处

,此服务器可以直接使用hostname 访问,所以我使用了web1 web2。

#!/bin/bash rm -rf /tmp/ngst/* function GETSTATUS {   for ip in {1..3}   do        curl  http://web$ip:8080/ngst >/tmp/ngst/web$ip 2>/dev/null   done } function HANDLE {    for i in {1..3}    do       cat /tmp/ngst/web$i |grep Active   |awk  '{print $1,$NF}' >>/tmp/ngst/web${i}_status       cat /tmp/ngst/web$i |grep Reading  |awk  '{print $1,$2}' >>/tmp/ngst/web${i}_status       cat /tmp/ngst/web$i |grep Writing  |awk  '{print $3,$4}' >>/tmp/ngst/web${i}_status       cat /tmp/ngst/web$i |grep Waiting  |awk  '{print $5,$6}' >>/tmp/ngst/web${i}_status       #mv /tmp/ngst/web$i.new /tmp/ngst/web$i    done } function TOTAL{   cat /tmp/ngst/*status |grep Active |awk '{total+=$NF}END{print total}'>/tmp/ngst/total # 总的 Active 连接数 } GETSTATUS HANDLE TOTAL执行后结果如下

#ls /tmp/ngst/

total  web1  web1_status  web2  web2_status  web3  web3_status

#cat /tmp/ngst/web1

Active connections: 1 

server accepts handled requests

 7716005 7716005 7354221 

Reading: 0 Writing: 1 Waiting: 0 

# cat /tmp/ngst/web1_status 处理后的文件

Active 1

Reading: 0

Writing: 1

Waiting: 0


设置zabbix agent端 只需修改配置文件,添加如下几行,默认zabbix自定义key以知晓。

UserParameter=nginx_status.total, cat /tmp/ngst/total UserParameter=nginx_status[*], cat /tmp/ngst/web1 |grep "$1"|awk '{print $NF}' UserParameter=nginx2_status[*], cat /tmp/ngst/web2 |grep "$1"|awk '{print $NF}' UserParameter=nginx3_status[*], cat /tmp/ngst/web3 |grep "$1"|awk '{print $NF}' #只需要写这么几行就能实现对 Active Reading 等或者其他值得监控。此时在zabbix server端添加下列监控。

1,创建模板,默认都会

2,创建监控项

可以添加个图形,把所以的几个线汇总到一块。

解决方案2 为自己捣鼓,有很多不足之处,大神有更好的解决方案,请分享。

有关zabbix开源监控系列三(自定义key监控nginx_status)的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  10. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

随机推荐