一、前言
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";
}
}
五、总结
- 监控先行------没有监控的服务器等于裸奔
- 日志要分级和轮转------防止磁盘撑满
- 脚本要加
set -euo pipefail------提前失败,避免连锁反应 - 配置变更要备份------出问题能快速回滚
💬 收藏本文!关注我,后续更新更多 Linux 运维实战系列。
💬 觉得有用的话,点个赞+收藏,关注我,持续更新优质技术内容!
标签:Shell | 监控 | Prometheus | Grafana | 运维