如何将 WordPress 网站迁移到新主机

使用这种简单的方法迁移网站并管理防火墙配置。
40 位读者喜欢这篇文章。
Text editor on a browser, in blue

您是否曾经需要将 WordPress 网站迁移到新主机?我已经做过几次了,发现这个过程非常容易。当然,我做大多数事情都不使用推荐的方法,这次也不例外——我使用简单的方法,这也是我推荐的方法。

这种迁移是非破坏性的,因此如果出于任何原因需要恢复到原始服务器,也很容易。

WordPress 网站的组成部分

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

有很多 Web 服务器,但我更喜欢 Apache,因为我已经使用它很长时间了。您可能需要根据您正在使用的 Web 服务器调整我在此处使用的 Apache 配置。

原始设置

我使用一台 Linux 主机作为我网络的防火墙和路由器。Web 服务器是我网络内部的另一台主机。我的内部网络使用曾经被称为 C 类私有网络地址范围的地址,但在 无类别域间路由 (CIDR) 方法中,它只是简单地称为 192.168.0.0/24。

对于防火墙,我使用非常简单的 IPTables,我更喜欢它而不是更复杂的 firewalld。此防火墙配置中的一行将端口 80 (HTTP) 上的传入数据包发送到 Web 服务器。正如您在注释中看到的那样,我放置了规则,将其他入站服务器连接转发到 /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 Web 服务器,因为我从这一个 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 地址。

准备工作

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

  • 安装服务。
  • 配置防火墙。
  • 配置 Web 服务器。

安装 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 节中设置 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/

将这些 tarball 复制到新服务器。我通常将此类文件存储在 /tmp 中,这就是它的用途。在新服务器上运行以下命令以将文件从 tar 存档解压缩到正确的目录中。

cd /var ; tar -xvf /tmp/website.tar
cd /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.

进行最终切换

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

-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。

我已经多次使用此过程将网站从一台服务器迁移到另一台服务器,并且它总是运行良好。

下一步阅读内容
标签
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。他自 1996 年以来一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是“系统管理员 Linux 哲学”的坚定拥护者和传播者。

评论已关闭。

Creative Commons 许可协议本作品根据 Creative Commons 署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.