记一次从 Debian 7 向 CentOS 7 的网站迁移工作

近来某 LNMP 生产环境的网站需要迁移服务器,比较麻烦的是目标服务器还是我不怎么熟悉的 CentOS 7 ,关于 cent7 做出的一系列改动让我十分的头疼,其一是 systemd 管理的服务,其二是 MySQL 被 MariaDB 代替,还有就是一系列软件包的替换比如 iptables  换成了 firewalld 等,这篇文章作为整个迁移过程的一个整理,记录一些需要注意的地方。

安装 LNMP 环境

由于 CentOS base 源里的包很少,首先添加 EPEL 源(个人常用的 USTC Mirror 没有 EPEL7 ):

安装 Nginx(yum 每次安装前都会自动同步源,不需要类似 apt-get update 的操作,yum update 是升级所有包,对应 apt-get upgrade)。


安装 MySQL 的时候需要注意无论是 EPEL 源还是 Base 源里都没有 MySQL 包,将提示“没有可用软件包 mysql-community-server-5.6.25-2.el7.x86_64 错误:无须任何处理”,对应的是 MariaDB ,虽然说完全兼容,嘛我还是稳妥起见安装正宗的 MySQL。

通过 rpm 添加 MySQL Server 的源并导入,更新 yum 缓存:

之后会发现 /etc/yum.repos.d 目录下出现了 mysql-community.repo 文件,现在 yum 可以直接安装 MySQL 了(版本号请自行注意替换为当前的最新版,参数 -y 是防止出现安装前 yum 询问 Is this ok [y/d/N] 需要手动确认的麻烦):

启动 MySQL 后才会生成默认的配置文件和存储目录

可能是尊重习惯起见, CentOS 7 保留 System-V 的服务管理方式,实际上是做了重定向,如果你使用旧版本的服务控制命令你会看到:

另外,与 Debian 系在安装的时候设定 root 密码不同的是,CentOS 默认安装的 MySQL 是没有 root 密码的,直接空密码回车即可登入:

手动更换 root 密码:


安装 PHP-FPM 和 MySQL 扩展(在迁移测试中遇到了页面错误,和开发人员沟通后发现是缺少 PHP 扩展) :

需要注意的是 CentOS 7 通过 yum 安装的 PHP-FPM 默认使用的是 TCP 监听也就是127.0.0.1:9000而不是使用更加广泛且速度更快的 Unix socket,需要修改 /etc/php-fpm.d/www.conf 中

修改为:

启动 PHP


迁移数据和配置

使用 tar 对网站目录进行打包可以保证文件属主权限的完整性,但是数据较多时耗时较大,可以直接使用 scp 或者 rsync 进行数据复制,在目的主机进行 chmod 和 chown,CentOS 的 nginx 用户名和组都是 nginx,Debian 系默认用户名和组是 www-data:

注意使用scp 传输文件夹需要参数 -r 否则将报错 not a regular file,chown 需要参数 -R 进行递归,否则只改变最上层的属主。


一个基本的 PHP 网站涉及到的配置主要有 nginx 配置(或者其他 Web Server )、php.ini 配置、所需数据库密码和权限。

nginx 配置基本规则是一个 server 区块对应一个虚拟 host,其中主要配置项是listen IP:Port 、监听主机名 server_name、网站根目录 root、主页文件 index 、fastcgi 处理、日志路径 access_log 和 error_log 等。

CentOS 和 Debian 的 nginx 文件可以通用,注意 CentOS 的 nginx 目录在/etc/nginx/conf.d/而不是 Debian默认的/etc/nginx/sites-enabled和/etc/nginx/sites-available,注意 fastcgi 环境是否和源主机完全相同,比如刚才提到过的 CentOS 默认的 PHP 是不监听 socket 的,不经修改照搬 fastcgi_pass unix:/var/run/php5-fpm.sock 就会出错。 重读 nginx 配置:


 

在源主机上导出 MySQL 用户表(也可以直接新建用户单独赋权,MySQL 语句操作参见这里):

回车输入数据库用户密码,将 SQL 文件传到目的服务器

导入两次 SQL,第一次是导入源主机 mysql 表以再现 MySQL 用户组和权限(如果是单独生成用户赋权可以无视这一步),第二次才是导入网站的数据库:

重启 MySQL 服务检查是否出错,我在此前尝试过直接导出 MySQL 的数据库目录(Debian 默认是/var/lib/mysql/)遇到了 mysqld 无法启动的问题,在全新安装的 Cent7 虚拟机上测试却没有问题,可能是 MySQL 的缓存导致的。最后避免未知的问题还是采用了导出 SQL 的方法:


修改/etc/php.ini(Debian 下是/etc/php5/fpm/php.ini),主要是上传文件相关的参数调整需要一致,如 max_execution_time 、post_max_size、upload_max_filesize、max_file_uploads 等,重读配置文件:

功能测试

修改本地 hosts 到新服务器,访问网站进行测试,主要测试网站显示是否正常,功能是否完整,数据是否丢失。CentOS 服务器可能遇到的问题有:

1,无法访问,症状表现为浏览器进度卡住。

原因:防火墙开启且策略为过滤

解决:关掉 firewalld (不想关可以自行查找 firewalld 相关配置,由于信息中心把端口封的差不多了,加上 denyhost 防护 SSH 端口,基本没必要再使用软件防火墙所以我没开)

2,提示错误403,网站目录属主和权限都正常,但是默认的/usr/share/nginx/html/index.html可以访问

原因:selinux 默认开启,如果自己定义了网站根目录就会被阻止

解决:编辑/etc/selinux/config,将 SELINUX=enforced 改为 SELINUX=disabled

修改 DNS 解析

测试正常后,停止原网站的服务,转移网站根目录(或者修改 nginx 配置里的 root 路径),建立页面显示网站维护中, 修改 DNS 解析,启动新服务器的 nginx 并监听 IP,为了防止 DNS 缓存刷新慢的访问者,在源服务器的 nginx 中做301跳转:

新服务器中

DNS 解析一般在最晚一两天内就会完成递归刷新,届时可以不在新服务器上监听 IP,关于 nginx 监听的规则参见这里

后记

这次迁移是第一次负责生产环境的网站迁移,由于对 CentOS 不熟悉,走了很多弯路,自认为效率奇差,感觉以后有必要改善一下学习的时间安排,另外加上没有经验,也不知道这样的操作有哪里做的不妥当,仅当自己学习的笔记,参考请慎重。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.