前言

不知道有没有人发现,这几天本博客一直在抽风,不是彻底打不开就是看不了文章,原因其实很简单,这几天我在忙着迁移博客。

这个博客已经在vultr的服务器上运行了2年左右了,由于这家VPS运营商被广大天朝人民玩坏了,大量IP段被墙,导致我这个IP也被强行限制了速度,即使嵌套了CDN也没有好转,甚至让我不得不挂着代理开网站写博客(F**k U G*W)。

所以我被迫换了运营商,将数据迁移到新服务器上,本来其实服务的搭建和数据的迁移也不是第一次了,最多个把小时就能完成。

不过我步子迈大了一些扯到了蛋,直接从熟悉的CentOS7系统换成了Ubuntu18.04,建站三件套MySQL(MariaDB)、Apache(httpd)、PHP也换成了MySQL、Nginx、PHP,迁移过程中出现了很多问题,不得不一点点研究和解决。

虽然耗费了好几天的时间,最后总算完美完成了迁移,新服务器的速度大幅提升,没白费心血。

迁移过程中的操作和问题也需要记录一下,因此也就有了这篇文章。

正好本篇是建站以来发布的第100篇博客,本文的名字也就回归原点,从零开始建站seasion2,鼓掌(啪啪啪啪啪啪)。

 

安装LNMP

Linux

系统这边可说的并不多,无非是常用的yum install ***换成了apt install ***,虽然apt-get也可以,但是Ubuntu18以后尽量使用apt替代apt-get,可以给出更多的建议安装等提示。

 

Nginx

Nginx的安装也很方便,不过配置就比较麻烦了,后面会细说。

apt install nginx

 

MySQL

MySQL数据库的安装很简单。

apt install mysql-server

安装完以后再运行以下命令,进入MySQL数据库的配置页面,基本就是设置密码,一路yes过去就行了。

mysql_secure_installation

到这一步,虽然已经可以用了,但为了安全起见,还是应该关闭本地无密码登录(输入MySQL运行直接可以进入数据库)。

首先打开/etc/mysql/debian.cnf这个文件,找到安装时的初始用户和密码。

然后使用该用户和密码登录数据库,并执行以下命令:

mysql -u初始用户名 -p
# 在数据库中执行以下操作
update mysql.user set authentication_string=password('自定义密码') where user='root';
update mysql.user set  plugin="mysql_native_password";  
flush privileges;
# 顺便建立个数据库,供WordPress使用
CREATE DATABASE wordpress;
quit

这样,输入mysql运行就会提示密码错误,不能无密码登录了。

 

PHP

PHP采用目前最常用的就是7.2版本,需要安装多个库,其中最重要的就是php-fpm,它是PHP和Nginx交互的桥梁,重要到想要修改php.info以及重启PHP时,都主要和php-fpm有关。

apt install php7.2
apt install php7.2-fpm

# 依赖库
apt install php-json
apt install php-curl
apt install php7.2-mysql
apt install php7.2-cgi
apt install php-mbstring

这里有个小坑,我最早找到的安装文章中并没有提及php-mbstring这个库,但我迁移完成后主页可以正常打开,而文章页面却显示严重错误。

最开始我以为是Nginx没有做伪静态,可设置伪静态后依然如此。并且tag过滤文章以及后台登录都是没有问题的,最后更是发现只要切换了主题就可以正常打开文章页面。

在重新安装Memory主题后问题并没有得到解决,我开始怀疑PHP安装的问题,最终在一行行调试Memory主题的文章页面模板single.php时发现是mb_strimwidth这个函数调用不到,而这个的解决方法就是安装php-mbstring这个库。

因此,如果遇到WordPress页面显示严重错误的时候,可以尝试切换主题,如果切换主题后问题解决,那么八成就是这个主题用到了什么PHP库没有安装,在后台编辑主题那里慢慢调试就会找到答案。

 

Nginx和PHP配置

PHP配置

PHP方面要修改2个文件,分别是/etc/php/7.2/fpm/php.ini/etc/php/7.2/fpm/pool.d/www.conf

没有vim的自行apt install vim安装。

vim /etc/php/7.2/fpm/php.ini
#修改参数如下
cgi.fix_pathinfo=0

vim /etc/php/7.2/fpm/pool.d/www.conf
#修改参数如下
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm.max_children = 50
pm.max_requests = 500
request_terminate_timeout = 0
rlimit_files = 1024

 

Nginx配置

Nginx主要修改一个文件,/etc/nginx/sites-available/default,在server{}内修改或添加以下配置。

vim /etc/nginx/sites-available/default
index index.php index.html index.htm
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
    include fastcgi_params;
}

修改配置后记得重启PHP和Nginx。

systemctl restart nginx
systemctl restart php7.2-fpm

然后在/var/www/html目录(这个是Nginx默认的网站根目录,想改的话可以在上面Nginx的配置文件中更改root这一项)下建立一个index.php文件(建立前记得检查下该路径下有没有什么index.html之类的文件,有的话就删除掉),测试Nginx和PHP是否能够正常运行。

vim /var/www/html/info.php
# 写入以下内容
<?php phpinfo(); ?>

然后在浏览器中输入服务器的IP进行访问,如果能看到一个PHP信息的页面,那就说明配置成功了。

 

其他Nginx配置

下面的配置是用于开放目录方便查找和下载文件以及配置伪静态,仅为个人使用,未必一定会用到。

# 开放目录,可供所有人下载,不要放私人文件
location /files/ {
    autoindex on;
}

# 伪静态
location / {
    try_files $uri $uri/ /index.php?$args;
}

 

网站内容

新建网站

如果想从头开始一个新网站,可以用以下步骤:

# 安装需要的库
apt install curl
apt install unzip

# 下载WordPress源码,并解压移动到Nginx设置的网站根目录
curl https://wordpress.org/latest.zip --output wordpress.zip
unzip wordpress.zip
mv wordpress /var/www/html/

然后在浏览器中打开即可按指引一步步完成网站安装。

 

迁移网站

如果想迁移原服务器的内容到这个新站点,可以在新服务器上使用scp命令,直接从原来的服务器拷贝网站源码或者数据资料到新服务器。

scp root@原服务器IP:原服务器文件路径 新服务器路径

然后输入原服务器的root登录密码即可迅速完成复制迁移。

当然,如果平常有用github备份过网站源码和数据库的话,直接使用git即可拉取到本地,可以参考网站自动备份到github这篇文章。

 

数据库恢复

备份的数据库可以在登录MySQL后,使用以下命令恢复到新的数据库。

# 切换到预先创建好的数据库中,保持数据库名、账户名、密码和原网站数据库一致,否则还得修改wp-config.php
use wordpress
#恢复备份
source /var/www/html/wordpress.sql

 

确认用户和组

网站文件迁移完成之后,记得确认一下网站源码的用户和组,例如我从Apache迁移到Nginx,那么网站源码的用户就得从Apache默认的apache修改为Nginx默认的www-data(这个默认用户可以在Nginx配置文件/etc/nginx/nginx.conf开头处自定义)。

chown -R www-data:www-data /var/www/html/

然后浏览器打开新服务器IP看一下,原来的网站就回来了。

记得将网站域名的解析更换到新服务器上,实现无缝切换,不要像我,太过自信早早地切换了域名解析,又不想认怂,导致网站中断了两天才恢复。

 

SSL配置

到这一步,网站虽然成功上线,但只能通过不安全的http访问,还需要解决SSL证书的问题,让网站能够通过https访问。

这里需要注意一下,根据网络服务的不同,在Apache中,从SSL供应商中申请到的SSL证书有三个文件,分别是cert.key、cert_public.crt、cert_chain.crt,安装方式可以参考从零开始建站

而在Nginx中,申请到的SSL证书只有两个文件,分别为cert.pem、cert.key,配置方式如下。

/etc/nginx/sites-available/default这个配置文件的server{...}段(一定要找准结束的 } ,避免弄错格式,配置失败导致服务启动失败)配置复制一份放在其下方,修改或添加复制那份配置中的以下部分。

listen 443 ssl;

ssl_certificate /etc/nginx/cert/cert.pem;
ssl_certificate_key /etc/nginx/cert/cert.key;

ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

为了让用户使用http登录网站时自动跳转到https,在此配置文件原来的server{...}段(就是开头为listen 80;的那段)中添加以下配置,不要忘记修改完成后重启服务。

rewrite ^(.*)$ https://$host$1;

这样一来,网站就完全迁移成功了。

 

其他设置

解除上传文件大小限制

默认上传文件最大2M这个默认配置可太少了,像前面说的一样,跟CentOS不同,CentOS需要修改/etc/php.ini,而Ubuntu上需要修改/etc/php/7.2/fpm/php.ini

upload_max_filesize = 128M
post_max_size = 128M
max_execution_time = 300

另外,Nginx本身也有限制,只修改PHP配置会导致上传完成后报错“从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页”。Nginx配置的修改如下:

vim /etc/nginx/nginx.conf
client_max_body_size 128m;

修改完成后记得重启PHP服务和Nginx服务。

 

其实迁移过程中,大多数的错误都是配置文件导致的,查到的资料里过时的、错误的配置浪费了我很多时间,希望这篇文章能帮到其他后来者吧。


真正聪明的人,
是观察别人为什么做不好,
然后警惕自己,
尽量不要犯相同的错。

——蔡康永