服务器维护不存在一劳永逸的办法,机器上线之后,指标巡检、备份、安全补丁,每一项都不能省略。很多人以为服务器部署完成就可以放任不管,等到故障发生,才找不到日志查看位置。
日常巡检是基础工作。每天花少量时间查看CPU负载、内存占用、磁盘空间、网络流量。CPU长期占用超过80%,要么程序存在死循环,要么访问量上涨,需要升级配置。内存占满会触发OOM机制,系统直接终止进程,网站直接下线。磁盘空间最容易被忽视,日志、临时文件、备份文件持续堆积,磁盘写满之后数据库无法写入,整个站点瘫痪。网络流量突然暴涨,大概率遭遇攻击,或是某个文件被大量下载,需要排查源头。

监控告警功能必须部署。人工无法全天候值守,Zabbix、Prometheus这类工具部署之后,设置CPU、内存、磁盘、带宽、HTTP状态码阈值,指标超出阈值自动发送邮件或者短信告警。不要等到用户反馈网站打不开再排查故障,这时损失已经产生。监控采集频率不用过高,一分钟一次足够,采集频率太高会增加服务器负载。
备份的重要性怎么强调都不为过。数据库至少每日备份,全量备份搭配增量备份。网站文件体积不大,可以每周执行一次全量备份。备份文件不能保存在同一台服务器,硬盘损坏会连同备份一并丢失。异地备份是底线,可以存放到对象存储或者另一台服务器。备份完成之后定期做恢复测试,没有测试过的备份没有实际价值,故障时发现备份文件损坏,无法挽回数据。
安全补丁按时更新。操作系统、应用软件厂商发布安全更新,一般是发现可被利用的安全漏洞。拖延越久,被扫描探测、遭受攻击的概率越高。生产环境不能随意重启服务器,先在测试环境验证更新,再分批滚动上线。SSH不要使用默认22端口,关闭密码登录,改用密钥认证。防火墙只放行必要端口,数据库端口禁止对公网开放。Fail2ban工具可以自动封禁多次密码尝试失败的IP。
日志需要定期查看。系统日志、Web服务日志、数据库慢查询日志,故障排查的线索都存放在日志内。日志需要轮转,不然短时间就填满磁盘。有条件集中收集日志到日志服务器,方便检索。分析访问日志能够发现异常请求,大量404报错、同一IP高频访问,大概率是扫描器探测漏洞。
性能优化是持续进行的工作。定期排查数据库慢查询,添加索引可以解决大部分性能问题。静态资源接入CDN降低源站压力,合理开启缓存,Redis、Memcached可以显著减轻数据库负载。Web服务、PHP参数依据实际负载调整,不要直接照搬网上现成配置。单机承载压力不足,考虑负载均衡,分流流量至多台服务器。
故障处理提前准备预案。服务异常优先查看日志,检查进程运行状态,判断重启服务或是回滚版本。重大变更操作前必须备份,准备回退方案。不要在深夜执行没有经过测试的变更,故障发生缺少人员协助。变更操作做好记录,记录修改人、修改内容、时间、变更效果,后续故障排查节省时间。
自动化工具减少重复工作量。Ansible或者脚本处理日志清理、备份、服务重启这类重复运维任务。单机适合cron定时任务,多台服务器用配置管理工具。自动化不是万能,脚本本身也要维护,编写错误会批量造成服务器故障。
容量规划提前完成。磁盘、内存、带宽的增长趋势要持续关注,不要等到资源耗尽才紧急扩容。云服务器扩容操作简单,物理机或是固定配置VPS扩容往往需要停机迁移,提前规划避免突发故障。
网站服务器还有几项专属维护事项。SSL证书到期前完成续期,忘记续期浏览器会弹出安全风险提示。定期核验域名解析记录,防止解析指向错误IP。Web服务、数据库版本升级谨慎操作,大版本升级容易出现兼容性问题,阅读官方文档,在测试环境验证之后再上线。
运维工作做好了基本不会出现突发故障,疏于维护就会不停处理各类紧急问题。把基础运维工作落实到位,远比故障之后临时查找解决办法更省心。