服务器运维实战指南:日常管理、监控告警与常见排错
无论你的网站是个人博客还是企业应用,服务器运维都是确保稳定运行的核心工作。据统计,超过 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 观察
服务器运维的核心不在于「出事后能多快修复」,而在于「如何提前预防故障」。建议从第一天就建立:
- 监控系统:哪怕只是一个简单的 UptimeRobot + Telegram 通知
- 自动备份:备份不是目的,能恢复才是
- 运维手册:记录常见问题的处理步骤
将这些基础做到位,90% 的运维问题都可以在用户发现之前解决。