我是如何将WordPress网站迁移到新主机上的

114 阅读9分钟

Text editor on a browser, in blue

你是否曾经需要将一个WordPress网站迁移到一个新的主机上?我做过几次,发现这个过程很简单。当然,我在做大多数事情时都不使用推荐的方法,这次也不例外,我使用的是简单的方法,这也是我推荐的方法。

这种迁移是非破坏性的,所以,如果因为任何原因需要恢复到原来的服务器,也很简单。

WordPress网站的组成部分

运行一个基于WordPress的网站需要三个主要组件。WordPress本身,一个网站服务器,如Apache(我使用的),以及MariaDB。MariaDB是MySQL的一个分支,在功能上是等同的。

有很多网站服务器,但我更喜欢Apache,因为我已经使用它很久了。你可能需要调整我在这里使用的Apache配置,以适应你使用的任何网络服务器。

原始设置

我使用一台Linux主机作为我的网络的防火墙和路由器。网络服务器是我网络内部的另一台主机。我的内部网络使用过去被称为C类专用网络地址范围,但在无类互联网域名路由(CIDR)方法中,它被简单地称为192.168.0.0/24。

对于防火墙,我使用了非常简单的IPTables,比起复杂得多的firewalld ,我更喜欢它。该防火墙配置中的一行将80端口(HTTP)的传入数据包发送到网络服务器。正如你在注释中所看到的,我在/etc/sysconfig/iptables 文件中设置了规则,将其他入站服务器连接转发到同一服务器的相应端口。

# Reroute ports for inbound connections to the appropriate web/email/etc server.
# HTTPD goes to 192.168.0.75
-A PREROUTING -d 45.20.209.41/255.255.255.248 -p tcp -m tcp --dport 80 \
  -j DNAT --to-destination 192.168.0.75:80

我使用命名的虚拟主机来设置我的原始Apache网络服务器,因为我从这一个HTTPD实例中提供多个网站。使用命名的虚拟主机配置方法总是一个好主意,因为像我一样,你可能会决定以后再托管更多的网站,而这个过程让你更容易做到。

/etc/httpd/conf/httpd.conf ,要移动的网站的虚拟主机段看起来就像下面这个。在这个节里没有IP地址,所以它不需要在新的服务器上进行修改。

<VirtualHost *:80>
   ServerName www.website1.org
   ServerAlias server.org
DocumentRoot "/var/website1/html"
   ErrorLog "logs/error_log"
   ServerAdmin me@website1.org
 
<Directory "/var/website1/html">
      Options Indexes FollowSymLinks
 
AllowOverride None
      Require all granted
 
</Directory>
</VirtualHost>

靠近httpd.conf 文件顶部的Listen 指令在迁移前是这样的。这是该服务器的实际IP私有地址,而不是公共IP地址。

Listen 192.168.0.75:80

你需要在新主机上改变Listen IP地址。

准备工作

准备工作可以通过三个步骤来完成。

  • 安装服务。
  • 配置防火墙。
  • 配置Webserver。

安装Apache和MariaDB

如果你的新服务器上还没有Apache和MariaDB,请安装它们。没有必要安装WordPress。

dnf -y install httpd mariadb

新服务器的防火墙配置

确保新服务器上的防火墙允许80端口。你在你所有的电脑上都有防火墙,对吗?大多数现代发行版使用的初始设置包括一个防火墙,它阻止所有进入的流量,以确保更高的安全水平。

下面片段中的第一行可能已经是你的IPTables或其他基于netfilter的防火墙的一部分。它识别已经被确认为来自可接受来源的入站数据包,并绕过额外的INPUT过滤规则,从而节省时间和CPU周期。该片段的最后一行识别了80端口的HTTPD的新入站连接,并接受了它们。

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
<snip>
# HTTP
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

下面的样本/etc/sysconfig/iptables 文件是一个最小的IPTables规则集的例子,它允许SSH(端口22)和HTTPD(端口80)上的传入连接。

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# SSHD
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# HTTP
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# Final disposition for unmatched packets
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

在我的新服务器主机上,我所需要做的就是在/etc/sysconfig/iptables 文件中的防火墙规则中添加上述片段中的最后一行,然后重新加载修改后的规则集。

iptables-restore /etc/sysconfig/iptables

目前大多数基于Red Hat的发行版,如Fedora,都使用firewalld 。我不使用它,因为我发现它远比家庭或中小型企业等使用情况所需的复杂得多。要将入站端口80添加到firewalld ,我建议你参考Firewalld网页

你的防火墙和它的配置细节可能与这些不同,但其目的是允许新的Web服务器的80端口的HTTPD的入站连接。

HTTPD的配置

/etc/httpd/conf/httpd.conf 文件中配置HTTPD。在Listen stanza中设置IP地址,如下图所示。我的新Web服务器的IP地址是192.168.0.125。

Listen 192.168.0.125:80

复制被转移的网站的VirtualHost节,并将其粘贴在新服务器的httpd.conf 文件的末尾。

迁移

只有两组数据需要被转移到新的服务器上--数据库本身和网站目录结构。创建这两个目录的tar 档案。

cd /var ; tar -cvf /tmp/website.tar website1/cd /var/lib ; tar -cvf /tmp/database.tar mysql/

把这些压缩包复制到新的服务器上。我通常把这样的文件存放在/tmp ,这就是它的作用。在新的服务器上运行下面的命令,将文件从tar档案中提取到正确的目录中。

cd /var ; tar -xvf /tmp/website.tarcd /var/lib ; tar -xvf /tmp/database.tar

所有的WordPress文件都包含在/var/website1 ,所以它们不需要在新服务器上安装。WordPress的安装程序不需要在新服务器上执行。

这个目录是需要移到新服务器上的全部内容。

在进行切换之前的最后一步是启动(或重启)mysqldhttpd 服务守护程序。WordPress不是一个服务,所以它不作为一个守护程序启动。

systemctl start mysqld ; systemctl start httpd

你应该在启动这些服务后检查它们的状态。

systemctl status mysqld
 mariadb.service - MariaDB 10.5 database server
    Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
    Active: active (running) since Sat 2021-08-21 14:03:44 EDT; 4 days ago
        Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
   Process: 251783 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS)
   Process: 251805 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS)
   Process: 251856 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS)
 Main PID: 251841 (mariadbd)
      Status: "Taking your SQL requests now..."
      Tasks: 15 (limit: 19003)
    Memory: 131.8M
        CPU: 1min 31.793s
    CGroup: /system.slice/mariadb.service
└─251841 /usr/libexec/mariadbd --basedir=/usr
Aug 21 14:03:43 simba.stmarks-ral.org systemd[1]: Starting MariaDB 10.5 database server...
Aug 21 14:03:43 simba.stmarks-ral.org mariadb-prepare-db-dir[251805]: Database MariaDB is probably initialized in /var/lib/mysql already, n>
Aug 21 14:03:43 simba.stmarks-ral.org mariadb-prepare-db-dir[251805]: If this is not the case, make sure the /var/lib/mysql is empty before>
Aug 21 14:03:44 simba.stmarks-ral.org mariadbd[251841]: 2021-08-21 14:03:44 0 [Note] /usr/libexec/mariadbd (mysqld 10.5.11-MariaDB) startin>
Aug 21 14:03:44 simba.stmarks-ral.org systemd[1]: Started MariaDB 10.5 database server.
systemctl status httpd
 httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Drop-In: /usr/lib/systemd/system/httpd.service.d
└─php-fpm.conf
      Active: active (running) since Sat 2021-08-21 14:08:39 EDT; 4 days ago
        Docs: man:httpd.service(8)
   Main PID: 252458 (httpd)
      Status: "Total requests: 10340; Idle/Busy workers 100/0;Requests/sec: 0.0294; Bytes served/sec: 616 B/sec"
        Tasks: 278 (limit: 19003)
      Memory: 44.7M
        CPU: 2min 31.603s
   CGroup: /system.slice/httpd.service
├─252458 /usr/sbin/httpd -DFOREGROUND
├─252459 /usr/sbin/httpd -DFOREGROUND
├─252460 /usr/sbin/httpd -DFOREGROUND
├─252461 /usr/sbin/httpd -DFOREGROUND
├─252462 /usr/sbin/httpd -DFOREGROUND
└─252676 /usr/sbin/httpd -DFOREGROUND
Aug 21 14:08:39 simba.stmarks-ral.org systemd[1]: Starting The Apache HTTP Server...
Aug 21 14:08:39 simba.stmarks-ral.org httpd[252458]: AH00112: Warning: DocumentRoot [/var/teststmarks-ral/html] does not exist
Aug 21 14:08:39 simba.stmarks-ral.org httpd[252458]: Server configured, listening on: port 80
Aug 21 14:08:39 simba.stmarks-ral.org systemd[1]: Started The Apache HTTP Server.

进行最后的切换

现在,所需的服务已经启动并运行,你可以在/etc/sysconfig/iptables 文件中把HTTPD的防火墙规则改为如下。

-A PREROUTING -d 45.20.209.41/255.255.255.248 -p tcp -m tcp --dport 80 \
  -j DNAT --to-destination 192.168.0.125:80

然后重新加载IPTables规则集。

iptables-restore /etc/sysconfig/iptables

由于防火墙主机中的防火墙规则,没有必要改变外部DNS条目以指向新的服务器。如果你使用一个内部的DNS服务器,你将需要在你的内部DNS数据库中对该A记录进行IP地址变更。如果你不使用内部DNS服务器,请确保在主机的/etc/hosts 文件中为你的新服务器设置正确的地址。

测试和清理

一定要测试你的新设置。首先,关闭旧服务器上的mysqldhttpd 服务。然后用浏览器访问该网站。如果一切工作正常,你可以在旧服务器上禁用mysqldhttpd 。如果出现故障,你可以把IPTables路由规则改回旧服务器,直到问题得到解决。

然后,我把MySQL和HTTPD从旧服务器上删除,以确保它们不会被意外地启动。

总结

这真的就这么简单。不需要在数据库上执行导出或导入程序,因为所有必要的东西都在mysql 目录中复制过来了。你可能需要处理导出/导入程序的唯一原因是,在同一个MariaDB实例中,除了网站或站点的数据库之外,还有一些你不希望复制到新服务器的数据库。

迁移由旧服务器提供服务的其他网站也很容易。所有其他网站所需的数据库都已经和MariaDB一起转移了。只需要把/var/website 目录移到新的服务器上,添加适当的虚拟主机段,并重新启动HTTPD。

我已经多次使用这个程序将一个网站从一个服务器迁移到另一个服务器,而且每次都很顺利。