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