最近趁着双11入了阿里云,因为腾讯云当时只买了1年试水,现在续费的话实在是遭不住。
需要说明的是,主机、域名都需要ICP备案,所以新买的阿里云又折腾了一番进行备案,万幸的是如果之前备案过域名和主机,只是要添加一台新的主机到原备案的话,审核速度是非常快的,我这里1个工作日就搞定了。
VPS准备好后就需要折腾一下,把腾讯云上的服务搬迁到阿里云了,其它服务倒也不重要,主要还是要先把博客搬过来,以下就是博客搬迁记录。
需要说明的是不同的Linux发行版配置很不一样,这里我原来的腾讯云使用的是CentOS 7.9,阿里云使用的是Ubuntu。
准备新环境
在新服务器上搭建环境前,请先确认Linux发行版版本,不同的LInux发行版安装软件的方式略有不同:
root@icexmoon:~# cat /proc/version
Linux version 5.4.0-89-generic (buildd@lgw01-amd64-044) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #100-Ubuntu SMP Fri Sep 24 14:50:10 UTC 2021
我新的服务器上选择的是Ubuntu 20.04,该版本支持到2025年,应该够用了。
先更新目标服务器上的软件:
apt update
apt upgrade
Apache
安装Apache:
root@icexmoon:~# sudo apt install apache2
Reading package lists... Done
Building dependency tree
...省略
检查Apache运行状态:
root@icexmoon:~# systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-11-05 17:03:37 CST; 1min 10s ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 1533 (apache2)
Tasks: 55 (limit: 2315)
Memory: 5.2M
CGroup: /system.slice/apache2.service
├─1533 /usr/sbin/apache2 -k start
├─1535 /usr/sbin/apache2 -k start
└─1536 /usr/sbin/apache2 -k start
Nov 05 17:03:37 icexmoon.xyz systemd[1]: Starting The Apache HTTP Server...
Nov 05 17:03:37 icexmoon.xyz systemd[1]: Started The Apache HTTP Server.
这里Active: active (running)
表明已经正常运行,而enabled
表明会开机自启动。
安装好Apache后还需要通过ufw
程序在防火墙中放行80
和443
端口:
root@icexmoon:~# ufw app list
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
root@icexmoon:~# ufw app info "Apache Full"
Profile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.
Ports:
80,443/tcp
root@icexmoon:~# ufw allow in "Apache Full"
Rules updated
Rules updated (v6)
实际上真正起作用的是ufw allow in "Apache Full"
命令,这里是启用了ufw
中预设的Apache Full
规则,该规则可以放行80
和443
端口,如果只想放行80
端口,可以使用Apache
这个预设规则。
如果VPS供应商还额外设置了网络安全组策略,则除了设置Linux的软件防火墙,还需要设置VPS的安全组策略,这里我以阿里云为例:
在安全组中选择默认的安全组策略,点击配置规则
:
在入方向页面,点击手动添加,添加一个TCP协议的80
和443
端口,然后点击保存:
现在你可以直接通过主机的IP访问:
但方便起见还是通过域名解析给新服务器分配一个用来测试的域名:
域名解析的配置方式这里不做赘述,可以参考其他文章。
MySQL
安装MySQL:
root@icexmoon:~# apt install mysql-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
...省略
查看MySQL进程状态:
root@icexmoon:~# systemctl status mysql
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-11-05 17:27:44 CST; 9s ago
Main PID: 2734 (mysqld)
Status: "Server is operational"
Tasks: 38 (limit: 2315)
Memory: 354.5M
CGroup: /system.slice/mysql.service
└─2734 /usr/sbin/mysqld
Nov 05 17:27:43 icexmoon.xyz systemd[1]: Starting MySQL Community Server...
Nov 05 17:27:44 icexmoon.xyz systemd[1]: Started MySQL Community Server.
同样的,有active
和enabled
说明安装好了。
安装好MySQL后还需要设置其主密码:
root@icexmoon:~# mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
Please set the password for root here.
New password:
Re-enter new password:
Estimated strength of the password: 50
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) :
...省略
运行该脚本后会依次询问是否启用增强密码插件/密码安全级别/输入密码/确认使用该密码为主密码等,剩余选项输入y
后回车保持默认选项即可。
现在MySQL默认使用auth_socket
验证root
用户,这样我们是无法远程连接数据库的,所以还要修改为密码验证的方式。
先查看当前root
用户的验证方式:
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
输出结果大概是这样的:
可以看到root
的验证方式的确是auth_socket
。
执行以下SQL修改为密码方式:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
需要注意,要将上面的password
替换为你将要设置的root
用户的密码。
如果成功执行SQL的话执行以下SQL提交变更(如果失败,大概率是密码强度不够,应该尝试添加特殊字符):
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
执行以下SQL查看是否变更成功:
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
退出SQL环境:
mysql> exit
Bye
PHP
安装PHP:
root@icexmoon:~# apt install php libapache2-mod-php php-mysql
Reading package lists... Done
Building dependency tree
Reading state information... Done
...省略
为了验证PHP正常安装,可以通过VSCode远程连接主机后在/var/www/html/
目录下添加文件index.php
:
<?php
phpinfo();
?>
关于如何使用VSCode远程连接主机可以阅读。
当然用
shell
命令创建该文件也是可以的,比如vim
或nano
。
然后用浏览器访问ip/index.php
:
迁移数据
万幸的是我有在原来的机器上部署每天自动备份,详情见,所以迁移数据只要把备份迁移过来后解压拷贝到相应目录即可。
WordPress
这里通过XShell将原服务器上的WordPress备份和数据库备份转移到新的服务器上。
先查看压缩包的内容:
root@icexmoon:~/tmp# tar -tzvf 20211105_wordpress.tar.gz | less
var/www/blog2/
var/www/blog2/wp-trackback.php
var/www/blog2/wp-admin/
var/www/blog2/wp-admin/privacy.php
var/www/blog2/wp-admin/user-edit.php
...省略
这里是去除根目录符号的完整目录形式,是可以直接解压缩到根目录下的。不过我选择先解压到当前目录下,再将网站目录复制到目标目录:
root@icexmoon:~/tmp# root@icexmoon:~/tmp# tar -xzvf 20211105_wordpress.tar.gz -C .
var/www/blog2/
var/www/blog2/wp-trackback.php
var/www/blog2/wp-admin/
var/www/blog2/wp-admin/privacy.php
...省略
root@icexmoon:~/tmp# cd var
root@icexmoon:~/tmp/var# ll
total 12
drwxr-xr-x 3 root root 4096 Nov 5 20:33 ./
drwxr-xr-x 3 root root 4096 Nov 5 20:33 ../
drwxr-xr-x 3 root root 4096 Nov 5 20:33 www/
root@icexmoon:~/tmp/var# cd www
root@icexmoon:~/tmp/var/www# ll
total 12
drwxr-xr-x 3 root root 4096 Nov 5 20:33 ./
drwxr-xr-x 3 root root 4096 Nov 5 20:33 ../
drwxr-xr-x 5 root root 4096 Nov 5 03:00 blog2/
root@icexmoon:~/tmp/var/www# cp -ar blog2/ /var/www/blog2
root@icexmoon:~/tmp/var/www# cd /var/www
root@icexmoon:/var/www# ll
total 16
drwxr-xr-x 4 root root 4096 Nov 5 20:35 ./
drwxr-xr-x 12 root root 4096 Nov 5 17:03 ../
drwxr-xr-x 5 root root 4096 Nov 5 03:00 blog2/
drwxr-xr-x 2 root root 4096 Nov 5 18:30 html/
数据库
网站数据这里就OK了,剩下的是数据库,这里可以先查看备份的SQL内容:
root@icexmoon:~/tmp# zcat 20211105_wordpress.sql.gz | less
这里只要创建db后,就可以直接执行SQL进行数据恢复。
先解压缩SQL:
root@icexmoon:~/tmp# cp 20211105_wordpress.sql.gz 20211105_wordpress.sql.gz.bak
root@icexmoon:~/tmp# ll
total 48736
drwxr-xr-x 3 root root 4096 Nov 5 20:49 ./
drwx------ 7 root root 4096 Nov 5 20:30 ../
-rw-r--r-- 1 root root 1905892 Nov 5 20:25 20211105_wordpress.sql.gz
-rw-r--r-- 1 root root 1905892 Nov 5 20:49 20211105_wordpress.sql.gz.bak
-rw-r--r-- 1 root root 46074783 Nov 5 20:25 20211105_wordpress.tar.gz
drwxr-xr-x 3 root root 4096 Nov 5 20:33 var/
root@icexmoon:~/tmp# gzip -d 20211105_wordpress.sql.gz
root@icexmoon:~/tmp# ll
total 57220
drwxr-xr-x 3 root root 4096 Nov 5 20:49 ./
drwx------ 7 root root 4096 Nov 5 20:30 ../
-rw-r--r-- 1 root root 10592344 Nov 5 20:25 20211105_wordpress.sql
-rw-r--r-- 1 root root 1905892 Nov 5 20:49 20211105_wordpress.sql.gz.bak
-rw-r--r-- 1 root root 46074783 Nov 5 20:25 20211105_wordpress.tar.gz
drwxr-xr-x 3 root root 4096 Nov 5 20:33 var/
因为使用
gzip
解压会自动删除原文件,所以在压缩前先备份了一份。
现在登录mysql,并执行SQL文件。先用密码登录:
root@icexmoon:~# mysql --password
查看已有db:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
创建一个和原来服务器上命名相同的db:
mysql> create database wordpress2;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress2 |
+--------------------+
5 rows in set (0.00 sec)
切换数据库:
mysql> use wordpress2
导入SQL:
mysql> source /root/tmp/20211105_wordpress.sql
退出:
mysql> exit
Bye
Apache
借助工具拷贝Apache的VHost配置文件到新的服务器,Apache2的VHost的配置文件应当存放在/etc/apache2/sites-enabled
。
开启Apache2的SSL和Rewrite模块:
ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load
systemctl restart apache2
在DNS解析设置中将原来的域名指向新的服务器。
刷新本地电脑的DNS解析缓存,Windows电脑需要执行ipconfig /flushdns
。
一切正常的话,通过原来的host就可以访问新的主机了,可以通过F12开发者工具查看IP进行确认。
PHP
登录后台时发现WP的验证码插件不能正常工作,开启Apache日志,发现是因为插件调用的PHP函数报错:
Uncaught Error: Call to undefined function imagecreate() in xxx
Bing了一下问题的原因是缺少相关的PHP扩展php-gd
。
默认的Ubuntu仓库是没有该PHP扩展的,所以需要安装其它仓库。
先安装add-apt-repository
工具以更方便地添加仓库:
apt-get install software-properties-common
添加仓库:
#add-apt-repository ppa:ondrej/php
安装缺失的PHP扩展功能:
#apt-get update
root@icexmoon:/var/logs# apt search php7 | grep gd
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
php7.0-gd/focal 7.0.33-55+ubuntu20.04.1+deb.sury.org+1 amd64
php7.1-gd/focal 7.1.33-42+ubuntu20.04.1+deb.sury.org+1 amd64
php7.2-gd/focal 7.2.34-26+ubuntu20.04.1+deb.sury.org+1 amd64
php7.3-gd/focal 7.3.31-2+ubuntu20.04.1+deb.sury.org+1 amd64
php7.4-gd/focal 7.4.25-1+ubuntu20.04.1+deb.sury.org+1 amd64
root@icexmoon:/var/logs# apt install php7.4-gd
root@icexmoon:/var/logs# systemctl restart apache2
刷新页面后发现可以正常显示验证码了。
证书
虽然直接复制老服务器上的证书过去也是可以暂时使用的,但是还是在新服务器上直接申请比较方便。
同样的,默认的Ubuntu仓库是没有证书申请工具的,需要添加相应仓库:
add-apt-repository ppa:certbot/certbot
apt update
安装证书工具:
apt install python3-certbot-apache
申请证书:
certbot certonly --apache --email icexmoon@qq.com -d www.blog.icexmoon.xyz -d blog.icexmoon.xyz -d icexmoon.xyz -d www.icexmoon.xyz
需要确保申请的证书关联的域名都可以被正确解析到当前的Linux主机,否则会失败。短时间内失败次数过多可能会无法再次尝试,需要等一段时间后再试。
如果一级域名,如
icexmoon.xyz
申请证书时检测失败,需要在apache2的默认VHost文件/etc/apache2/sites-enabled
中添加一级域名信息:ServerName www.icexmoon.xyz ServerAlias icexmoon.xyz如果需要的话,也可以顺便添加上一级域名的404页面:
ErrorDocument 404 /404.html
添加证书自动更新:
用crontab -e
命令打开crontab
,添加以下自动执行任务:
0 0 1 * * /usr/bin/certbot renew --force-renewal
大功告成!
文章评论