⚠️ 記事内に広告を含みます。

WordPressの引っ越し方法 xserverからlightsail

wordpressが稼働しているxserverからlightsailに引っ越しする方法を紹介します。

WordPressのサイトを別のサーバに引っ越しは可能!

WordPressのサイトを別のサーバに移動できますか?
はい!可能です

様々な理由でサーバを移動したいことはあると思います

  • 必要な機能がない
  • 複数のサーバを統合したい
  • なんとなく引越ししてみたい
  • 最適化したい

WordPressのWebサイトも単なるデータ

コピーすれば移動可能です!
ただし、多少の知識や操作ミスしたりするとデータが消えることもあり得ので慎重に!

XserverからLightsailにWordPressを移行する手順

xserverといえば

・安定
・高速
・知識がなくても使いやすい

とWordPressサイトを公開するなら、筆者が最もおすすめする共用レンタルサーバでもあります!

一方のAWS提供のlightsailはコスパの面や知識を要する点で劣る面があるものの、圧倒的に自由度は高いです。その上、VMベースのEC2よりも料金が安く使いやすいので、AWS クラウド入門編としてもお勧めです

サーバやIT技術に興味のある人にはおすすめできます!

概要

Xserverで稼働中のWordpressをlightsailに移行する。
この方法はxserver以外の共用レンタルサーバでも応用できると思います。

サイトの切り替えは元のドメインから新ドメインに301リダイレクトで行います。

サーバ移行はデータロストなどを起こす可能性があるので自己責任で!

移行元ドメイン:example.jp 移行先ドメイン:example.com

手順概要

  1. 新サイトからwebコンテンツのコピー
  2. データベースの作成・ダンプ取得&リストア
  3. 新サーバでのVH作成
  4. web・データベースの設定を確認
  5. ブラウザでの動作確認
  6. 旧ドメインでリダイレクト設定追記
  7. 浸透後、インデックス後に旧サーバを閉鎖する

webコンテンツのコピー

旧サーバから新しいサーバにコンテンツデータをコピーします。

データのコピー前には必ずバックアップを!

作業前に必ずバックアップをしましょう。
サーバのデータはWebサーバのデータとデータベースのデータがあるので両方ともバックアップしておきます。

新サーバのwebディレクトリは/var/www/配下に設置する。

□ 新ドキュメントルートの作成
# mkdir /var/www/example.com/

□ xserverからlightsailにコンテンツコピー
# rsync -avn xserver_new:/home/exaxmple/example.jp/ /var/www/example.com/
ドライランで確認した後に実際にコピー
# rsync -av xserver_new:/home/example/example.jp/ /var/www/example.com/

コピー完了したかを確認する
# ls /var/www/example.com/
autoreply  htpasswd  log  mail  public_html  script  xserver_php

コピーしたディレクトリで何も入っていないディレクトリを削除する
# du -sh ./* |  grep ^0 | awk '{print $2}' | xargs rm -r
/var/www/ディレクトリ

Webサーバのサイトのデータは/var/wwwなどのディレクトリに設置します。
ここには画像データなどが格納されています。

データベースの作成(ダンプ&リストア)

WordPressのデータはデータベースにもあるのでコピーします。
ここには本文テキストなどが格納されています。

wp-config.phpからデータベースの情報を取得

wp-config.pjpにはデータベースの情報が格納されています。
これを確認してデータベースにアクセスできるようします。

# cat wp-config.php | egrep -i "db"
define('DB_NAME', 'example_wp1');
define('DB_USER', 'example_wp1');
define('DB_PASSWORD', 'P@ssword');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

データベースのダンプをする

元サイトのデータベースからダンプファイルを取得する

@xserver

コピー元のデータベースにcli上からアクセスしてダンプファイルを入手します。
mysqlクライアントが必要ですが、おそらくインストールされているはずです。

$ mysqldump -uexample_wp1 -p'P@ssword' -h localhost   --default-character-set=binary example_wp1 > ./example.sql

ダンプしたファイルをlightsailにコピーする

# scp xserver_new:/home/example/example_wp1.sql /backup/
example_wp1.sql                                                                                       100% 1792KB  20.3MB/s   00:00
# ls /backup/ | grep sql
example_wp1.sql

ダンプしたsqlファイルを新サーバ(lightsail)にコピーします。
scpコマンドでコピーするには新サーバにSSHできる状態にしておく必要があります。

SSHサーバーの構築SSHサーバーの構築 sshdを起動してリモート接続しよう!

新サーバでデータベースを構築してSQLファイルからリストアする

lightsail側でインスタンスを立ち上げて、データベースサーバをインストールしておく必要があります。
DBを動かすにはメモリがある程度欲しいので5 USD以上のプランがおすすめです。

xserverはmysql(mariaDB)なのでpostgreSQLではなく同じRDBMSをインストールした方が楽です。

lightsailでデータベースを作成する

# mysql
現ユーザを確認する
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)

ユーザとパスワードを設定
mysql> CREATE USER 'example_wp1'@'localhost' IDENTIFIED BY 'P@ssword';

作成を確認する
mysql> select user,host from mysql.user where user = 'example_wp1';
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| example_wp1   | localhost |
+---------------+-----------+
1 row in set (0.00 sec)

データベースを作成
mysql> CREATE DATABASE example_wp1;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| example_wp1        |
| performance_schema |
| sys                |
| world              |
+--------------------+
9 rows in set (0.00 sec)

作成したデーターベースの全権限をexample_wp1ユーザに付与する
mysql> GRANT ALL PRIVILEGES ON exmample_wp1.* TO 'example_wp1'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'example_wp1'@'localhost'\\G
*************************** 1. row ***************************
Grants for example_wp1@localhost: GRANT USAGE ON *.* TO `example_wp1`@`localhost`
*************************** 2. row ***************************
Grants for example_wp1@localhost: GRANT ALL PRIVILEGES ON `example_wp1`.* TO `example_wp1`@`localhost`
2 rows in set (0.00 sec)

作成したユーザでログイン可能か確認する
# mysql -u example_wp1 -p
Enter password:
mysql> 

ダンプをリストアする

# mysql -h localhost -u example_wp1 -p example_wp1  < /backup/example_wp1.sql
mysqlにログインして実際にリストアができているかを確認する。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| example_wp1        |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql> use example_wp1
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_example_wp1   |
+---------------------------+
| wp_cbnetpo_ping_optimizer |
| wp_cocoon_accesses        |
| wp_cocoon_affiliate_tags  |
| wp_cocoon_function_texts  |
| wp_cocoon_item_rankings   |
| wp_cocoon_speech_balloons |
| wp_commentmeta            |
| wp_comments               |
| wp_ewwwio_images          |
| wp_ewwwio_queue           |
| wp_links                  |
| wp_options                |
| wp_postmeta               |
| wp_posts                  |
| wp_term_relationships     |
| wp_term_taxonomy          |
| wp_termmeta               |
| wp_terms                  |
| wp_usermeta               |
| wp_users                  |
+---------------------------+
20 rows in set (0.00 sec)

webサーバの設定

webサーバにはnginxを使います。nginxは高速なWebサーバでシェア率もぐんぐん伸ばしています。lightsialの選択プランのスペックが低いのでnginxのキャッシュ機能を利用してページ表示を高速化します。

webサーバの構成

webサイトの構成はnginxを手前に設置してキャッシュを導入します。
下記のようにnginx80/443ポートで受けて、apache 8080ポートに流す、というような nginxをプロキシのように利用しようと思いましたが、メモリが潤沢ではなく、移行するドメインの数が少ないのでapacheは使わずnginxのみで行きます。

Internet -> nginx (443/80) -> apache (8080) 

CertbotでSSL証明書を取得する

別に後からでも良いのですが、Webサーバの設定を行う前にSSL証明書を取得してしまいます。
無料でも有償でも機能は変わらないので無償のLet `sEncrypt証明書を使います。

Let’sEncryptを利用するにはCertbotのインストールが必要です。

認証に80ポートを使用するので80ポートをListenしているアプリケーションを停止する
# netstat -lntp | grep ":80 " |grep "tcp " | awk '{print $(NF-1)}' | awk -F "/" '{print $2}'
nginx:

nginxを停止する
# systemctl stop nginx  && systemctl status nginx | grep Active
   Active: inactive (dead) since Sat 2022-08-27 10:21:24 UTC; 9ms ago

# certbot certonly --standalone -d example.com --agree-tos

certbotで証明書の発行が成功すれば下記ディレクトリにドメインのディレクトリが作成される
# ls /etc/letsencrypt/live/
example.com README
let'sencrypt証明書の取得方法と自動更新の設定Let’sEncryptの証明書取得はwebrootを使う

nginxの設定

インターネットから来たアクセスが最初に通るnginxの設定をします。
nginxはポート80で受けてアクセスを捌きます。キャッシュがあれば、キャッシュを返し、なければバックエンドの8080ポートでリッスンしてるapacheにリバースプロキシして、apacheが返答します。

ドキュメントルートをメモ

元サーバのドキュメントルートは/home/example/example.jp/public_html/

設定ファイルを作成する

.confが読み込めるディレクトリであればどこでもいい
# cd /etc/nginx/conf.d
# vim example.com.conf

Webサーバ用の設定ファイルを作成します。
通常のWebサーバの設定よりも複雑になっています。
これはnginxでキャッシュするのと、apacheにリバースプロキシする設定を入れているからです。

#http
        fastcgi_cache_path /var/cache/nginx/example.comlevels=1:2 keys_zone=example.com:10m max_size=512M inactive=600m;
server {
    listen       80;
    server_name  ~^(www\\.)example.com;
    return 301 https://example.com$request_uri;
}
server {
        listen 443 ssl;

        server_name example.com;
        root /var/www/example.com/public_html;
        access_log  /var/log/nginx/example.com/access.log  main;
        error_log   /var/log/nginx/example.com/error.log;
        index index.php index.html index.htm;

        location /test-auth {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
#       return 200 'auth OK';
        }
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        set $no_cache 0;
        if ($request_method != "GET") {
                set $no_cache 1;
        }
        if ($query_string != "") {
                set $no_cache 1;
        }
        if ($http_cookie ~ ^.*(comment_author|wordpress_[a-f0-9]+|wordpress_logged_in|wp-postpass|wordpress_no_cache).*$) {
                set $no_cache 1;
        }
        if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|^/feed/*|/tag/.*/feed/*|index.php|/.*sitemap.*\\.(xml|xsl)") {
                set $no_cache 1;
        }
        if ($remote_addr ~* "192.168.0.2|192.168.0.3|192.168.0.6") {
                set $no_cache 1;
        }

        location  ~ \\.php$ {
        #fastcgi general setting
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        include        fastcgi_params;

        #fastcgi cache setting
        fastcgi_cache cgicache;
        fastcgi_cache_valid 200 301 302 240m;
        fastcgi_cache_valid 404 403 1m;
        fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
        fastcgi_cache_min_uses 1;
        fastcgi_cache_lock on;
        fastcgi_cache_key "$scheme$request_method$host$request_uri";
        fastcgi_no_cache $no_cache;
        fastcgi_cache_bypass $no_cache;
        fastcgi_pass_header X-Accel-Expires;
#       fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
        add_header X-FastCGI-Cache $upstream_cache_status;
#       add_header X-F-Cache $upstream_cache_status;
        add_header no_cache_flag $no_cache;
        }

        ## ssl setting
        ssl_certificate  /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        ssl_session_cache shared:SSL:20m;
        ssl_session_timeout  10m;

        ssl_protocols TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:ECDHE+CHACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE;

        }

権限の調整

# chown -R apache.nginx /var/www/example.com/
# chmod -R +r public_html/
# ls -al /var/www/example.com/

PHP-fpmの設定

WordPressの動作にはPHPが必要です。
phpを動かすにはapacheの場合は組み込まれているphpモジュールを使いますが、nginxではfastCGIのphp-fpmを別途インストールして設定する必要があります。

php-fpmにはバージョンがあるので注意します。最近のものであればphp7系のphp-fpmを入れれば動くと思います。

ファイルの書き換えするなら必ずバックアップする

何かのファイルを書き換えるなあら、必ずバックアップしましょう

バックアップファイル名はドットファイルにしたり、バックアップとわかるような名前にしておきます。(例:www.conf_20201031)

userとgroupをnginxにします。

# /etc/php-fpm.d/www.conf
user = nginx
group = nginx
nginxでphpMyAdmin.001nginxでphpMyAdminを利用する設定方法

データベースの設定

データベースの設定をします。
データベース中に書き込まれている元サーバの情報を新サーバ側に書き換えます。

DBでsiteurlの変更

mysql> select * from wp_options WHERE option_name IN ('home','siteurl');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from wp_options WHERE option_name IN ('home','siteurl')' at line 1
mysql> SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
+-----------+-------------+-------------------------------+----------+
| option_id | option_name | option_value                  | autoload |
+-----------+-------------+-------------------------------+----------+
|         2 | home        | <https://example.jp> | yes      |
|         1 | siteurl     | <https://example.jp> | yes      |
+-----------+-------------+-------------------------------+----------+
2 rows in set (0.00 sec)

mysql>
mysql> SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
+-----------+-------------+------------------------------+----------+
| option_id | option_name | option_value                 | autoload |
+-----------+-------------+------------------------------+----------+
|         2 | home        | <http://example.com> | yes      |
|         1 | siteurl     | <http://example.com> | yes      |
+-----------+-------------+------------------------------+----------+
2 rows in set (0.00 sec)
UPDATE wp_options SET option_value='<http://example.com>' where option_name IN ('home','siteurl');

wp-configを編集

FTPの情報を求められる場合があります。

要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。

これはwordpressのファイルのオーナーがwebサーバの実行ユーザapacheやnginx等になっていない場合に起こります。

chown -R nginx.nginx ./wordpress

またこの他にもwp-config.phpに下記のような記述をすることで表示の回避が可能です。

define('FS_METHOD','direct');

wordpress管理画面の「ツール」→ 「サイトヘルス」→情報タブのファイシステムパーミッションを選択して状況を確認しておきましょう。

WordPress がアクセスを必要とするディレクトリに書き込み可能かどうかを表示します。

WordPress のメインディレクトリ  書き込み可能
wp-content ディレクトリ	     書き込み可能
uploads ディレクトリ     	     書き込み可能
plugins ディレクトリ 	     書き込み可能
テーマディレクトリ	             書き込み可能

これでサーバのグローバルIP(***.***.***.***:80)にアクセスするとWordPressの設定画面表示されるはずですが、されないことも多いです。

残りの必要な作業としては、

・lightsial側で固定のグローバルIPに設定する→しないとドメインのIPが再起動のたびに変わり、毎度DNSを書き換える必要がある
・lightsail側でファイアウォールの設定→設定画面で80/443ポートを公開するようにファイアウォールの設定をします。
・wordpressの設定まわり調整
・ドメインのDNS切り替え→新しいドメインに変える場合はDNSのレコードを書き換える必要があります。
・切り替えを途切れなく行うために→ドメインが変わる場合はあらかじめ301リダイレクト設定を前のドメインから新しいドメインに入れる設定が必要です。そうしないと検索に古いドメインがインデックスされているとアクセスは古い方に行きます。両方が稼働している状態で動作確認して、問題なければリダイレクトを入れて新しいサイトに誘導します(DNSは設定済みの状態で)。
その後ある程度浸透したら古いドメインのサイト(サーバ)は閉鎖します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です