Shell 性能监控:指标采集、告警规则与可视化大盘设计


一、前言

Shell 性能监控:指标采集、告警规则与可视化大盘设计是运维工程师和全栈开发者的必备技能。本文从Shell和监控出发,配有完整的命令和脚本示例。


二、常用命令速查

2.1 系统监控

bash 复制代码
# CPU 和内存使用
top -c
htop  # 更直观

# 磁盘使用
df -h
du -sh /* 2>/dev/null | sort -hr | head -10

# 网络连接
ss -tulnp | grep :80
netstat -anp | grep ESTABLISHED

# 进程监控
ps aux | grep java | grep -v grep

2.2 日志分析

bash 复制代码
# 实时查看日志
tail -f /var/log/nginx/access.log

# 过滤错误日志
grep -E "ERROR|FATAL" /var/log/app/error.log | tail -50

# 分析访问日志统计
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20

# 查看错误率
awk '{if ($9 >= 400) count++} END {print "错误率:", count/NR*100"%"}' access.log

三、Shell 脚本实战

3.1 自动化部署脚本

bash 复制代码
#!/bin/bash
set -euo pipefail

APP_NAME="myapp"
DEPLOY_DIR="/opt/${APP_NAME}"
BACKUP_DIR="/opt/backups/${APP_NAME}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

echo "=== 开始部署 ${APP_NAME} ==="

# 1. 备份旧版本
if [ -d "${DEPLOY_DIR}" ]; then
    echo "备份旧版本到 ${BACKUP_DIR}/${TIMESTAMP}"
    mkdir -p "${BACKUP_DIR}"
    cp -r "${DEPLOY_DIR}" "${BACKUP_DIR}/${TIMESTAMP}"
fi

# 2. 停止旧服务
echo "停止旧服务..."
systemctl stop "${APP_NAME}" || pkill -f "${APP_NAME}"

# 3. 部署新版本
echo "拉取最新镜像..."
docker pull myregistry:5000/${APP_NAME}:latest

docker-compose down
docker-compose up -d

# 4. 健康检查
echo "等待服务启动..."
sleep 10
curl -f http://localhost:8080/health || { echo "健康检查失败,回滚!"; exit 1; }

echo "=== 部署成功 ==="

3.2 日志清理脚本

bash 复制代码
#!/bin/bash
# 清理 7 天前的日志文件,保留最近 100MB

LOG_DIR="/var/log/myapp"
MAX_AGE=7
MAX_SIZE_MB=100

# 删除过期日志
find "${LOG_DIR}" -name "*.log.*" -mtime +${MAX_AGE} -delete

# 如果总大小超过限制,删除最旧的
TOTAL_SIZE=$(du -sm "${LOG_DIR}" | cut -f1)
if [ "${TOTAL_SIZE}" -gt "${MAX_SIZE_MB}" ]; then
    echo "日志大小超限 (${TOTAL_SIZE}MB),清理最旧的文件..."
    find "${LOG_DIR}" -name "*.log.*" -printf '%T+ %p
' |
        sort | head -n 20 | cut -d' ' -f2- | xargs rm -f
fi

echo "日志清理完成,当前大小: $(du -sh ${LOG_DIR})"

四、Nginx 配置

4.1 反向代理配置

nginx 复制代码
server {
    listen 80;
    server_name myapp.example.com;

    # HTTP 跳转到 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name myapp.example.com;

    ssl_certificate /etc/ssl/certs/myapp.crt;
    ssl_certificate_key /etc/ssl/private/myapp.key;
    ssl_protocols TLSv1.2 TLSv1.3;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        proxy_pass http://127.0.0.1:8080;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

五、总结

  1. 监控先行------没有监控的服务器等于裸奔
  2. 日志要分级和轮转------防止磁盘撑满
  3. 脚本要加 set -euo pipefail------提前失败,避免连锁反应
  4. 配置变更要备份------出问题能快速回滚

💬 收藏本文!关注我,后续更新更多 Linux 运维实战系列。


💬 觉得有用的话,点个赞+收藏,关注我,持续更新优质技术内容!

标签:Shell | 监控 | Prometheus | Grafana | 运维

相关推荐
荣--6 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森7 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工7 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信