CentOS 7在2024年6月30日正式停止维护,CentOS 8更早在2021年底就被Red Hat砍掉。现在大量生产服务器还跑着CentOS 7,面临没有安全补丁、没有软件更新的裸奔状态。继续用下去,内核漏洞、OpenSSL漏洞、glibc漏洞都会直接暴露在公网。迁移不是可选项,是必须马上做的事。但迁移生产服务器不是重装系统那么简单,业务中断、配置丢失、依赖冲突、回滚困难,每个坑都可能导致线上事故。下面直接讲可落地的迁移方案和操作细节。
先确定目标系统:Rocky Linux还是AlmaLinux
CentOS停更后,社区分裂出两个主流替代品:Rocky Linux和AlmaLinux。两者都声称与RHEL 100%二进制兼容,但实际使用中有细微差别。Rocky Linux由CentOS原创始人Gregory Kurtzer发起,社区驱动,版本跟进速度快,通常RHEL发布补丁后24到48小时内同步。AlmaLinux由CloudLinux公司支持,背后有商业实体,更新更稳定,且从9.x版本开始不再追求1:1的RHEL兼容,而是允许部分补丁提前或独立修复。对于绝大多数从CentOS 7迁移的场景,两个系统都够用。如果你的业务对稳定性要求极高、不希望有任何意外变化,选AlmaLinux 9;如果希望社区驱动、完全跟随RHEL节奏,选Rocky Linux 9。不要选Rocky Linux 8或AlmaLinux 8,因为8系列本身也将在2029年停止维护,而9系列支持到2032年,迁移一次就要迁到生命周期最长的版本。
迁移前必须做的三件事
第一,全量备份。不是只备份网站文件和数据库,要备份整个系统配置目录:/etc、/var/lib、/usr/local、/opt、/root、/home,以及crontab -l的输出、systemctl list-unit-files的状态、防火墙规则iptables-save或firewall-cmd --list-all的输出。用rsync或tar打包,存到独立于本机的位置。第二,做一次完整的服务清单盘点。用ss -tlnp列出所有监听端口,用systemctl list-units --type=service --state=running列出所有运行中的服务,用rpm -qa --last | head -50查看最近安装和更新的软件包。第三,准备回滚方案。最稳妥的是对系统盘做快照,如果是云服务器,直接在控制台创建快照;如果是物理机,用Clonezilla或dd做整盘镜像。没有快照的迁移就是赌博。
方案一:原地升级工具迁移(风险高,不推荐生产环境直接上)
CentOS官方和社区提供了一些原地升级脚本,比如AlmaLinux的almalinux-deploy.sh,Rocky Linux的migrate2rocky.sh。这些脚本的原理是替换系统仓库源,卸载CentOS专属包,安装新系统的release包和核心组件。理论上可以保留大部分配置和数据,但实际执行中问题很多。常见故障包括:第三方源冲突、内核版本跨度太大导致驱动不兼容、SELinux上下文错乱、Python版本从2.7跳到3.9导致系统工具异常。原地升级只适合测试环境或者不重要的单机服务,生产环境强烈不建议直接用。如果一定要用,先在完全相同的测试机上跑一遍,记录所有报错和修复步骤,再考虑生产操作。
方案二:新装系统加服务迁移(推荐,最可控)
这是最稳妥的方式。准备一台新服务器或虚拟机,安装Rocky Linux 9或AlmaLinux 9,然后逐个迁移服务。具体步骤如下:
第一步,安装基础环境。新系统装好后,先更新到最新:dnf update -y,然后安装常用工具:dnf install -y vim wget curl git rsync net-tools bind-utils telnet nc htop iftop。根据原服务器的架构安装对应的Web服务器、数据库、PHP或Python环境。注意版本差异:CentOS 7上的PHP可能是5.4或7.2,而Rocky 9默认源里是PHP 8.0到8.3。如果业务代码不兼容PHP 8,需要用Remi仓库安装旧版本PHP,或者用Docker跑旧版环境。
第二步,迁移网站文件和数据库。用rsync同步网站目录,注意保留权限和属主:rsync -avzP --delete /var/www/html/ root@新服务器IP:/var/www/html/。数据库用mysqldump导出再导入,或者用物理备份工具如Percona XtraBackup。导出时加--single-transaction --routines --triggers --events参数,保证存储过程、触发器、事件都带上。导入后执行mysql_upgrade检查表结构兼容性。
第三步,迁移配置文件。不要直接复制整个/etc目录,新旧系统的配置格式有差异。逐个服务对比配置文件,只迁移业务相关的部分。比如Nginx的站点配置、PHP-FPM的池配置、MySQL的my.cnf中自定义参数。用diff工具对比新旧默认配置,把差异部分合并到新配置中。
第四步,切换DNS或负载均衡。确认新服务器所有服务测试通过后,修改DNS解析或负载均衡后端,把流量切到新服务器。保留旧服务器至少一周,观察日志和监控,确认无异常后再下线。
方案三:容器化迁移(长期最优,但需要改造)
如果你的业务已经在用Docker,或者计划容器化,这是迁移的最佳时机。在Rocky Linux 9上安装Docker或Podman,把每个服务封装成容器。这样做的好处是以后系统升级不再影响业务,CentOS停更的教训不会再犯。具体做法:为每个服务编写Dockerfile,基础镜像用rockylinux:9或almalinux:9,把业务代码和依赖打进镜像。用docker-compose或Kubernetes编排。数据库可以继续用容器跑,但生产环境建议用云数据库或独立数据库服务器,避免容器重启导致数据丢失。容器化迁移的难点在于老代码的依赖环境复现,如果原来的CentOS 7上有大量手工编译的软件,需要重新整理编译步骤。
迁移中常见的坑和解决办法
第一个坑是OpenSSL版本变化。CentOS 7用的是OpenSSL 1.0.2,Rocky 9用的是OpenSSL 3.0。一些老旧的加密算法如TLS 1.0、1.1、3DES、RC4在OpenSSL 3.0中默认禁用。如果业务代码或客户端依赖这些旧算法,连接会失败。解决办法是在配置中显式启用兼容选项,或者升级客户端。第二个坑是glibc版本变化导致的二进制不兼容。CentOS 7是glibc 2.17,Rocky 9是glibc 2.34。如果业务中有从CentOS 7直接拷贝过来的二进制程序,很可能无法运行。必须在新系统上重新编译。第三个坑是systemd单元文件差异。CentOS 7的systemd版本较老,部分指令如ProtectSystem、PrivateTmp在新版中行为有变化。迁移自定义service文件时要逐项检查。第四个坑是SELinux策略。CentOS 7默认SELinux是enforcing,但很多运维为了方便直接关了。Rocky 9默认也是enforcing,如果业务目录或端口不符合默认策略,服务会启动失败。建议先用setenforce 0临时关闭,确认业务正常后再根据audit日志生成自定义策略,不要长期关闭SELinux。
迁移后的安全加固
迁移完成后,趁系统是新的,把安全基线做扎实。第一,配置自动安全更新:dnf install -y dnf-automatic,编辑/etc/dnf/automatic.conf,设置apply_updates = yes,让安全补丁自动安装。第二,配置防火墙,只开放必要端口。用firewall-cmd --permanent --add-service=http --add-service=https,然后firewall-cmd --reload。第三,启用fail2ban防止暴力破解。第四,配置日志集中收集,用rsyslog或journald转发到日志服务器。第五,禁用root远程登录,改用密钥认证。第六,定期跑安全审计工具如Lynis或OpenSCAP。
时间窗口和业务连续性
迁移生产服务器必须规划好时间窗口。对于可以容忍短暂中断的业务,选择凌晨低峰期操作,提前发公告。对于不能中断的业务,用灰度切换:先在新服务器上部署完整环境,把只读流量切过去测试,再逐步切换写入流量。如果业务依赖数据库,先做主从同步,等数据追平后再切换。整个迁移过程要写详细的runbook,每一步的命令、预期输出、回滚操作都写清楚。执行时严格按runbook走,不要临时发挥。
总结
CentOS停更不是世界末日,但拖延迁移就是拿业务安全开玩笑。最推荐的路径是:新装Rocky Linux 9或AlmaLinux 9,逐个迁移服务,测试通过后切换流量,保留旧服务器观察一周。迁移过程中最大的风险不是技术本身,而是对现有系统的不了解。先做全面盘点,再动手。迁移完成后顺手把容器化做了,以后系统升级就不再是灾难。
