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.pemとprivkey.pem自体は、ただのシンボリックリンクなので注意
cpコマンドを使うと、実体の方を複製できる
旧サーバーから新サーバーへファイルを転送
旧サーバーで取得した
wp_example.sql(データベースのバックアップ)example.com.tar.xz(ファイルのバックアップ)fullchain.pemprivkey.pem
の4つのファイルを新サーバーにアップロードする
新サーバーでの作業
事前準備
- nginx
- php
- php-fpm
- MariaDB
を事前にインストールしておく
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" );
DB_NAMEDB_USERDB_PASSWORDDB_HOST
などの値を確認する
mysqlへログイン
mysql -u root -p
ユーザーを作成
MariaDB [(none)]> CREATE USER uuuu@localhost IDENTIFIED BY 'pppp';
wp-config.phpで確認した
DB_USERDB_PASSWORDDB_HOST
の値を元に、ユーザーを作成
uuuuの部分は、DB_USERから
localhost の部分は、DB_HOSTから
ppppの部分は、DB_PASSWORDから
ユーザーに権限を設定
MariaDB [(none)]> GRANT ALL ON wp_example.* TO uuuu@localhost;
wp-config.phpで確認した
DB_NAME
の値を元に、データベースに対するユーザーの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.pemとprivkey.pemを適当なディレクトリに保管
この2つのファイルは、nginxの.confファイルで
ssl_certificateとssl_certificate_keyに設定する
しかし、これは一時的な措置
サーバー移転後(DNS切替完了後)に
certbot certonlyコマンドで、別のfullchain.pemとprivkey.pemを生成し
旧サーバーから持ってきた方のfullchain.pemとprivkey.pemは削除する
DNSの切り替えが完了しないと、certbot certonlyコマンド時のACMEチャレンジが通らないため
一時的な措置として旧サーバーからコピーしてきたfullchain.pemとprivkey.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_nameとrootの部分は各自の環境に合わせて設定
ssl_certificateとssl_certificate_keyには
旧サーバーからコピーしてきたfullchain.pemとprivkey.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_certificateとssl_certificate_keyを
certbot(letsencrypt)で発行したものに変更している
/home/user1/tmp/example.comディレクトリの
fullchain.pemとprivkey.pemはもう使わないので削除しておく
nginxを再起動
nginx -t systemctl restart nginx
certbot renewをcronで定期実行
cronでcertbot renewを定期実行する方法を参考に
SSL証明書が定期的に更新されるように設定する