服务器运维实战指南:日常管理、监控告警与常见排错

无论你的网站是个人博客还是企业应用,服务器运维都是确保稳定运行的核心工作。据统计,超过 60% 的网站故障可以通过规范的运维流程预防。本文将介绍服务器运维的日常管理和故障排错技巧。

一、日常运维检查清单

每日检查

# 1. 系统负载检查
uptime                    # 查看平均负载
top -bn1 | head -5        # CPU 和使用率最高的进程
free -h                   # 内存使用情况

# 2. 磁盘检查
df -h                     # 磁盘空间
du -sh /var/log/          # 日志文件大小(日志撑满磁盘是常见问题)

# 3. 网络检查
ping -c 4 google.com      # 外网连通性
ss -tlnp                  # 监听端口状态

# 4. 服务检查
systemctl status nginx    # Web 服务器状态
systemctl status mysql    # 数据库状态
systemctl status php8.3-fpm  # PHP 状态

每周维护

# 系统更新
apt update && apt upgrade -y

# 检查日志错误
journalctl -p err -b      # 查看启动以来的错误日志
tail -100 /var/log/nginx/error.log  # Nginx 错误日志

# 数据库维护
mysqlcheck -o --all-databases       # 优化所有数据库表

# 检查证书到期
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | openssl x509 -noout -dates

每月运维

  • 审计用户账户和 SSH 密钥
  • 审查系统日志中的异常登录尝试
  • 检查并轮转日志文件
  • 测试备份恢复流程
  • 评估服务器资源使用趋势

二、监控告警配置

使用 UptimeRobot

UptimeRobot 提供免费的网站监控服务,支持 HTTP、Ping、端口监控:

配置步骤:
1. 注册 UptimeRobot 账户
2. 添加监控项目 → Monitor Type: HTTP(s)
3. 设置检查频率(5 分钟免费)
4. 配置通知渠道(邮件/Slack/Telegram)

使用 Prometheus + Grafana

对于自建监控系统,Prometheus + Grafana 是最流行的开源方案:

# docker-compose.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    depends_on:
      - prometheus

  node-exporter:
    image: prom/node-exporter
    ports:
      - "9100:9100"

告警通知配置(Telegram)

# 使用简单的 Shell 脚本发送告警
#!/bin/bash

TELEGRAM_BOT_TOKEN="your_bot_token"
CHAT_ID="your_chat_id"

send_alert() {
    curl -s -X POST \
        "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
        -d chat_id="${CHAT_ID}" \
        -d text="⚠️ 服务器告警: $1" \
        -d parse_mode="Markdown"
}

# 检查磁盘使用率
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 85 ]; then
    send_alert "磁盘使用率超过 85%: 当前 ${DISK_USAGE}%"
fi

# 检查内存使用率
MEM_USAGE=$(free | awk '/Mem/ {print int($3/$2 * 100)}')
if [ $MEM_USAGE -gt 90 ]; then
    send_alert "内存使用率超过 90%: 当前 ${MEM_USAGE}%"
fi

三、常见故障排错

网站无法访问排查流程

用户反馈网站无法访问
  │
  ├─→ 检查服务器是否在线
  │    ├─→ ping IP 地址
  │    ├─→ SSH 是否能连接
  │    └─→ 联系数据中心检查(硬件故障)
  │
  ├─→ 检查 Web 服务
  │    ├─→ systemctl status nginx
  │    ├─→ 检查端口监听:ss -tlnp | grep :80
  │    └─→ 查看错误日志:tail -50 /var/log/nginx/error.log
  │
  ├─→ 检查数据库
  │    ├─→ systemctl status mysql
  │    ├─→ mysqladmin ping
  │    └─→ 检查磁盘空间(数据库写不进去)
  │
  ├─→ 检查网络和防火墙
  │    ├─→ iptables -L -n
  │    ├─→ ufw status
  │    └─→ 检查云服务商安全组
  │
  └─→ 检查 SSL 证书
       ├─→ openssl s_client -connect example.com:443
       └─→ certbot certificates

高 CPU/内存问题排查

# 找出消耗最高的进程
top -o %CPU                  # 按 CPU 排序
top -o %MEM                  # 按内存排序
ps aux --sort=-%cpu | head   # 查看 CPU 占用 TOP 10

# Java/PHP 应用 CPU 高
# 1. 查看进程线程
top -H -p <pid>
# 2. 抓取堆栈
jstack <pid> > stack.log     # Java
# 3. 分析慢请求
tail -100 /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn

磁盘空间清理

# 查找大文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

# 清理日志
journalctl --vacuum-time=7d                          # 清理 7 天前的日志
truncate -s 0 /var/log/nginx/access.log               # 清空访问日志
find /var/log -name "*.gz" -mtime +30 -delete         # 删除 30 天前的压缩日志

# 清理 Docker
docker system prune -af                               # 清理未使用的 Docker 资源

# 清理包缓存
apt autoremove -y
apt autoclean

四、备份策略

自动备份脚本

#!/bin/bash
# 数据库备份
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)

# MySQL 备份
mysqldump --all-databases --single-transaction | gzip > ${BACKUP_DIR}/mysql_${DATE}.sql.gz

# 网站文件备份
tar -czf ${BACKUP_DIR}/www_${DATE}.tar.gz /var/www/

# 配置文件备份
tar -czf ${BACKUP_DIR}/etc_${DATE}.tar.gz /etc/nginx/ /etc/mysql/ /etc/php/

# 删除 30 天前的备份
find ${BACKUP_DIR} -name "*.gz" -mtime +30 -delete

# 异地备份(使用 rclone)
rclone copy ${BACKUP_DIR} remote:backup-bucket/ --progress

备份策略建议

备份类型 频率 保留期限 存储位置
数据库 每日 30 天 本地 + 对象存储
网站文件 每日 30 天 本地 + 对象存储
配置文件 每次变更 90 天 Git + 对象存储
完整镜像 每周 2 个月 云服务商快照

五、性能优化建议

# 调整 Linux 内核参数
cat >> /etc/sysctl.conf << 'EOF'
# 网络优化
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1

# 文件句柄限制
fs.file-max = 100000
EOF

sysctl -p

16IDC 观察

服务器运维的核心不在于「出事后能多快修复」,而在于「如何提前预防故障」。建议从第一天就建立:

  1. 监控系统:哪怕只是一个简单的 UptimeRobot + Telegram 通知
  2. 自动备份:备份不是目的,能恢复才是
  3. 运维手册:记录常见问题的处理步骤
    将这些基础做到位,90% 的运维问题都可以在用户发现之前解决。