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

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

一个好的运维团队,日常做的往往是“看起来没发生什么”——因为故障在用户感知之前就被处理掉了。本文默认你管理的是 1-10 台 Linux 服务器,覆盖从每天检查、告警配置到常见故障定位的完整闭环;掌握这些,大部分“网站突然打不开”的问题都能在 30 分钟内定位。

一、日常运维检查清单

每日检查

# 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 状态

看懂 uptime 输出是运维的基本功:load average: 0.42, 0.31, 0.28 分别是过去 1、5、15 分钟的平均负载。单核机器负载超过 1.0 说明 CPU 已排队,持续超过核数就要开始查进程;如果 1 分钟负载远高于 15 分钟负载,通常是瞬时流量或慢查询导致,先抓 top 看是哪个进程在扛。

每周维护

# 系统更新
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

告警配置最容易犯的错是“什么都告”。磁盘 80% 就告、CPU 90% 就告,结果每天几十条通知,人很快就麻木,真正的故障反而被淹没。建议只对真正需要人介入的事件告警:磁盘剩余不足 20%、服务宕机、证书 7 天内到期、备份失败。其他指标用看板观察趋势即可。

三、常见故障排错

网站无法访问排查流程

用户反馈网站无法访问
  │
  ├─→ 检查服务器是否在线
  │    ├─→ 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

一个真实的排查案例

某电商站大促前夜,用户反馈“加购很慢”。运维先看负载——不高;再看 ss -tlnp——80 端口正常;接着查数据库,SHOW PROCESSLIST 发现有大量 Sleep 连接占满了 max_connections。根因是连接池配置过大、又没有设置 wait_timeout,慢请求把连接耗尽。临时把 max_connections 调大恢复服务,随后在应用层收紧连接池并加上连接复用,问题彻底解决。这类案例的共性:先确认服务在不在,再确认资源够不够,最后才怀疑应用逻辑——排查顺序对了,一半问题已经解决。

四、备份策略

自动备份脚本

#!/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

以上参数需要结合实际场景调整:如果服务器主要跑 Nginx 反代,somaxconntcp_max_syn_backlog 值得调大;如果是高并发 API,tcp_tw_reuse 能减少 TIME_WAIT 堆积。修改后 sysctl -p 立即生效,但建议在低峰期操作并观察一两天,避免突发流量时出现新瓶颈。

参考:Linux 性能分析工具 https://www.brendangregg.com/linuxperf.html;systemd 手册 https://www.freedesktop.org/software/systemd/man/systemd.html;Prometheus 官方文档 https://prometheus.io/docs/introduction/overview/

16IDC 观察

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

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