为什么要写这篇文章
个人站长最怕的一件事,大概就是网站搬家了。服务器到期要续费涨价、机房线路变差、VPS 配置不够用、或者干脆想从虚拟主机换成云服务器,这些情况都逼着我们把整个网站从一台服务器搬到另一台。搬家本身不难,难的是搬完之后网站能无缝访问、数据一条不丢、SEO 排名不受影响。本文以 LNMP 环境下的 Typecho/WordPress 站点为例,完整梳理网站迁移的每一个步骤,包括文件打包、数据库迁移、环境配置、域名解析切换和迁移后的检查清单。
一、迁移前的准备工作
1. 盘点网站构成
动手之前,先弄清楚你的网站由哪几部分组成。一般就三块:一是网站程序文件(PHP 代码、主题、插件),二是数据库(文章、评论、配置),三是上传的附件(图片、文件等)。以常见的 LNMP 环境为例,程序文件通常在 /usr/local/nginx/html 或 /var/www/html,数据库默认叫 typecho 或 wordpress,附件在 /usr/uploads 或 /wp-content/uploads。
2. 记录当前环境信息
记下这些信息,后面配置新服务器要用:
# PHP 版本
php -v
# MySQL 版本
mysql --version
# Nginx 版本
nginx -v
# 数据库名、用户名、密码
# 网站根目录路径3. 检查新服务器
新服务器到手后,先确认系统版本、IP、SSH 端口,并安装好 LNMP 环境。建议使用和旧服务器相同或相近的 PHP、MySQL 版本,避免因版本差异导致程序兼容问题。这一步做好,后面的迁移会顺畅很多。
二、备份旧服务器数据
1. 备份数据库
数据库迁移是整个搬家的核心,数据一条都不能丢。用 mysqldump 导出:
mysqldump -u用户名 -p密码 --single-transaction --routines --triggers 数据库名 > /tmp/数据库名_备份.sql如果你的网站开启了 binlog,也可以把导出时刻之后的 binlog 一起拷贝,不过对个人站点来说,全量导出就够了,关键是选在流量低的时候操作(比如凌晨),并且导出后到停止旧站之前尽量不要再写入数据。
2. 打包网站文件
用 tar 把网站目录打包,保留权限和软链接:
cd /usr/local/nginx/html
tar czf /tmp/网站文件备份.tar.gz --exclude='.git' --exclude='runtime' .如果网站目录里有缓存目录(比如 Typecho 的 /usr/cache、WordPress 的 /wp-content/cache),打包时排除掉,减少体积,反正缓存到新机器上会自动重建。
3. 备份 Nginx 和 PHP 配置
很多站长只备份网站文件,忘了配置,结果到新服务器上怎么都跑不起来。把这几类配置一起备份:
# Nginx 站点配置
cp -r /usr/local/nginx/conf/vhost /tmp/nginx_conf_backup
# 或者 /etc/nginx/sites-available
# PHP-FPM 配置
cp /usr/local/etc/php-fpm.d/www.conf /tmp/php_conf_backup还有 SSL 证书文件(.pem、.key),以及 .htaccess 或 Nginx 的 rewrite 规则,这些最容易漏。
三、传输到新服务器
数据打包好之后,用 scp 或 rsync 传到新服务器:
# scp 简单直接
scp /tmp/数据库名_备份.sql /tmp/网站文件备份.tar.gz root@新服务器IP:/tmp/
# rsync 支持断点续传,大文件更稳
rsync -avzP /tmp/网站文件备份.tar.gz root@新服务器IP:/tmp/如果文件很大,rsync 的 -P 参数(进度 + 断点续传)非常实用。传完之后在两端都用 md5sum 校验一下文件完整性:
md5sum /tmp/网站文件备份.tar.gz四、在新服务器上恢复
1. 创建数据库并导入
# 登录 MySQL
mysql -u root -p
# 创建数据库,字符集和排序规则必须与旧库一致
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# 创建用户并授权
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON 数据库名.* TO '用户名'@'localhost';
FLUSH PRIVILEGES;
EXIT
# 导入数据
mysql -u用户名 -p密码 数据库名 < /tmp/数据库名_备份.sql导入完成后可以快速验证一下数据量:
mysql -u用户名 -p密码 -e "SELECT COUNT(*) FROM typecho_contents;" 数据库名2. 解压网站文件
cd /usr/local/nginx/html
tar xzf /tmp/网站文件备份.tar.gz
chown -R www:www /usr/local/nginx/html # 按你的环境改用户和组
chmod -R 755 /usr/local/nginx/html3. 修改网站配置文件
网站程序里通常保存着数据库连接信息,换环境后必须更新。Typecho 的配置在根目录的 config.inc.php:
// config.inc.php
'db' => array(
'host' => 'localhost',
'user' => '新用户名',
'password' => '新密码',
'database' => '新数据库名',
),WordPress 的配置在 wp-config.php,主要改 DB_NAME、DB_USER、DB_PASSWORD 三项。如果新旧服务器的数据库用户名密码不同,这里一定要改对,否则网站会直接报数据库连接错误。
4. 恢复 Nginx 配置并重载
cp /tmp/nginx_conf_backup/* /usr/local/nginx/conf/vhost/
nginx -t # 先测试配置语法
systemctl reload nginx # 或 nginx -s reload别忘了把域名解析也准备好。如果新服务器还没绑定域名,先在本地 hosts 里指向新 IP 测试:
# 修改本机 /etc/hosts
新服务器IP www.example.com这样可以先用浏览器访问,确认网站功能正常,再切换正式 DNS,实现无缝过渡。
五、切换域名解析
本地测试没问题后,就可以去域名服务商处修改 A 记录,把域名指向新服务器 IP。这里有两个关键点:
第一,提前把旧记录的 TTL 调小(比如从 3600 改成 300),这样切换时解析生效快,减少网站无法访问的时间窗口。
第二,切换 DNS 后不要立刻删掉旧服务器,保留 3 到 7 天作为回退方案。万一新环境有问题,改回 DNS 就能秒级回滚。
六、迁移后的检查清单
DNS 切换完成后,逐项检查以下内容,确认网站真正恢复:
# 1. 网站能否正常访问,页面是否完整
curl -I https://www.example.com
# 2. 文章、图片、附件是否都能打开
curl -I https://www.example.com/usr/uploads/某图片.jpg
# 3. 后台能否登录
# 4. HTTPS 证书是否正常(新服务器要重新签发或迁移证书)
# 5. 伪静态/固定链接是否生效,老链接是否 301 跳转
# 6. 数据库连接是否正常,日志里有没有报错
tail -f /usr/local/nginx/logs/error.log特别提醒:SSL 证书的域名绑定、nginx 配置里的 server_name、root 路径、PHP-FPM 的 socket 路径(比如 unix:/tmp/php-cgi.sock)这几处是最容易出问题的地方,如果网站打开是 502 或 404,优先排查这三项。
七、常见问题与解决办法
1. 网站打不开,显示 502 Bad Gateway
一般是 PHP-FPM 没启动或 socket 路径不匹配。检查:systemctl status php-fpm,并确认 nginx 配置里的 fastcgi_pass 指向的 socket 文件和 php-fpm 实际监听的路径一致。
2. 页面能开但样式全乱、图片不显示
多半是附件路径或固定链接问题。检查站点 URL 配置是否正确,Typecho 可以在后台「设置-基本」里修改站点地址,WordPress 在「设置-常规」里修改。另外确认上传目录权限是 www 用户可写。
3. 中文乱码
数据库导入时字符集没对齐。确保建库时使用 utf8mb4,导入前执行 SET NAMES utf8mb4;,并检查旧库的字符集设置。
4. 后台登录后跳回登录页
一般是 cookie 域或站点地址配置问题,检查数据库里 option 表中的 siteurl/home 字段,以及 config 里的站点地址是否写成了旧地址。
5. 迁移后网站变慢
迁移后性能下降,先别急着怀疑程序。新服务器默认的 PHP-FPM 进程数、MySQL 的 buffer pool 大小可能都是保守配置,需要按新机器的内存重新调优。比如把 php-fpm.conf 里的 pm.max_children 按内存计算调大,把 MySQL 的 innodb_buffer_pool_size 调到物理内存的 50% 到 70%。另外,迁移后第一次全量访问没有缓存,页面生成会偏慢,跑几天等缓存预热之后会恢复正常。
6. 邮件发送失败
有些程序用 PHP 的 mail() 函数发信,新服务器可能没有安装 sendmail/postfix,或者云厂商封了 25 端口。建议改用 SMTP 发信插件,配置好第三方邮箱服务,既稳定又不会进垃圾箱。
八、迁移后的日常检查
正式切换之后的一周内,建议每天看一眼新服务器的运行状态:
# 查看资源占用
top
# 查看磁盘空间
df -h
# 查看 Nginx 错误日志有没有新增报错
tail -f /usr/local/nginx/logs/error.log
# 查看 PHP-FPM 慢日志
tail -f /usr/local/var/log/php-fpm.log同时观察网站访问日志里的异常状态码,比如大量 404 或 500。如果发现某些老链接失效,多半是伪静态规则没迁移完整,对照旧服务器的 nginx 配置逐一补齐。确认稳定运行一周后,就可以把旧服务器上的站点服务停掉,把资源释放出来,整个搬家流程到此才算真正结束。
九、总结
网站搬家看似复杂,其实就是一个标准流程:备份、传输、恢复、切换、验证。把每个环节的检查项列清楚,按部就班执行,一小时以内就能完成。最关键的两点是:数据库要用 mysqldump 完整导出并验证,DNS 切换前先在本地 hosts 里完整测试。只要这两点做到位,搬家基本不会翻车。希望这篇站长搬家实战指南能帮到正在为迁移发愁的你。