目次

WordPressを別のサーバーに移転する方法

旧サーバーでの作業

データベースの最適化

WordPressの管理画面での作業

WP-Optimizeプラグインをインストール

WP-Optimizeでデータベースを最適化

DBのサイズが大きすぎると移行に失敗することがある
WP-Optimizeでリビジョン(投稿の編集履歴)などを削除するとデータベースの容量を大幅に縮小できる

WordPressのデータベースとファイルをバックアップ

WordPressをバックアップ・リストアする方法を参考に、WordPressのデータベースとファイルをバックアップ

SSL証明書と鍵をバックアップ

cp /etc/letsencrypt/live/example.com/fullchain.pem /home/user1/fullchain.pem
cp /etc/letsencrypt/live/example.com/privkey.pem /home/user1/privkey.pem

WordPressサイトをhttps化するための、SSL証明書(fullchain.pem)と鍵(privkey.pem)をコピーする

/etc/letsencrypt/live/example.comのようなディレクトリにある
fullchain.pemprivkey.pem自体は、ただのシンボリックリンクなので注意

cpコマンドを使うと、実体の方を複製できる

旧サーバーから新サーバーへファイルを転送

旧サーバーで取得した

の4つのファイルを新サーバーにアップロードする

新サーバーでの作業

事前準備

を事前にインストールしておく

tar.gzを解凍

mkdir -p /home/user1/WordPress/
mv example.com.tar.xz /home/user1/WordPress/
cd /home/user1/WordPress/
tar xJf example.com.tar.xz

/home/user1/WordPress/のようなディレクトリを作成し
その中でexample.com.tar.xzを解凍する

/home/user1/WordPress/example.comのようなディレクトリが生成される
ここをWordPressサイトのドキュメントルートとする

ドキュメントルートのパーミッションを設定

cd /home/user1/WordPress/example.com
chown -R nginx:nginx .

example.comディレクトリの所有者・グループをnginx:nginx(nginxの実行ユーザー)に変更

WordPressのデータベースをリストア

mysql -u root -p < wp_example.sql

rootユーザーでmysqlへログイン
wp_example.sql(データベースのバックアップ)内のSQLコマンド群を一括で実行する

WordPress用データベースユーザーを作成

DB_USERとDB_PASSWORDなどの値を確認

vi /home/user1/WordPress/example.com/wp-config.php

wp-config.phpを開く

wp-config.php抜粋
define( 'DB_NAME', "wp_example" );
define( 'DB_USER', "uuuu" );
define( 'DB_PASSWORD', "pppp" );
define( 'DB_HOST', "localhost" );

などの値を確認する

mysqlへログイン

mysql -u root -p

ユーザーを作成

MariaDB [(none)]> CREATE USER uuuu@localhost IDENTIFIED BY 'pppp';

wp-config.phpで確認した

の値を元に、ユーザーを作成

uuuuの部分は、DB_USERから
localhost の部分は、DB_HOSTから
ppppの部分は、DB_PASSWORDから

ユーザーに権限を設定

MariaDB [(none)]> GRANT ALL ON wp_example.* TO uuuu@localhost;

wp-config.phpで確認した

の値を元に、データベースに対するユーザーのALL権限を設定

wp_exampleの部分は、DB_NAMEから

uuuu@localhostの部分は、先ほど作成したユーザー

権限を確認

MariaDB [(none)]> SHOW GRANTS FOR uuuu@localhost;
実行結果
+-------------------------------------------------------------------------+
| Grants for uuu@localhost                                                |
+-------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `uuu`@`localhost` IDENTIFIED BY PASSWORD '*xxxxx' |
| GRANT ALL PRIVILEGES ON `wp_example`.* TO `uuu`@`localhost`             |
+-------------------------------------------------------------------------+

GRANT ALL PRIVILEGES ON `wp_example`.* TO `uuu`@`localhost`のような表示があればOK

fullchain.pemとprivkey.pemを一時ディレクトリに移動

mkdir -p /home/user1/tmp/example.com
mv fullchain.pem /home/user1/tmp/example.com/
mv privkey.pem /home/user1/tmp/example.com/

旧サーバーからコピーしてきたfullchain.pemprivkey.pemを適当なディレクトリに保管

この2つのファイルは、nginxの.confファイルで
ssl_certificatessl_certificate_keyに設定する

しかし、これは一時的な措置

サーバー移転後(DNS切替完了後)に
certbot certonlyコマンドで、別のfullchain.pemprivkey.pemを生成し
旧サーバーから持ってきた方のfullchain.pemprivkey.pemは削除する

DNSの切り替えが完了しないと、certbot certonlyコマンド時のACMEチャレンジが通らないため
一時的な措置として旧サーバーからコピーしてきたfullchain.pemprivkey.pemを使う

nginxの.confファイルを設定

vi /etc/nginx/conf.d/example.com.conf

example.com.confのようなファイルを新規作成する

example.com.conf
server {
    listen      80;
    server_name example.com www.example.com;
    return 301  https://example.com$request_uri;
}

server {
    listen       443 ssl http2;
    server_name  example.com www.example.com;
    root         /home/user1/WordPress/example.com;
    index        index.php index.html index.htm;

    ssl_certificate      /home/user1/tmp/example.com/fullchain.pem;
    ssl_certificate_key  /home/user1/tmp/example.com/privkey.pem;
    #ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    #ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS on;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    }

    location ~* /\.well-known {
        allow all;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ /\. {
        deny all;
    }

    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 1y;
        log_not_found off;
    }
}

WordPressが使えるように、fastcgiなどの設定を行う

server_namerootの部分は各自の環境に合わせて設定

ssl_certificatessl_certificate_keyには
旧サーバーからコピーしてきたfullchain.pemprivkey.pemのパスを指定

nginxを再起動

nginx -t
systemctl restart nginx

動作確認

hostsの設定

Windowsのhostsを設定して
example.comのようなドメインから
新サーバーのIPアドレスへ名前解決させる

ブラウザで確認

ブラウザで
http://example.com
のようなURLへアクセス

WordPressのサイトが正常に表示されていればOK

サイトタイトルを一時的に変更

WordPressの管理画面へログインし
サイト名に(新)のような表示を入れる

hostsの設定を元に戻して
ブラウザでアクセスしたときに(新)の表示が消えることを確認する
(旧サーバーの方が表示されることを確認)

旧サーバーでWordPress管理画面にログインし
サイト名に(旧)のような表示を入れる

 DNSを切替 

DNSの設定を変更し、旧サーバーから新サーバーに切り替える

DNSの設定が浸透するまでに数時間~数日待つ

 SSL証明書の発行 

DNSが浸透して、完全に新サーバーに切り替わったら、https用の証明書を発行する

--dry-runでSSL証明書発行が可能かチェック

certbot certonly --webroot -w /home/user1/WordPress/example.com -d example.com -d www.example.com --email admin@example.com --dry-run

 SSL証明書を発行 

certbot certonly --webroot -w /home/user1/WordPress/example.com -d example.com -d www.example.com --email admin@example.com

 nginxの.confを設定 

vi /etc/nginx/conf.d/example.com.conf
example.com.conf抜粋
    ssl_certificate      /home/user1/tmp/example.com/fullchain.pem;
    ssl_certificate_key  /home/user1/tmp/example.com/privkey.pem;

上記のような部分を

example.com.conf抜粋
    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;

上記のようなものに書き換え

ssl_certificatessl_certificate_key
certbotletsencrypt)で発行したものに変更している

/home/user1/tmp/example.comディレクトリの
fullchain.pemprivkey.pemはもう使わないので削除しておく

 nginxを再起動 

nginx -t
systemctl restart nginx

 certbot renewをcronで定期実行 

cronでcertbot renewを定期実行する方法を参考に
SSL証明書が定期的に更新されるように設定する