PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[新着情報] PowerCMS 4 系のサポート終了予定について を追加しました。
[新着情報] PowerCMS 4.58 の提供を開始 を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > トラブルシューティング > PHPのバージョンアップでDynamicMTMLが動作しなくなった場合の対処方法

2016年09月08日

PHPのバージョンアップでDynamicMTMLが動作しなくなった場合の対処方法

既存の「Movable Type」/「PowerCMS」環境を新環境に移行し、同時にミドルウェアのバージョンアップを行った場合に、PHPでのDB接続がうまく行えない現象が発生することがあります。
PHPでのDB接続が行えないため、DynamicMTMLを含むダイナミックパブリッシング機能が利用できなくなります。

この時PHPでは以下のエラーが発生しています。

"mysqlnd cannot connect to MySQL 4.1+ using old authentication"

この問題はPHPからの接続に関してのみ発生するので、管理画面操作に関しては影響しません。

問題発生の条件

以下の条件の時、PHPのDB接続時に問題が発生します。

  1. MySQLのユーザパスワードハッシュが16 バイト文字列(古いタイプのハッシュ方式)である
    1. MySQLの設定ファイルで「old_passwords = 1」が設定されている、もしくは記載がない場合、MySQLのバージョンによっては古いパスワードハッシュが作成されることがあります
    2. 新しいパスワードハッシュ(41 バイト文字列)はMySQL 4.1.1から利用できますが、上記理由により古い形式でパスワードが作成されていること多いです
  2. PHPのバージョンが5.2以前から、5.3以降へと変更された
    1. PHP 5.3以降では、PHPのMySQLドライバがmysqlndライブラリに変更され、41バイトのパスワードフォーマットを利用するようになった
    2. 上記のためMySQLユーザのパスワードが16バイトの状態では、接続エラーが発生する
  3. ダイナミックパブリッシング / DynamicMTMLの機能を利用している
    1. PHPからのMySQL接続が失敗するため、ダイナミックパブリッシング及び同機能を利用するDynamicMTMLが動作しない
    2. PHPからのDB読み出し時の問題なので、Perlから呼び出される管理画面操作などに関しては問題は発生しない

例えばCentOS の6系をデフォルト構成で使っている場合、インストールされるPHPが5.1系なので、そこからセキュリティ要件などを考慮してPHPのバージョンアップを行った場合には、この状態に該当してしまいます。

参考:MySQL でのパスワードハッシュ
参考:PHP 5.3 下位互換性のない変更点

対応方法

DynamicMTMLを利用するケースでPHP 5.3以降を使用する場合、MySQLの設定で短いパスワードハッシュを使用しないようにすることで、この問題を回避できます。
Movable Type / PowerCMSの設定ファイルである mt-config.cgi に記載されている、MySQL接続ユーザについて、パスワードハッシュを長いものに変更できれば、このエラーは発生しません。

参考:環境変数 DBUser

以下のどちらかを実施することで、問題が回避できます。

  1. 既存ユーザのパスワードハッシュを変更する
    • old_passwords=0 をMySQLの設定ファイルに指定して、MySQLプロセスをリスタートする
    • 長いパスワードハッシュを使用するために、ユーザのパスワードを再設定する
  2. 新たに長いパスワードハッシュを持ったユーザを作成し利用する
    • "old_passwords=0" をMySQLの設定ファイルに指定して、MySQLプロセスをリスタートする
    • 新たに接続ユーザを作成する
    • mt-config.cgiのDBUserに新しいユーザを設定する

MySQLの設定を行った後で、プロセス・リスタートが必要です。それまでは設定が反映されていないので、短いパスワードハッシュで作成されてしまいます。(実はリスタートせずに上手く行かず、小一時間悩んでいたのは私です。)

リスタートできない状況では、下記のようにSQLを実行することでもパスワードの再設定が可能です。

SET @@session.old_passwords = 0;
SET PASSWORD FOR 'melody'@'localhost' = PASSWORD('ne1s0n');

カテゴリー
DynamicMTML
トラブルシューティング
投稿者
小野崎@アルファサード

Recent Entries