前言
不知道有没有人发现,这几天本博客一直在抽风,不是彻底打不开就是看不了文章,原因其实很简单,这几天我在忙着迁移博客。
这个博客已经在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服务。
其实迁移过程中,大多数的错误都是配置文件导致的,查到的资料里过时的、错误的配置浪费了我很多时间,希望这篇文章能帮到其他后来者吧。
真正聪明的人,
是观察别人为什么做不好,
然后警惕自己,
尽量不要犯相同的错。
——蔡康永
评论
还没有任何评论,你来说两句吧!