近期,由于GFW发威,一台境外VPS服务器上的网站不能访问,于是想把网站迁移至国内VPS服务器。网站本身并不复杂,通过WordPress内容管理系统搭建,迁移的话还是涉及很多细节,大致可以包含如下过程:
- 原VPS网站打包及数据库备份
- 目标VPS上网站及数据库恢复
- web服务器配置
- wordpress网站配置修改
首先说一下原网站的打包备份,这个理论上是比较简单的,但是拜GFW所赐,其过程还是很麻烦的。由于GFW的策略修改,可以ping通的VPS也不能进行TCP连接了,这就阻断了我们同VPS的联系,SSH方式不能直接访问。幸运的是我还有一台VPS没有被屏蔽,可以用它来当SSH代理。
Xshell 5客户端是支持使用代理的,这需要在配置会话时设置。我采用的方法是使用shadowsocks客户端作为Xshell的代理,就像浏览器使用SS一样。当然可能还有其它的办法,我是觉得这样简单又好理解。
图.1 Xshell 5 配置代理服务器
如图.1所示,Xshell添加一个本地代理服务器,其中端口是代理客户端侦听的端口,就像浏览器的配置一样。全部配置完成后,就可以连接一下VPS测试,如果代理成功,会见到下图的内容:
图.2 Xshell 通过本地代理连接VPS
现在,已经通过SSH成功连接了原本不能访问的VPS主机,就可以进行网站导出和数据库备份了。我使用的方法也比较直接就是将网站文件件压缩成一个tar包、将数据库dump成为一个文件,假设网站目录为”/data/webroot”,数据库名为”rultr”:
# tar -zcvf webbak.tar.gz /data/webroot # mysqldump -uroot -p rultr > rultrdb.bak
命令执行完成后,就会生成两个文件”webbak.tar.gz”和”rultrdb.bak”,其中”webbak.tar.gz”是网站目录备份文件;而”rultrdb.bak”是网站的数据库备份。如何将两个文件传到国内VPS上,也小小费了些周折,本来国内的VPS是开了FTP服务的,想直接将文件上传上过来,可是发现也不能连接到国内服务器,于是就用Xftp工具,一样设置一个本地代理,将文件回传到电脑上,然后再通过Xftp上传到国内的VPS上。
国内的VPS是没有屏蔽SSH连接的,使用起来就相对方便。连接到服务器上使用如下命令解压网站目录和恢复数据库:
# tar -zxvf webbak.tar.gz # mv ./data/webroot /data/webroot # mysql -uroot -p MariaDB [(none)]> CREATE DATABASE rultr; MariaDB [(none)]> exit; # mysql -uroot -p rultr < rultrdb.bak
首先是解压网站目录,并将其移动至合适位置,然后登录数据库创建一个名为”rultr”的数据库,以便恢复数据。最后使用”mysql”命令恢复数据库中的数据。当然,这个数据库名可以和原来的数据库名不一致,不会影响最后的网站运行,不过方便起见,还是名称一致来的把稳。
现在,迁移网站工作就完成了多半,接下来的内容就是修改web服务器的配置让迁移后的网站可以正常运行起来。国内VPS是LNMP的系统,使用Nginx作为web服务器,现在就修改nginx的配置,添加一个”rultr.conf”的配置文件,用于运行原来境外的网站。配置文件主要内容如下:
server { listen 443; server_name www.rultr.com; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; ssl on; ssl_certificate /etc/letsencrypt/live/www.rultr.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.rultr.com/privkey.pem; location / { root /data/webroot; index index.php index.html; # WordPress rewrite rules if (-f $request_filename/index.html){ rewrite (.*) $1/index.html break; } if (-f $request_filename/index.php){ rewrite (.*) $1/index.php; } if (!-f $request_filename){ rewrite (.*) /index.php; } rewrite /wp-admin$ $scheme://$host$uri/ permanent; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { root /data/webroot; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/webroot$fastcgi_script_name; include fastcgi_params; } fastcgi_buffers 512 128k; fastcgi_buffer_size 128k; fastcgi_read_timeout 300; # start gzip gzip on; gzip_min_length 1k; gzip_comp_level 6; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_vary on; gzip_disable "MSIE [1-6]\."; } server { listen 80; server_name www.rultr.com; return 302 https://www.rultr.com$request_uri; }
注意到配置文件中是启用了SSL加密的,使用的是Let’s encrypt的证书,这个不用多想,还是按上面的办法把证书文件从原VPS移动到现在的VPS相应目录即可。
现在网站理论上就已经在目标VPS上运行起来了,但是通过浏览器访问的话,一定访问不到,因为域名还没有解析过来,要做的工作就是把”www.rultr.com”这个域名解析到现在网站VPS的IP地址上来。这个就不做过多讲解,因为不同的域名服务商操作界面不尽相同,反正达到通过域名可以访问到国内VPS的目的即可。
域名解析正确后,再次访问网站,首先会报错数据库连接错误,这是因为WordPress的配置文件数据库部分有变化引起的。在网站目录有一个”wp-config.php”文件,就是WordPress的配置文件,主要修改以下内容:
// ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define('WP_CACHE', true); define( 'WPCACHEHOME', '/data/webroot/wp-content/plugins/wp-super-cache/' ); define('DB_NAME', 'rultr'); /** MySQL database username */ define('DB_USER', 'rultr'); /** MySQL database password */ define('DB_PASSWORD', 'localhostpassword'); /** MySQL hostname */ define('DB_HOST', '127.0.0.1');
其中:
‘WPCACHEHOME’: 用于设置cache文件目录,根据实际情况填写
‘DB_NAME’: 用于设置连接的数据库名,本次使用rultr
‘DB_USER’: 用于设置操作rultr数据库的用户名,本次使用新添加的账户rultr
‘DB_PASSWORD’: 用于设置rultr账户的密码,为明文件密码,未加密
‘DB_HOST’: 用于设置数据库主机,本次使用127.0.0.1,表示连接本机
这样,再次访问迁移后的网站时,就可以正常显示了。
如果迁移后的网站想使用其它域名,上述步骤完成后,可以按以下方法处理。
首先修改web服务器的配置,让其侦听新的域名。
然后再登录到数据库,使用如下语句进行相关内容修改:
# mysql -uroot -p MariaDB [(none)]> USE rultr; MariaDB [(none)]> UPDATE `wp_options` SET `option_value` = 'new.site.url' WHERE `wp_options`.`option_name` = 'siteurl' ; MariaDB [(none)]> UPDATE `wp_options` SET `option_value` = 'new.site.url' WHERE `wp_options`.`option_name` = 'home' ;
注意将语句中的”new.site.url”改为实际的新域名,否则WordPress网站不能正常访问。如果安装了phpMyAdmin网站,那么管理数据库就方便很多,添加用户,设置权限以及修改记录值都直观明确。
至此,手动迁移WordPress网站工作全部完成。