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接続時に問題が発生します。
- MySQLのユーザパスワードハッシュが16 バイト文字列(古いタイプのハッシュ方式)である
- MySQLの設定ファイルで「old_passwords = 1」が設定されている、もしくは記載がない場合、MySQLのバージョンによっては古いパスワードハッシュが作成されることがあります
- 新しいパスワードハッシュ(41 バイト文字列)はMySQL 4.1.1から利用できますが、上記理由により古い形式でパスワードが作成されていること多いです
- PHPのバージョンが5.2以前から、5.3以降へと変更された
- PHP 5.3以降では、PHPのMySQLドライバがmysqlndライブラリに変更され、41バイトのパスワードフォーマットを利用するようになった
- 上記のためMySQLユーザのパスワードが16バイトの状態では、接続エラーが発生する
- ダイナミックパブリッシング / DynamicMTMLの機能を利用している
- PHPからのMySQL接続が失敗するため、ダイナミックパブリッシング及び同機能を利用するDynamicMTMLが動作しない
- 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
以下のどちらかを実施することで、問題が回避できます。
- 既存ユーザのパスワードハッシュを変更する
- old_passwords=0 をMySQLの設定ファイルに指定して、MySQLプロセスをリスタートする
- 長いパスワードハッシュを使用するために、ユーザのパスワードを再設定する
- 新たに長いパスワードハッシュを持ったユーザを作成し利用する
- "old_passwords=0" をMySQLの設定ファイルに指定して、MySQLプロセスをリスタートする
- 新たに接続ユーザを作成する
- mt-config.cgiのDBUserに新しいユーザを設定する
MySQLの設定を行った後で、プロセス・リスタートが必要です。それまでは設定が反映されていないので、短いパスワードハッシュで作成されてしまいます。(実はリスタートせずに上手く行かず、小一時間悩んでいたのは私です。)
リスタートできない状況では、下記のようにSQLを実行することでもパスワードの再設定が可能です。
SET @@session.old_passwords = 0; SET PASSWORD FOR 'melody'@'localhost' = PASSWORD('ne1s0n');
- カテゴリー
- DynamicMTML
- トラブルシューティング
コメントを投稿する