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 | 运维

相关推荐
liann1195 小时前
3.4_Linux 应急响应排查速查命令表
linux·运维·服务器·安全·网络安全·系统安全
孪生质数-5 小时前
Linux高危漏洞通报Copy Fail - CVE-2026-31431
linux·运维·服务器·ubuntu·网络安全·debian·cve-2026-31431
IMPYLH5 小时前
Linux 的 tee 命令
linux·运维·服务器·bash
pc07936 小时前
带网络接口的打印机和USB接口打印机的共享区别
运维·服务器·网络
理人综艺好会6 小时前
nginx了解
运维·nginx
雷工笔记6 小时前
KingFusion|最近开发调试中遇到的几个问题及解决办法(2)
运维·服务器
蓝天居士6 小时前
Linux网络驱动之Fixed-Link(29)
linux·运维·网络
帅气的钟先生6 小时前
OpenClaw + QQBot 实战:从 0 到 1 搭建你的消息自动化助手
运维·人工智能·自动化
techdashen6 小时前
把 Matrix 聊天服务器搬到 Serverless 上,还顺便免费升级了量子加密
运维·服务器·serverless
一叶龙洲6 小时前
Ubuntu24.04向日葵远程控制
linux·运维·ubuntu