Nginx监控

Nginx监控

一个服务健康与否,与运维人员息息相关。当一个服务出现问题时,运维人员如何在第一时间感知并恢复业务呢?此时相应的监控、告警就排上了用场。

1.基于外部的进程监控

#!/bin/bash    
# 定义一个函数来检查 Nginx 的 PID 和进程状态  
function check_nginx_pid() {  
    # 设置 Nginx PID 文件的路径  
    NGINX_PID=$(find / -name "nginx.pid") 
      
    # 通过读取 /proc/cpuinfo 文件并计算以 'processor' 开头的行数来获取 CPU 核心数  
    CPUCORES=$(grep -c '^processor' /proc/cpuinfo)  # 更通用的方式来获取CPU核心数  
      
    # 检查 PID 文件是否存在且不为空  
    if [ -s "$NGINX_PID" ]; then  
        # 从 PID 文件中读取 Nginx 主进程的 PID  
        MASTER_PID=$(cat "$NGINX_PID")  
          
        # 使用 ps 命令和 wc -l 来计算主进程 PID 对应的进程数量(通常应该是 1,除非 PID 无效)  
        MASTER_NUM=$(ps -p "$MASTER_PID" -o pid= | wc -l)  
          
        # 使用 pgrep 查找所有包含 'nginx' 的进程,然后通过 grep 排除主进程和 grep 命令本身,最后计算剩余的工作进程数量  
        SLAVE_NUM=$(pgrep -f nginx | grep -vE "master|grep" | wc -l)  
          
        # 如果主进程不存在或工作进程数量少于 CPU 核心数,则认为 Nginx 可能有问题  
        if [ "$MASTER_NUM" -eq 0 ] || [ "$SLAVE_NUM" -lt "$CPUCORES" ]; then  
            echo "Nginx process may have a problem!!! Master: $MASTER_NUM, Workers: $SLAVE_NUM, CPU Cores: $CPUCORES"  
        else  
            # 如果主进程存在且工作进程数量不少于 CPU 核心数,则认为 Nginx 进程状态良好  
            echo "Nginx processes seem fine. Master: $MASTER_NUM, Workers: $SLAVE_NUM, CPU Cores: $CPUCORES"  
        fi  
    else  
        # 如果 PID 文件不存在或为空,则认为 PID 文件有问题  
        echo "Nginx Pid file may have a problem!!!"  
    fi  
}  
  
# 调用函数 
check_nginx_pid

2.基于外部的端口监控

#!/bin/bash  
  
function check_nginx_port() {  
    # 查找 netcat 命令的路径 这个命令需要安装,可以写一个if判断
    NC=$(which nc)  
    if [ $? -eq 0 ];then
        echo "NC software exists"
    else
        yum install -y nc & >/dev/null
    fi  
    
    # 使用 netcat 检查 Nginx 是否在监听 80 端口  
    $NC -n -w 1 127.0.0.1 80 > /dev/null 2>&1  
    ret=$? 
      
    # 根据 netcat 的返回码判断 Nginx 端口状态  
    if [ $ret -ne 0 ]; then  
        echo "Nginx Port 80 Down!!"  
        exit 1  
    else  
        echo "Nginx Port 80 is up and running."  
    fi  
}  
  
# 调用函数  
check_nginx_port

3.StubStatus 模块监控

Nginx 的 ngx_http_stub_status_module 模块提供了基础的Nginx状态统计信息。要使用此功能, 前提在编译安装时要指定参数 --with-http_stub_status_module。

1).配置文件

[root@proxy ~]# vim /etc/nginx/conf.d/nginx_status.conf
server {
# 监听80端口
    listen 80;
    server_name www.xwey.com;
    root /uar/share/nginx/html/www.xwey.com;
    access_log /var/log/nginx/xwey-access_log main;
    error_log  /var/log/nginx/xwey-error_log;
# 开启Nginx的stub_status模块,允许通过HTTP请求获取Nginx的状态信息。 
location /nginx_status {
  stub_status on;
  access_log off;
  allow 127.0.0.1;
  deny all;
 }
}

2).验证测试

[root@proxy ~]# curl http://127.0.0.1/nginx_status -H "HOST: www.xwry.com"
Active connections: 1 
server accepts handled requests
 				 2 			 2 			 2 
Reading: 0 Writing: 1 Waiting: 0 
具体含义:
# Active connections 当前活跃的客户端连接数量
# accepts 到目前为止总共接受的客户端连接数量
# handled 到目前为止已处理的连接数量,正常情况下,值同参数 accepts 的值相同
# requests 到目前为止总的客户端请求数量
# Reading 从当前的连接中,Nginx 读到的请求头数量
# Writing 从当前的连接中,Nginx 正在写入响应到客户端的数量,目前正在给多少客户端响应内容
# Waiting 当前有多少个空闲连接在等待请求

4.监控分析脚本

#!/bin/bash
# Nginx Status Shell Monitoring Script

# Nginx安装路径下的status模块URL
NGINX_STATUS_URL=${1:-"http://localhost/nginx_status"}

# 检查Nginx状态
function check_nginx_status {
    # 使用curl命令获取Nginx状态
    NGINX_STATUS=$(curl -s $NGINX_STATUS_URL)

    # 检查是否有Active Connections
    ACTIVE_CONNECTIONS=$(echo "$NGINX_STATUS" | grep 'Active' | awk '{print $3}')
    if [ -z "$ACTIVE_CONNECTIONS" ]; then
        echo "Nginx status module is not enabled or not responding."
        exit 1
    fi

    # 输出状态信息
    echo "Nginx Status:"
    echo "Active Connections: $ACTIVE_CONNECTIONS"
    echo "Server accepts handled requests:"
    echo $(echo $NGINX_STATUS | awk '{print "accepts: " $8}')
    echo $(echo $NGINX_STATUS | awk '{print "handled: " $9}')
    echo $(echo $NGINX_STATUS | awk '{print "requests: " $10}')
    echo $(echo $NGINX_STATUS | awk '{print "Reading: " $12}')
    echo $(echo $NGINX_STATUS | awk '{print "Writing: " $14}')
    echo $(echo $NGINX_STATUS | awk '{print "Waiting: " $16}')
}

# 执行函数
check_nginx_status
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值