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

相关推荐
名字还没想好☜1 分钟前
Kubernetes CrashLoopBackOff 排查全流程:从 describe 到日志到 exit code
运维·docker·云原生·容器·kubernetes
冰封之寂19 分钟前
Docker 部署与基础命令详解:从安装到容器管理全流程指南
linux·运维·docker·容器
隔振消音专家42 分钟前
冷水机组振动传导影响及专业化减振适配治理方案
大数据·运维
Brilliantwxx43 分钟前
【Linux】 软件包管理器(yum)+ Vim使用
linux·运维·服务器·开发语言·编辑器·vim
skywalk81631 小时前
在FreeBSD的Uubntu兼容环境下安装Reasonix
linux·运维·freebsd
^yi1 小时前
【Linux系统编程】对操作系统的理解
linux·运维·服务器·操作系统·系统调用·os
Kina_C1 小时前
LVS-NAT 负载均衡实验从环境搭建到规则持久化
linux·运维·服务器·负载均衡·lvs
Android洋芋2 小时前
PrintFriendly网页文章转PDF插件工具及技术分析
运维·服务器·pdf·网页转pdf
HiDev_2 小时前
【非标自动化】2、认识元器件(PE、N、L1/L2/L3)
运维·自动化
Elastic 中国社区官方博客2 小时前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索