个人站长几乎都会遇到搬家这件事:低配服务器到期要换更高配置的机器、国内服务器备案流程走完要把网站迁回国内、或者单纯觉得现在的服务商太贵想换一家。WordPress 网站搬家的本质就两件事:把网站文件完整搬过去,把数据库完整搬过去,再把两者之间的连接关系改对。听起来简单,但实际操作里坑非常多,尤其是换域名的时候,数据库里几百条旧域名链接改不干净,会导致图片全挂、内链全错。这篇文章把我搬家十几次总结出来的完整流程和所有坑写清楚。
一、搬家前的准备
搬家前先把新旧两台服务器的环境对齐,能省掉后面一半的麻烦。建议在新服务器上先装好和旧服务器相同版本的 PHP 和 MySQL,WordPress 对 PHP 版本比较敏感,比如旧服务器 PHP 7.4、新服务器 PHP 8.2,有些老主题和老插件可能会报错,提前装成相同版本最稳妥。
然后在新服务器上把 Nginx 或者 Apache 的站点配置、域名解析都准备好,域名先解析到新服务器并确认能访问一个空的测试页。这个步骤的目的很简单:搬家过程要尽量短,短到访客几乎感觉不到变化。
准备好之后,记下旧服务器的 WordPress 安装路径,一般就是 /var/www/html 或者 /www/wwwroot/你的域名,后面打包要用。
二、打包网站文件
网站文件包括 WordPress 程序、主题、插件、上传的图片附件,以及根目录下的 .htaccess 或者 Nginx 伪静态配置。用 tar 打包最快:
cd /var/www
tar -czf wordpress-backup.tar.gz html如果网站文件特别大(比如附件有几十 GB),可以先排除缓存目录和日志目录,比如 wp-content/cache 这类可以重建的目录:
tar -czf wordpress-backup.tar.gz --exclude='html/wp-content/cache' --exclude='html/wp-content/uploads/backup' html打包完成后,把压缩包下载到本地或者直接用 scp/rsync 推到新服务器:
scp wordpress-backup.tar.gz root@新服务器IP:/var/www/在新服务器上解压到对应目录:
cd /var/www
tar -xzf wordpress-backup.tar.gz解压之后要立刻处理文件权限。WordPress 对目录权限有明确要求:目录 755、文件 644,wp-content 下的上传目录要允许 PHP 写入。用这两条命令一次搞定:
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/htmlwww-data 是 Debian/Ubuntu 上 Nginx 和 PHP-FPM 默认的运行用户,CentOS 上通常是 nginx 或者 apache,要根据自己环境的实际用户来,权限给错会导致上传图片失败、插件无法更新、页面 500 等一连串问题。
三、备份和导入数据库
数据库备份用 mysqldump,先确认数据库名和账号:
grep DB_NAME /var/www/html/wp-config.php
grep DB_USER /var/www/html/wp-config.php
grep DB_PASSWORD /var/www/html/wp-config.php然后导出整个数据库:
mysqldump -u 数据库用户名 -p 数据库名 > wordpress-db.sql这里有个关键参数值得加:--single-transaction 可以在 InnoDB 表上实现一致性快照,导出过程中网站还在运行也不会产生不一致的备份:
mysqldump --single-transaction -u 用户名 -p 数据库名 > wordpress-db.sql把 SQL 文件传到新服务器后导入:
mysql -u 新数据库用户名 -p 新数据库名 < wordpress-db.sql导入之前,先在新服务器上把数据库和用户建好,并给用户授予对应权限:
CREATE DATABASE wpdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON wpdb.* TO 'wpuser'@'localhost' IDENTIFIED BY '你的密码';
FLUSH PRIVILEGES;utf8mb4 字符集一定要选对,不然文章里的 emoji 表情会变成问号,这是中文站长最容易忽略的坑。
四、修改 wp-config.php
数据库导入完成后,修改新服务器上的 wp-config.php,把数据库名、用户名、密码改成新服务器的:
define('DB_NAME', '新数据库名');
define('DB_USER', '新数据库用户');
define('DB_PASSWORD', '新数据库密码');
define('DB_HOST', 'localhost');如果网站要换域名,这里还有个容易被忽略的问题:WordPress 的站点地址和首页地址存在数据库的 wp_options 表里,不是配置文件里,所以光改 wp-config.php 是不够的,下一步必须处理数据库里的域名。
另外提醒一句,如果新旧服务器的数据库前缀不同(比如旧的 wp_ 新的 custom_),wp-config.php 里的 $table_prefix 也要同步修改,否则网站会直接报错找不到数据表。
五、换域名的数据库替换操作
不换域名的情况下,改完 wp-config.php,把 Nginx 指向新目录,网站基本就能跑了。但换域名的话,必须处理数据库里所有写死旧域名的位置,包括 wp_options 表里的 siteurl 和 home、文章内容里的图片链接、自定义字段、导航菜单等等。
最推荐的方式是登录新服务器后用 WP-CLI 的 search-replace 命令,它比手动改数据库安全得多,而且能正确处理序列化数据:
wp search-replace 'http://旧域名' 'https://新域名' --all-tables --precise执行之前先确认 WP-CLI 装好了:
wp --info如果没有 WP-CLI,可以先用 SQL 直接改 wp_options 里最关键的两条,让后台先能访问:
UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name = 'home';但注意,直接 UPDATE 这种方式处理不了文章内容里的旧域名链接,也处理不了序列化数据,所以最后还是要用 WP-CLI 或者专门的迁移插件做全量替换。替换完记得验证:
wp search-replace '旧域名' '新域名' --all-tables --dry-run--dry-run 只统计不执行,先看会有多少条记录被替换,心里有数再正式执行。执行完多刷新几个页面,重点看图片、内链、主题样式有没有残留的旧域名地址。
六、验证与收尾
全部配置完成后,按下面的清单逐项验证,缺一项都可能导致线上事故:
第一,访问新域名首页,确认页面正常加载,没有 500 错误。如果 500,先看 Nginx 错误日志和 PHP 错误日志:
tail -f /var/log/nginx/error.log
tail -f /var/log/php-fpm/error.log第二,登录后台,确认能正常进入 wp-admin,检查主题和插件列表,看有没有报错的。进后台之前,如果前台页面样式错乱,很可能是伪静态规则没配置,检查 Nginx 的 WordPress rewrite 规则:
location / {
try_files $uri $uri/ /index.php?$args;
}第三,发一篇测试文章带图片,确认上传功能正常,图片能显示。检查上传目录权限,这是搬家后最常见的故障点。
第四,确认网站链接格式没变,点开几个文章页和分类页,检查内链、导航、图片地址。
第五,测试搜索功能、评论功能、邮件发送,如果网站接入了第三方服务,比如 SMTP 邮件、支付接口,也要把回调地址重新配置一遍。
第六,确认无误后,把域名的 TTL 改小(比如 300 秒),然后修改解析指向新服务器。等解析生效后,用新服务器 IP 直连测试和域名访问测试都做一遍,确认稳定后再把旧服务器上的网站停止。
第七,换域名的话还有一件 SEO 上的大事:让搜索引擎知道网站搬家了。在百度站长平台和 Google Search Console 里把站点地址改成新域名,提交新的 sitemap,然后给旧域名配置 301 跳转,把所有旧 URL 重定向到新域名对应的页面。这一步不做,辛辛苦苦积累的收录和外链权重全部归零,很多站长搬家后流量暴跌就是这个原因。
第八,别忘了把旧服务器上的定时任务清理掉。很多站长在旧服务器上配了数据库备份脚本、日志清理脚本,搬家后这些 crontab 还在跑,如果备份脚本还在往旧服务器写文件,等于白占资源,如果脚本里写死了旧数据库密码,还可能有安全隐患。打开 crontab -l 检查一遍,把不再需要的任务全部删掉。
如果觉得手动操作太繁琐,也可以用 UpdraftPlus、Duplicator 这类搬家插件,插件的好处是自动打包文件和数据库、自动处理序列化数据替换,适合不太熟悉命令行的站长;缺点是网站特别大的时候容易超时,而且插件本身占用资源。我的建议是:小站用插件省事,大站用命令行可控,两种方式走完都要按上面的清单验证一遍。
整个搬家的关键就四个字:先备后动。文件备份、数据库备份都做好,新环境完全验证通过之后才切换解析,任何一步出问题都可以回滚到旧服务器。按照这套流程,个人站长完全可以自己完成 WordPress 搬家,不用花几百块请人代操作,而且整个过程可控、心里有底。