生产环境处理安全补丁,核心原则是“先流量摘除,后分批更新,再平滑重载”。内核补丁优先选用厂商热补丁服务,用户态软件通过编排工具结合负载均衡实现无感更新。
先说结论:严禁直接全量更新。必须建立“快照备份 - 流量摘除 - 分批更新 - 验证恢复”的闭环流程。
- 先判断:使用
needs-restarting确认是否必须重启内核,优先选择用户态热修复。 - 优先做:更新前对云主机创建快照,物理机确认救援模式,清理
/boot分区防止更新失败。 - 再验证:更新后不仅检查版本号,必须验证业务日志、监控指标及漏洞扫描结果。
核心命令与配置速查
# 1. 仅安装安全相关补丁 (CentOS/RHEL)\nyum update `--security` -y\n\n# 2. 仅安装安全相关补丁 (Ubuntu/Debian)\napt update \&\& apt upgrade `--only-upgrade` -y\n\n# 3. 检查是否需要重启内核 (需安装 yum-utils)\nyum install -y yum-utils\nneeds-restarting -r\n\n# 4. 清理旧内核释放 /boot 空间 (防止更新失败)\npackage-cleanup `--oldkernels` `--count`=2\n\n# 5. 平滑重载服务 (避免连接中断)\nnginx -s reload\nsystemctl reload httpd灰度实施详细流程
第一步:环境准备与备份
执行更新前,确保有可用的回滚方案。云服务器创建快照;物理机确认系统救援模式可用。重点检查 /boot 分区剩余空间,若不足需先清理旧内核,否则会导致新内核安装失败无法启动。
第二步:负载均衡流量摘除
在更新节点前,先从负载均衡器移除该节点,等待现有连接处理完毕(Drain 模式)。
# Nginx Upstream 示例:注释掉或标记 down\n# server 192.168.1.10:80 down;\n\n# HAProxy 示例:禁用后端\necho "disable server backend/server1" | socat stdio /var/run/haproxy.sock第三步:分批更新生产节点
使用编排工具限制并发数量,避免同时重启导致负载激增。以下是 Ansible 分批更新 Playbook 关键配置示例:
- hosts: webservers\n serial: "20%" # 每次只更新 20% 的节点\n max_fail_percentage: 10 # 失败率超过 10% 则停止\n tasks:\n - name: Apply security patches\n yum:\n name: '*'\n state: latest\n security: yes\n when: ansible_os_family == "RedHat"第四步:服务平滑重载
更新完成后,避免直接使用 systemctl restart,优先使用 reload 信号。对于必须重启进程的服务(如 Java 应用),确保新流量已切断后再操作。
第五步:恢复流量与验证
确认节点健康检查通过后,重新将节点加入负载均衡池。观察监控指标无异常后,再进行下一批更新。
紧急回滚操作指南
若更新后出现业务异常,立即执行回滚:
- 流量回切:若新版本有问题,先在负载均衡层将流量切回旧版本节点或备用集群。
- 内核回滚:重启服务器,在 GRUB 菜单中选择旧版本内核启动。永久生效需修改
/etc/default/grub并重新生成配置。 - 软件包降级:使用包管理器降级特定软件。
# CentOS/RHEL 降级示例\nyum downgrade package_name-version\n\n# Ubuntu 降级示例\napt-get install package_name=version
怎么验证是否生效
更新完成后,不要只看命令执行返回码。结合以下维度验证:
- 版本确认:使用
rpm -qa `--last`或dpkg -l确认包版本已变更。 - 进程检查:使用
lsof -p PID | grep deleted检查是否有进程仍加载旧库文件,若有需重启对应服务。 - 业务监控:查看 CPU、内存、请求延迟是否在正常波动范围内,搜索应用日志中
error或exception关键词。 - 漏洞扫描:使用漏洞扫描工具再次扫描,确认 CVE 编号已修复(注意扫描结果可能有延迟)。
常见风险与排查
- 配置文件被覆盖:更新软件包时,系统可能会提示是否保留修改过的配置文件,务必选择保留(keep),否则业务配置丢失。
- 依赖库未生效:更新了基础库(如 glibc、OpenSSL),但依赖它的服务没有重启,进程仍在旧库上运行。使用
needs-restarting排查需重启的服务列表。 - /boot 分区不足:更新过程中会下载包并保留旧内核,若空间满会导致更新失败。定期清理旧内核是必要维护动作。
- 时间同步问题:批量重启可能导致时间同步服务短暂中断,影响分布式系统日志顺序或认证,确保 NTP/Chrony 服务正常。