こんにちは。那須野です。
世にも珍しいこの多言語ブログなんですが、長らく同じサーバーで運用していた弊害としてCentOSのバージョンなりPHPのバージョンなりWPMLプラグインのバージョンなりで問題が出てきて袋小路に陥っていたので、思い切って力業でサーバー移転した話を備忘録的にまとめておきたいと思います。
このブログは2018年にさくらのVPSからConoHaにサーバー移転したとき以来、6年ほどサーバー環境を変えていませんでした。たまにマイナーアップデートはしていたかと思うのですが、メジャーバージョンアップはしていないという、あるあるの状態です。
ブログの更新頻度が減ってWordPressのダッシュボードを開くこともだいぶ減っていたのですが、よく見ると危険なアラートマークが出ています。このPHPはもうサポートされていないバージョンなので、可及的速やかに更新するようにとのこと。マジか…。
セキュリティ的に宜しくない状態なのでとりあえずPHP7.4にアップデートしてみたところ、ブラウザからサイトにアクセスできずにタイムアウトするという謎の問題が噴出。
原因はおそらくWPMLプラグイン。このブログは立ち上げてから10年ほどの間ずっと多言語化プラグインであるWPMLのバージョン3.0.2-aに大きく依存してきたのですが、運用している中で小さなバグをいくつか見つけて変な挙動も散見していたので、新しいPHPに対応していない可能性が十分にあると推測しました。なお、市販のこのプラグインのバグ調査を自力でやる体力はないので、最新版を買いなおしてインストールしなおす方針にしました。
ついでに言うと、OSはCentOS Linux 7.9を使っていたのですが、そういえばCentOSは2024年6月末をもって最後の7系列もサポートを終了していました。おいおいマジか…。
新しいOSについて色々情報を探ったときに真っ先に出てきたのはCentOSでサポートが提供されているCentOS Stream9。ただしこれはRHELに対してダウンストリームではなくアップストリームに当たり、サポート期間も5年と短い(今からだと2027年5月末までで3年と短い)ため、長く安定運用したいこのブログの選択肢としては魅力に欠けていました。
それ以外の選択肢を探っていたところ、Rocky Linuxは使い勝手がほぼ同じで、コミュニティが活発でCentOSに思想が似ており、2022年リリースなので恐らく2032年までサポートが有効そうで、かつConoHa VPSでも対応しているとのことで、無料で取りうる選択肢としてベストだと判断しました。
ということで、思い切って新しいサーバーを立て直し、新しいOSであるRocky Linux 9.4を入れて、新しいPHPバージョン8.0を入れて、新しいWordPressバージョン6.6.1をインストールして、新しいWPML Multilingual Blogプラグインのバージョン4.612を入れて再始動することにしました。
これだけ更新すれば、もう10年くらいは安定して使えるのではないかと信じたいところです。
具体的な手順に入る前に、今回の私の作業環境をまとめておきたいと思います。
前回の移行時はmacを使っていましたが、いろいろあってmacはお蔵入りしており、Windowsのみを使うようになっています。
OS:Windows11
ターミナル:Windows PowerShell
エディタ:Visual Studio Code
SSHクライアント:WinSCP
それでは本題に入りましょう。
それでは本題の移行の具体的な作業手順です。
同じ状況に遭遇する人がいるかというと微妙な気はしますが、どちらかというと自分のためということで、全部をアップデートする流れを備忘録的にまとめておきたいと思います。
大きな流れとしては、以下のような10段階を踏みました。
それでは詳しく見ていきましょう。
ConoHaのアカウントを持っている方であれば、コントロールパネルから[サーバー追加]でサクッと購入できます。購入時にイメージタイプの設定でOS=Rocky Linux 9.4を選ぶだけで簡単にインストールできます。
以下の流れで一気に設定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# Apacheのインストール sudo dnf install httpd # Apacheの起動と自動起動設定 sudo systemctl start httpd sudo systemctl enable httpd # ファイアウォールの設定 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload # ディレクトリの作成 sudo mkdir -p /var/www/html/takuminasuno.com sudo chown -R apache:apache /var/www/html/takuminasuno.com # PHPとその他必要なモジュールのインストール sudo dnf install php php-mysqlnd php-fpm php-gd php-xml php-mbstring php-json php-opcache sudo systemctl start php-fpm sudo systemctl enable php-fpm # Apache再起動 sudo systemctl restart httpd sudo mysql_secure_installation # MariaDBのインストール sudo dnf install mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb sudo mysql_secure_installation # WordPressデータベースとユーザーの作成 sudo mysql -u root -p ↓ CREATE DATABASE {DATABASE_NAME}; CREATE USER '{USER_NAME}'@'localhost' IDENTIFIED BY '{USER_PASSWORD}'; GRANT ALL PRIVILEGES ON {DATABASE_NAME}.* TO '{USER_NAME}'@'localhost'; FLUSH PRIVILEGES; # WordPressのダウンロードと展開 cd /tmp wget https://wordpress.org/latest.tar.gz tar -xzvf latest.tar.gz sudo mv wordpress/* /var/www/html/takuminasuno.com/ # パーミッションの設定 sudo chown -R apache:apache /var/www/html/takuminasuno.com sudo chmod -R 755 /var/www/html/takuminasuno.com # wp-config.phpの設定 vim /var/www/html/takuminasuno.com/wp-config.php ※データベース名、ユーザー名、パスワードを設定する |
WordPressのGUI上で作業したり確認できるよう、URLを設定します。具体的にはhttps://takuminasunoの本番環境と並行する形でhttp://dev.takuminasuno.comというURLを宛がうことにします。具体的には、3つの設定を行います。
①hostsファイルの設定
DNSレコードの伝播を待つのは面倒なので、hostsファイルを設定して作業用PCから強制的にアクセスできるようにします。ローカルの「C:\Windows\System32\drivers\etc」にあるhostsファイルを管理者権限で開き、「{IP_ADDRESS} http://dev.takuminasuno.com」を追記します。
②wp-configの設定
wp-config.phpファイルを開き、siteurlとhomeのURLを設定します。
1 2 3 4 |
vim /var/www/html/takuminasuno.com/wp-config.php ↓ define('WP_SITEURL', 'http://dev.takuminasuno.com'); define('WP_HOME', 'http://dev.takuminasuno.com'); |
③バーチャルホストの設定
バーチャルホストでの並行運用を前提にするので、以下のように追記しておきます。取り急ぎはhttp接続のみなので80番ポートのみです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
vim /etc/httpd/conf.d/takuminasuno.com.conf ↓ <VirtualHost *:80> ServerName dev.takuminasuno.com DocumentRoot /var/www/html/takuminasuno.com DirectoryIndex index.html index.php ErrorLog /var/log/httpd/takuminasuno.com_error_log CustomLog /var/log/httpd/takuminasuno.com_access_log combined AddDefaultCharset UTF-8 <Directory "/var/www/html/takuminasuno.com"> AllowOverride All Require all granted </Directory> </VirtualHost> |
これらの設定をすると、dev環境のURL(http://dev.takuminasuno.com)でアクセスしてWordPressの画面から作業や確認ができるようになります。
WPML.orgでアカウントを作成して、プラグインを購入します。今回は単一のブログなのでWPML Multilingual Blogを購入。お値段にして39ユーロ、日本円にして約6,000円ちょっとでした。
購入したら[Downloads]メニューから[Download WPML manually]が選べるので、そこからzipファイルをダウンロードできます。
zipファイルをダウンロードしたら、WinSCPなどで/tmpフォルダに格納したうえで、WordPressフォルダのwp_content/pluginsに移動させ、適切に権限設定しましょう。
1 2 |
sudo unzip sitepress-multilingual-cms.4.6.12.zip -d /var/www/html/takuminasuno.com/wp-content/plugins/ sudo chown -R apache:apache /var/www/html/takuminasuno.com/wp-content/plugins/sitepress-multilingual-cms |
あとはWordPressのPluginsメニューからWPML Multilingual CMSプラグインを有効化しましょう。これで準備完了です。
旧サーバーから、特定のディレクトリ、特定のデータテーブルから必要なデータを流し込みます。バージョンが結構変わっているので、すべてをそのまま持ってくると何が起こるか分からないので、必要な分だけ持ってくるようにします。
なお、ディレクトリ移行についてよく話に挙がるwp-content/pluginsに関しては、新環境に対して適切なバージョンがあると考えたので、必要なものを新規でインストールしなおすことにしました。
また、対象データテーブルのdumpファイル生成は以下のようなコマンドで行いました。テーブル構成を壊すリスクを減らすためにinsertのみに縛りましたが、結局これらテーブル構成は完全一致していたため、問題はありませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mysqldump --no-create-info \ --complete-insert \ --skip-triggers \ --skip-add-drop-table \ --databases {DATABASE_NAME} \ --tables wp_postmeta \ wp_posts \ wp_term_relationships \ wp_term_taxonomy \ wp_termmeta \ wp_terms \ wp_icl_translations \ -u root -p > /tmp/{DATABASE_NAME}.sql |
どちらかというと、なぜこれらテーブルだけでよいかというところがポイントです。詳しい話は割愛しますが、旧サーバーでのデータテーブルのレコードの入り方を見たところ、私のブログの運用方法ではこれらテーブルしか有効活用されていないことが分かったので、こういう絞り方をしました。
そのうえで新サーバーのMySQL(MariaDB)にて以下のコマンドで既存レコードを削除しつつデータを流し込みました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
-- トランザクションの開始 START TRANSACTION; -- 外部キー制約を一時的に無効化 SET FOREIGN_KEY_CHECKS = 0; -- 各テーブルの既存レコードを削除 use {DATABASE_NAME}; TRUNCATE TABLE wp_postmeta; TRUNCATE TABLE wp_posts; TRUNCATE TABLE wp_term_relationships; TRUNCATE TABLE wp_term_taxonomy; TRUNCATE TABLE wp_termmeta; TRUNCATE TABLE wp_terms; TRUNCATE TABLE wp_icl_translations; -- 外部キー制約を再度有効化 SET FOREIGN_KEY_CHECKS = 1; -- 変更をコミット COMMIT; EXIT; ダンプファイルを流し込む mysql {DATABASE_NAME} < /tmp/{DATABASE_NAME}.sql -u root -p |
ただ、データは流し込めばいいだけではなく、その後のデータ補正がつきものです。ここでは大きく分けて2つのデータ補正が必要でした。
①URLの書き換え
本番切り替え前に、http://dev.takuminasuno.comでちゃんと稼働するか確認したく、URLを一斉置換しました。Better Search Replaceというプラグインを使い、「https://takuminasuon.com」を「http://dev.takuminasuon.com」にまとめて置換しました。この際、GUIDも含めて全て置換しました。
②WPMLプラグイン関連テーブルのデータ補正
これが厄介だったのですが、WPMLプラグインのバージョンが3.0.2-aから4.612に大きく変わったことでデータの入り方が変わっており、そのままデータを流し込むだけではメディアライブラリが機能しない不具合が起きました。せっかくuploadsディレクトリを流し込んだのに画像が一覧に表示されないという悲しい事案です…。(なおファイルはあるのでブログ記事では画像表示される)
調査の結果、メディアファイルはファイルごとにwp_postsに1レコード、wp_postmetaに2レコード生成されていたのですが、以下の3テーブルについてレコードを追加する必要がありました。
つまるところ、WPMLではバージョンアップに伴って、メディアファイルについて言語ごとにデータ管理するようになったようです。ややこしい。。。
でもレコードを追加したらメディアライブラリで表示されるようになったので一件落着。
最新のWordPress環境で今までのテーマにて表示したら、デザイン崩れが若干数発生したのでテーマを修正しました。
一番のデザイン崩れは、WPMLの言語切り替えスイッチのCSSが完全に崩れていたことでした。原因は、WPMLがバージョン3.6.0以降になったことで
の2点がありました。これは現行の仕様に合わせてPHPとCSSを書き直すだけで解消しました。
dev環境で一通りの確認が取れたので、DNSレコードのAレコードを旧サーバーのIPアドレスから新サーバーのIPアドレスに更新します。DNSレコードが早く伝播するよう、TTLは300ほどで設定しておきます。
しばらくしたらPowerShellにてnslookupを実行してDNSレコードが伝播しているか確認しましょう。8.8.8.8(Google)と1.1.1.1(Cloudflare)で新しいIPアドレスを確認出来たら、まあ大丈夫でしょう。
1 2 |
nslookup takuminasuno.com 8.8.8.8 nslookup takuminasuno.com 1.1.1.1 |
DNSレコードが伝播していることを確認したら、SSL証明書を急ぎ取得します。以下の流れで一気にやりましょう。
1 2 3 |
sudo yum install certbot python3-certbot-apache sudo certbot certonly --apache -d takuminasuno.com sudo certbot renew --dry-run |
最後に、3番でhttp://dev.takuminasuno.comを前提に設定していたURLを本番環境であるhttps://takuninasuno.comに向けます。
①hostsファイルの設定
もうDNSレコードが設定されているので、hostsファイルに追記していたレコードは削除します。
②wp-configの設定
wp-config.phpファイルを開き、siteurlとhomeのURLを設定します。
1 2 3 4 |
vim /var/www/html/takuminasuno.com/wp-config.php ↓ define('WP_SITEURL', 'https://takuminasuno.com'); define('WP_HOME', 'https://takuminasuno.com'); |
③バーチャルホストの設定
http接続ではhttpsへのリダイレクトを設定しつつ、https接続ではSSL接続を強制します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
vim /etc/httpd/conf.d/takuminasuno.com.conf ↓ # HTTP設定 (80番ポート) <VirtualHost *:80> ServerName takuminasuno.com ServerAlias www.takuminasuno.com DocumentRoot /var/www/html/takuminasuno.com DirectoryIndex index.html index.php ErrorLog /var/log/httpd/takuminasuno.com_error_log CustomLog /var/log/httpd/takuminasuno.com_access_log combined AddDefaultCharset UTF-8 # HTTPからHTTPSへのリダイレクト RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] <Directory "/var/www/html/takuminasuno.com"> AllowOverride All Require all granted </Directory> </VirtualHost> # HTTPS設定 (443番ポート) <VirtualHost *:443> ServerName takuminasuno.com ServerAlias www.takuminasuno.com DocumentRoot /var/www/html/takuminasuno.com DirectoryIndex index.html index.php ErrorLog /var/log/httpd/takuminasuno.com_error_log CustomLog /var/log/httpd/takuminasuno.com_access_log combined AddDefaultCharset UTF-8 SSLEngine on SSLCertificateFile /etc/letsencrypt/live/takuminasuno.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/takuminasuno.com/privkey.pem <Directory /var/www/html/takuminasuno.com> AllowOverride All Require all granted </Directory> Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" </VirtualHost> |
④URLの書き換え
改めてBetter Search Replaceというプラグインを使い、「http://dev.takuminasuon.com」を「https://takuminasuon.com」に置換しなおしました。この際、GUIDも含めて全て置換しました。
ということで、これら10段階を踏むことで、無事、新サーバーでブログを運用できるようになりなした。
最後に後片付けということで
を行いました。今回は旧サーバーも新サーバーもConoHa VPSを利用しているのですが、同じレンジのプランでもSSDが50GBから100GBに増えており、単価も心なしか安くなったようで6年の歳月を感じてちょっとビックリしました。
引き続きConoHaのサーバーは高速にブログを表示してくれるので、いい感じです。
めでたしめでたし。