近期,由于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网站工作全部完成。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注