TEL 03-5454-3346 東京都渋谷区笹塚1-25-5-602

CMS Drupalのバージョンアップ

オープンCMSの Drupalは世界的にはよく使われています。しかし、同じくCMS Joomlaと同じように、日本であまり広まっていません。今では、日本でも多く使われているWordpressの前には、MovableTypeという名前のシステムがありました。当時は、顧客にWordpressを提案しても、納得してもらえませんでした。その後、MovableTypeは、日本だけで、異常に流行りましたが、姿を消していきました。

最新版の Drupal 8 では新しいサーバー環境への対応もさることながら、バージョンアップの方法自体が大きく変わりました。最初の作業では、かなり試行錯誤がありましたので、掲載した情報が何かの参考になればと思います。

バージョンアップの意味

CMSのシステムは、サーバー上で動作しているため、サーバーのバージョンアップに対応して、バージョンアップがどうしても必要です。

今まで使っていたCMSのシステムの開発が止まると、脆弱性の問題などが見つかっている場合、別のシステムに乗り換えなければなりません。全てのコンテンツが、機械的に乗り換えができるとは、限らないため、情報量が大きくなると、大きな作業になります。CMSの選定では、息の長いものを選ぶ事、移行しやすいものを選ぶ事が重要です。採用時には、世界的な利用状況が、参考になります。MovableTypeは日本だけで使われるようになり、世界的に使われている競合する他のシステムと比べ、脆弱性への対応、テンプレートや追加機能の開発で徐々に差がついて、廃れていきました。

さて、Drupalも6,7,8とバージョンが進んできて、最新の環境(サーバーのシステム)に合うようになってきました。一方、レンタルサーバーでは、古い環境が残っており、なかなかバージョンアップができませんでした。しかし、最近では、レンタルサーバーを提供する会社でもシステムの更新が盛んに行われるようになってきました。脆弱性を放置していると、攻撃を受けて、顧客に多大な迷惑かけ、信用を失い、顧客が離れてしまうからです。

Drupalバージョン8では大きな変更が行われ、バージョンアップはかなり変わっています。通常、CMSシステムのバージョンアップでは、作業中に何か起きた場合に、備えて、以下の2つの手順をとります。手順1で問題があれば、回避対応が取れるからです。

  1. テスト環境で、新バージョンをインストール後、データベースを移行して、更新プログラムによって、新バージョンでのサイト立ち上げ
  2. 本番環境にテスト環境のファイル、データベースを移設

ところが、Drupal 8 では新バージョンが現行サイトからデータを吸い上げて、移行が行われます。このことは、本家のサイトに詳しく書かれています(Drupal 8 のアップグレード)が、読んで理解するのと実際は大違いです。後からわかるのですが、これは、テストサイトを作って移行するという手法が使えないことを意味していました。

 

今回のバージョンアップの概略

現行サイトは Drupal 6 で、lolipopレンタルサーバー上でphp5.3で動作しています。実は、Drupal 6にバージョンアップする際、7も発表されていたのですが、8では、自動アップグレードができるという記述を目にして、8が安定するのを待っていました。

Drupal 8の動作要件は php5.5.9以上で、lolipopなら5.6/7へのアップが可能なので、問題はないと判断しました。しかし、これには、条件があり、一度、5.3からバージョンアップをあげると、元に戻せないのです。つまり、本サイトでDrupal 8が動作するようにphpのバージョンを上げてしまうと、元に戻せないのです。この為、以前のバージョンアップ作業手順に従い、一度、テストサイトで確認して、データベースやファイルを移設する手法をとりました。後でわかるのですが、この方法では、実際の移行はできなかったのですが、予行演習と問題回避に役立ちました。


Drupal 8 のインストール

本家の手順では、「Drupal 8 は移行用と比較用の2つを作れ」とあります。( Drupal 8 へのアップグレード) 今回は、テストサイトを社内に作成する予定だったので、なんの疑問も感じませんでしたが、やはり、最初は本サーバー上と、テストサーバー上でテストを行っておくべきでしょう。

弊社のローカル環境は php5.6です。Macintosh Sierra OS上の固有の問題として、「setting.phpを作成できない」という問題がありました。これは、書き込み可能なsetting.phpを作成することで解決します。

また、テストサイトなどでは、ルートにDrupalが導入されないので、.htaccessの変更が必要です。下記は、d8というフォルダー上にインストールした場合の.htaccess 117行目あたりの引用です。

# Modify the RewriteBase if you are using Drupal in a subdirectory or in a
# VirtualDocumentRoot and the rewrite rules are not working properly.
# For example if your site is at http://example.com/drupal uncomment and
# modify the following line:
# RewriteBase /drupal
RewriteBase /d8
# If your site is running in a VirtualDocumentRoot at http://example.com/,
# uncomment the following line:
# RewriteBase /

 次に、レンタルサーバー上に導入してみます。現行サイトの環境を変えることができないので、lolipopアカウントのサーバーでd8というフォルダーを作成して、インストースします。phpは5.6にアップして、データベースを用意しておきます。.htaccessには、同様に、上記変更が必要です。

ところが、システム要件を満たしているかと思った、lolipopの5.6では以下のエラーとなります。

libmysqlclient ドライバーのバージョン 5.1.73 は必要最低限の場ジョンよりも低いバージョンです。 libmysqlcilent のバージョン 5.5.3 以上にアップグレードするか mysql ドライバーを...

データベース周りのプログラムのバージョンが合いません。仕方なく、phpを7に上げることで、インストールが可能でした。

6から8へのアップグレード 

Drupal 8 ではアップグレードがコマンドを投げるだけで(指定のページ upgrade.php にアクセスするだけで)行われます。

その前の準備として、8側では 機能拡張 の コア(試験的)の中から"Migration ..."という3つのモジュールを選んで、インストールします。現行側では、新しく導入したモジュールなどを止め、テンプレートも標準に戻して起きます。ここで、colorとBookモジュールを止めていなかった為、エラーとなります。

管理画面ぐらい動作するかと思っていたのですが、 全く表示されませんでした。

当然といば、当然なのですが、6と8では共通するテンプレート(テーマ)がないのです。以前6にアップした時も、データベースを直接変更して、テンプレートを変更した覚えがあります。しかし、8のデータベースではどこに記述があるのか、見当もつきませんでした。大幅なテーブルの変更があったようです。

Drupal 7 のファイルをチェックしてみると、6と共通、8と共通のテンプレートが存在します。ここで、方針を転換して、一度、7にアップした後、8に再度アップすることにしました。

ただ、本家の手順には、6から直接8に上げられないという記述はないので、回避方法があったのかもしれません。


Drupal 7 へのアップグレード

6から7へのアップグレードは、通常のCMSシステムのバージョンアップ作業です。以下のような手順となります。

  1. テスト環境に現行サイトからファイルを移動する。データベースも移設して、テストサイトを作る
  2. 現行サイトで追加したモジュールなどは全て、テストサイト上では止める。テンプレートは、7でも使えるシステム標準のものを設定する
  3. Drupal 7 のシステムから、テストサイトへ必要なファイルを移動させる。テストサイト上のsite、module、themesの中身が上書きされないようにして、他の全てを移動させる。
  4. update.phpを起動。データベースがアップデートされ、テスト環境上のテストサイトがバージョンアップされる。

ここで、次の事実が判明する。

  • Bookはアップデートされない。このサイトでは数十ページであった為、手作業で再構築。
  • テスト環境にFTPがないため、必要な自動アップグレードができない。

Bookはともかく、必要な更新ができないのは、問題と考え、一度、レンタルサーバー上にバージョン7のテストサイトを移設しました。

7から8へのアップグレード 

テスト環境の8は、データベース上の全テーブルを削除して、再インストールを行いました。クリーンインストルなので、再度、"Migration ... "関連モジュールをインストールしました、レンタルサーバー上に作成したバージョン7のサイトは、8でも使用できるテンプレートに変更して起きます。

テスト環境の8からアップグレードを行います。うまくいきました。

テスト環境の8からデータベースをレンタルサーバー上のデータベースに移設して、lolipopアカウント/d8のサイトを、本サイトのドメインに切り替えます。この時点で、本サイトでもphp7である必要があり、旧サイトはバックアップされているものの、php5.3には戻せなくなっています。

6で動作していたテンプレートは8では動作せず、モバイル対応でもない為、新しいテンプレートを導入しようとしましたが、管理画面に、コンテンツが表示されてしまい、設定変更ができません。ボタンなどのリンクを調べてみると、なんと、テスト環境のパスのままです。データベースを調べてみると、そこら中に、テスト環境のパスが残っています。ここで、やっと、バージョン8の大変更の意味が理解できました。バージョン8では種々のパス(URL)をそのまま記録しているので、移設してもサイトを構築した時のパスが残ってしまう。テストサイトと本サイトが同じファイル構造でないと、データベースの移行はうまくいかないということです。

バージョン8では、本サイトの別フォルダーに新バージョンをインストール後、現行サイトからデータを取り込み、その後、現行サイトを閉鎖して、新バージョンを稼働させることになります。データベースの移設がでいないのは、コピーサイト作成防止には役立つかもしれませんが、今回のように、サイトの環境が絡むような場合、2度移行作業が必要なります。テストサイトで試しても、それを移行できないのは、作業を請け負う者には、負担に感じます。

6から8へのアップグレード再挑戦 

本サイトのバージョン8用のデータベースをクリアして、再インストールとUpgradeの準備(必要モジュールのインストール)を再度行います。サイト上のバージョン6のバックアップからデータを取り込むよう情報を設定すると、下記のエラーが出ます。

SQLSTATE[HY000] [2000] mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file
 

もはや、phpのバージョンが違い、バージョン6のサイトは動かなくなっています。Lolipopレンタルサーバー上では権限が制限されている為、対応ができません。

本サイト上で7から8へアップグレード

結局、本サイト上バージョン7のデータを使い、8へデータを移します。本サイトのバージョン8用のデータベースをクリアして、再々インストールし、Upgradeの準備(必要モジュールのインストール)も行います。Upgrade.phpを走らせ、本サイト上のバージョン7の情報を設定すると、無事、アップグレードが成功しました。

新しいテンプレートを導入し、Bookを修復して、なんとかアップグレード完了です。


まとめ

- Drupal 8系へのバージョンアップは、大きく変わり、新バージョンをサイト上に作成し、現行データを取り込む形で行われる。テストサイトを一度構築して、データベースやファイルを移設する方法は、ファイル構成が全く同じでないと、できないと考えられる。
- 今回は、サイトのシステム(php、MySQL)の影響で、移設作業中に、現行サイトへの復帰ができなくなった。データ移設はできないが、やはり、予行演習のためにもテストサイトでの作業は行っておいた方が安全である。
- 本体のバージョンアップはセキュリティの面からは、避けて通りれない。このため、テンプレートといくつかのモジュールは入れ替わった。それでも、バージョンアップは行うべきである。
- モジュール、テンプレートともDrupal.orgから採用していたため、入れ替えでの問題はほとんどななく、スムーズに移行できた。