网站迁移是一项需要谨慎操作的技术工作,稍有不慎可能导致网站无法访问、数据丢失或SEO排名下降。本教程将从零开始,手把手教你完成网站从旧服务器到新服务器的完整迁移,涵盖源码、数据库、域名解析和后续检查,确保迁移过程平稳无差错。
## 前置准备
在开始操作前,你需要准备以下工具和信息:
1. **新服务器环境**:确保新服务器已安装好与旧服务器相同或兼容的Web环境(如Nginx/Apache、PHP版本、MySQL/MariaDB)。建议使用宝塔面板、LNMP一键包或云服务商自带镜像。
2. **SSH客户端**:推荐使用Xshell、FinalShell或系统自带的终端(Mac/Linux)。用于连接服务器执行命令。
3. **FTP/SFTP工具**:如FileZilla、WinSCP,用于传输网站源码文件。
4. **数据库管理工具**:如phpMyAdmin、Navicat或命令行工具,用于导出和导入数据库。
5. **域名管理权限**:你需要能登录域名DNS解析控制台(如阿里云、腾讯云、Cloudflare),修改A记录或CNAME。
6. **旧服务器登录信息**:IP地址、SSH端口(默认22)、用户名(通常是root)、密码或密钥。
7. **新服务器登录信息**:同上。
8. **网站备份**:强烈建议在迁移前对旧服务器做一次完整备份,包括所有文件和数据库。如果迁移中出现问题,可以快速回滚。
**重要提示**:迁移过程中旧服务器不要关闭或修改任何配置,直到新服务器完全正常运行且域名解析生效。迁移完成后,保留旧服务器至少24小时作为应急回退。
## 分步操作步骤
### 1. 打包并下载旧服务器源码文件
登录旧服务器,将网站根目录下的所有文件打包成一个压缩包。这样做比直接逐文件下载更快,且能保留文件权限和目录结构。
- 使用SSH连接旧服务器。打开终端或SSH客户端,输入以下命令(替换为你的服务器IP):
```
ssh root@旧服务器IP
```
输入密码或使用密钥认证登录。
- 进入网站根目录。常见的目录有`/var/www/html`、`/home/wwwroot`、`/www/wwwroot`等。使用`ls`命令确认目录内容:
```
cd /var/www/html
ls -la
```
你应该能看到网站的文件,如`index.php`、`wp-config.php`(WordPress)等。
- 打包整个目录。使用`tar`命令,将当前目录下的所有文件打包成一个`.tar.gz`文件,并排除不需要的缓存或日志(如`runtime`、`cache`文件夹):
```
tar -czf /tmp/site_backup.tar.gz --exclude='runtime' --exclude='cache' .
```
这里的`.`表示当前目录,`/tmp/site_backup.tar.gz`是保存路径和文件名。你可以自定义文件名,例如`mywebsite_20231001.tar.gz`。
- 下载压缩包到本地电脑。使用SFTP工具(如FileZilla)或`scp`命令。以下是用`scp`从旧服务器下载到本地的示例(在本地终端执行):
```
scp root@旧服务器IP:/tmp/site_backup.tar.gz /本地路径/
```
例如:`scp root@192.168.1.100:/tmp/site_backup.tar.gz /Users/你的用户名/Downloads/`
- 如果文件很大(超过1GB),建议使用`rsync`或分卷压缩,但一般中小型网站打包后不会太大。下载完成后,检查文件完整性,确保大小与服务器上一致。
### 2. 导出旧服务器数据库
网站数据通常存储在数据库中,需要导出为SQL文件。根据你的数据库类型(MySQL/MariaDB)选择导出方式。
- **方法一:使用phpMyAdmin(推荐新手)**
- 在旧服务器上打开phpMyAdmin(通常地址为`http://旧服务器IP/phpmyadmin`)。
- 输入数据库管理员账号密码登录(通常是root或你在安装时设置的用户)。
- 在左侧选择你要导出的数据库(例如`wordpress_db`)。
- 点击顶部菜单的“导出”选项卡。
- 导出格式选择“SQL”,勾选“添加DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT”和“添加IF NOT EXISTS”选项(可选,但能避免导入时冲突)。
- 点击“执行”,浏览器会自动下载一个`.sql`文件。保存到本地。
- **方法二:使用命令行(更稳定,适合大数据库)**
- 在SSH连接旧服务器的终端中,执行以下命令导出数据库(替换为你的数据库名、用户名和密码):
```
mysqldump -u 数据库用户名 -p 数据库名 > /tmp/database_backup.sql
```
例如:`mysqldump -u root -p mywebsite_db > /tmp/mywebsite_db.sql`
输入密码后,命令执行完成。如果数据库较大,可能需要等待几十秒到几分钟。
- 然后下载这个SQL文件到本地,与源码包放在同一目录:
```
scp root@旧服务器IP:/tmp/database_backup.sql /本地路径/
```
- **注意**:导出前最好先关闭网站写入功能(如开启维护模式),避免导出过程中数据变化导致不一致。WordPress可以安装WP Maintenance Mode插件,或临时修改`.htaccess`文件。
### 3. 将源码和数据库上传到新服务器
现在需要把本地的备份文件传输到新服务器,并解压到正确位置。
- 上传源码压缩包。使用SFTP工具或`scp`命令,将本地的`site_backup.tar.gz`上传到新服务器的`/tmp`目录:
```
scp /本地路径/site_backup.tar.gz root@新服务器IP:/tmp/
```
- 上传数据库SQL文件。同样方法上传:
```
scp /本地路径/database_backup.sql root@新服务器IP:/tmp/
```
- SSH登录新服务器,进入网站根目录(如果目录不存在,先创建):
```
ssh root@新服务器IP
cd /var/www/html # 根据你的新服务器环境调整路径
```
- 解压源码包到当前目录:
```
tar -xzf /tmp/site_backup.tar.gz -C /var/www/html
```
注意:如果`/var/www/html`目录下已有文件(如默认首页),建议先清空或备份。执行`rm -rf *`需谨慎,确认无误后再操作。
- 设置文件权限。Web服务器需要读取这些文件,通常目录权限设为755,文件权限设为644。可以递归设置:
```
chown -R www:www /var/www/html # 将所有者改为www用户(根据你的Web服务器用户调整,如nginx或www-data)
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
```
如果使用了框架(如ThinkPHP、Laravel),需要给`runtime`、`storage`等目录设置777权限:
```
chmod -R 777 /var/www/html/runtime
chmod -R 777 /var/www/html/storage
```
- 导入数据库。先登录MySQL创建新数据库(名称可以与旧数据库不同,但需与配置文件一致):
```
mysql -u root -p
CREATE DATABASE 新数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;
```
然后导入SQL文件:
```
mysql -u root -p 新数据库名 < /tmp/database_backup.sql
```
输入密码后等待导入完成。如果SQL文件很大,可以使用`source`命令或通过phpMyAdmin导入。
- **关键步骤**:修改网站配置文件中的数据库连接信息。大多数CMS(如WordPress、Discuz!)的数据库配置在根目录下的`wp-config.php`、`config.php`或`.env`文件中。使用`vim`或`nano`编辑:
```
vim /var/www/html/wp-config.php
```
找到以下三行并修改为新数据库的信息:
```
define('DB_NAME', '新数据库名');
define('DB_USER', '新数据库用户名');
define('DB_PASSWORD', '新数据库密码');
```
如果数据库用户和密码与旧服务器相同,则无需修改。但建议为新服务器创建专用数据库用户,避免安全风险。
### 4. 配置新服务器Web环境并测试
上传文件后,需要确保Web服务器正确指向网站目录,并能处理PHP等动态请求。
- 配置网站根目录。如果你使用宝塔面板,直接在面板中添加站点,域名填你的域名,根目录指向`/var/www/html`。如果手动配置Nginx,编辑配置文件(如`/etc/nginx/conf.d/yourdomain.conf`):
```
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 根据PHP版本调整
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
```
检查配置语法并重载Nginx:
```
nginx -t
systemctl reload nginx
```
- 测试网站访问。在本地电脑的`hosts`文件中临时解析域名到新服务器IP(仅用于测试,不修改DNS)。Windows路径:`C:\Windows\System32\drivers\etc\hosts`,Mac/Linux路径:`/etc/hosts`。添加一行:
```
新服务器IP yourdomain.com www.yourdomain.com
```
保存后,在浏览器输入`http://yourdomain.com`,查看网站是否正常加载。检查:
- 首页是否正常显示,图片、CSS、JS是否加载。
- 点击内页、文章、分类链接,是否出现404错误。
- 登录后台(如`/wp-admin`),是否能正常登录并操作。
- 如果网站使用了HTTPS,先不要测试,等域名解析完成后再配置SSL证书。
- 如果出现错误,检查以下常见问题:
- 文件权限不足导致白屏或500错误:重新执行权限设置命令。
- PHP扩展缺失:安装缺失的扩展(如`php-mysqli`、`php-gd`)。
- 伪静态规则未配置:将旧服务器的`.htaccess`或Nginx规则复制到新服务器。
- 数据库连接失败:检查`wp-config.php`中的数据库名、用户、密码、主机(通常是`localhost`,但有些服务器用`127.0.0.1`)。
### 5. 修改域名DNS解析指向新服务器
本地测试通过后,就可以将域名解析切换到新服务器了。
- 登录你的域名DNS管理控制台(如阿里云DNS、Cloudflare、DNSPod)。
- 找到域名的解析记录列表。通常有一条A记录(如`@`或`www`)指向旧服务器IP。
- 修改该记录的值为新服务器IP。如果有多条(如`@`和`www`),全部修改。
- 记录类型保持A记录,TTL(生存时间)建议设置为300秒(5分钟),以便快速生效。如果原来TTL是600或3600,先改成300,等迁移完成后再改回默认值。
- 保存修改。DNS解析全球生效通常需要几分钟到24小时,但一般1小时内大部分地区已生效。你可以使用`nslookup yourdomain.com`或在线DNS检测工具查看解析状态。
- **注意**:如果你使用了CDN(如Cloudflare、阿里云CDN),需要先在CDN后台修改源站IP为新服务器IP,然后再修改DNS解析。否则会导致网站访问异常。
### 6. 迁移后全面检查与优化
DNS解析生效后(建议等待2小时以上),进行最终检查。
- **检查网站功能**:
- 访问首页、内页、搜索、评论、表单提交等功能是否正常。
- 测试用户注册、登录、支付(如果有)流程。
- 检查邮件发送功能(如联系表单、密码重置),确保SMTP配置正确。
- 使用网站速度测试工具(如GTmetrix、PageSpeed Insights)检查加载速度,新服务器可能需优化PHP缓存、开启OPcache等。
- **检查SSL证书**:如果网站使用HTTPS,在新服务器上配置SSL证书。可以使用Certbot自动申请Let's Encrypt证书:
```
apt install certbot python3-certbot-nginx # Debian/Ubuntu
certbot --nginx -d yourdomain.com -d www.yourdomain.com
```
配置完成后,强制HTTPS跳转(在Nginx配置中添加301重定向)。
- **更新网站内部链接**:如果网站中硬编码了旧服务器IP或旧域名(常见于一些CMS),需要替换为新域名。可以使用SQL替换或插件(如WordPress的Better Search Replace插件)。在数据库中执行SQL:
```
UPDATE wp_options SET option_value = REPLACE(option_value, '旧域名', '新域名');
UPDATE wp_posts SET post_content = REPLACE(post_content, '旧域名', '新域名');
UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, '旧域名', '新域名');
```
注意替换表前缀(`wp_`)和域名格式(带`http://`或`https://`)。
- **清理旧服务器**:确认新服务器运行稳定后(建议观察1-2天),再关闭旧服务器或删除旧服务器上的网站文件。但不要立即释放旧服务器资源,保留一段时间以备不时之需。
## 常见问题
**问题1:迁移后网站出现404错误**
原因:伪静态规则未配置或Web服务器配置错误。解决方法:将旧服务器的`.htaccess`(Apache)或Nginx规则复制到新服务器。如果是Nginx,检查`try_files`指令是否正确。
**问题2:数据库导入失败,提示“Unknown character set”或“MySQL server has gone away”**
原因:SQL文件过大或字符集不兼容。解决方法:使用`mysql`命令时增加`--max_allowed_packet=1000M`参数,或通过phpMyAdmin分批导入。字符集问题可在导入前设置`SET NAMES utf8mb4;`。
**问题3:网站显示白屏或500错误**
原因:文件权限不足、PHP错误或扩展缺失。解决方法:检查Web服务器错误日志(如`/var/log/nginx/error.log`),开启PHP错误显示(在`php.ini`中设置`display_errors = On`),然后根据具体错误修复。
**问题4:登录后台后跳转到旧域名**
原因:数据库中的站点URL仍为旧域名。解决方法:登录新服务器数据库,修改`wp_options`表中的`siteurl`和`home`字段值。或者直接通过SQL更新:`UPDATE wp_options SET option_value = 'https://新域名' WHERE option_name IN ('siteurl', 'home');`
**问题5:图片或资源加载失败(F12显示404)**
原因:资源路径使用了绝对路径(如`http://旧域名/wp-content/uploads/...`)。解决方法:使用数据库替换工具将所有旧域名替换为新域名,或更新`.htaccess`添加301重定向规则。
**问题6:迁移后网站速度变慢**
原因:新服务器配置较低、未开启缓存或PHP版本差异。解决方法:检查PHP版本是否与旧服务器一致(某些旧代码可能不兼容新PHP),开启OPcache、Redis或Memcached缓存,优化数据库查询。
## 收尾总结
网站迁移服务器本质上就是“文件搬家+数据库搬家+域名改地址”三步。只要按照顺序:先完整备份旧服务器源码和数据库,再上传到新服务器并解压、导入数据库、修改配置,最后切换DNS,就能保证迁移成功率。迁移过程中最容易出错的环节是数据库连接信息配置错误和文件权限不足,这两点务必仔细检查。迁移完成后不要急于关闭旧服务器,保留至少24小时作为回退方案。如果遇到问题,优先查看Web服务器和PHP的错误日志,它们会直接告诉你问题所在。掌握这套流程后,无论网站大小或类型,你都能独立完成迁移。