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.pem
privkey.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_NAME
DB_USER
DB_PASSWORD
DB_HOST
などの値を確認する
mysqlへログイン
mysql -u root -p
ユーザーを作成
MariaDB [(none)]> CREATE USER uuuu@localhost IDENTIFIED BY 'pppp';
wp-config.php
で確認した
DB_USER
DB_PASSWORD
DB_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証明書が定期的に更新されるように設定する