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

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

安装 LNMP 环境

由于 CentOS base 源里的包很少,首先添加 EPEL 源(个人常用的 USTC Mirror 没有 EPEL7 ):
yum install epel-release.noarch -y
安装 Nginx(yum 每次安装前都会自动同步源,不需要类似 apt-get update 的操作,yum update 是升级所有包,对应 apt-get upgrade)。
yum install nginx
systemctl start nginx.service


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

通过 rpm 添加 MySQL Server 的源并导入,更新 yum 缓存:
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum makecache

之后会发现 /etc/yum.repos.d 目录下出现了 mysql-community.repo 文件,现在 yum 可以直接安装 MySQL 了(版本号请自行注意替换为当前的最新版,参数 -y 是防止出现安装前 yum 询问 Is this ok [y/d/N] 需要手动确认的麻烦):
yum install mysql-community-server-5.6.25-2.el7.x86_64 -y
启动 MySQL 后才会生成默认的配置文件和存储目录
systemctl start mysql.service
可能是尊重习惯起见, CentOS 7 保留 System-V 的服务管理方式,实际上是做了重定向,如果你使用旧版本的服务控制命令你会看到:
root:~/ : service mysql restart
root:~/ : Redirecting to /bin/systemctl restart mysql.service

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

手动更换 root 密码:
use mysql;
UPDATE user SET password=PASSWORD('xxxx') where user='root';
flush privileges;


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

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


迁移数据和配置

使用 tar 对网站目录进行打包可以保证文件属主权限的完整性,但是数据较多时耗时较大,可以直接使用 scp 或者 rsync 进行数据复制,在目的主机进行 chmod 和 chown,CentOS 的 nginx 用户名和组都是 nginx,Debian 系默认用户名和组是 www-data:
root@源主机 : scp -P [远端 ssh 端口号] -r [本地目录] [远端用户名]@[IP]:[远端目录]
root@目的主机 : chown -R nginx:nginx [目录]

注意使用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 配置:
systemctl reload nginx.service


 

在源主机上导出 MySQL 用户表(也可以直接新建用户单独赋权,MySQL 语句操作参见这里):
root@源主机 : mysqldump -u [数据库用户名] -p [数据库名] > [导出 SQL 文件的路径]

回车输入数据库用户密码,将 SQL 文件传到目的服务器
root@目的主机 : mysql -u [数据库用户名] -p
导入两次 SQL,第一次是导入源主机 mysql 表以再现 MySQL 用户组和权限(如果是单独生成用户赋权可以无视这一步),第二次才是导入网站的数据库:
use [数据库名];
source [SQL 文件路径]/xxx.sql;
flush privileges;

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


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

功能测试

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

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

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

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

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跳转:
server {
listen 80;
server_name [域名];
rewrite ^(.*) http://[新服务器 IP]$1 permanent;
}

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

后记

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


本文链接:https://www.starduster.me/2015/07/25/move-a-website/
本站基于 Creactive Commons BY-NC-SA 4.0 License 允许并欢迎您在注明来源和非商业使用前提下自由地对本文进行复制、分享或基于本文进行创作。
请注意:受限于笔者水平,本站内容可能存在主观臆断或事实错误,文中信息也可能因时间推移而不再准确,在此提醒读者结合自身判断谨慎地采纳。

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据