WordPress及びphpMyAdminにアクセスできないエラー

PHP5.6のインストールを無事に終えて、WordPressにアクセスし当ブログが表示されるか確認したところエラーメッセージ「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」が表示されました。
phpMyAdminにもアクセスしたところ、こちらも同じメッセージでした。

PHPのインストールだけでは、どうやら足りないパッケージがあったようです。
MySQLのPHP拡張がインストールされているか確認します。

# php -m | grep mysql
mysql
mysqli

ちょっと、忘れましたが確かこの2つのモジュールが入っていたと思います。
しかし、エラーが表示される…。

調べると、PHP5.6でのデフォルトの拡張モジュールは「mysqlnd」となるようなのでインストールします。

# yum install --disablerepo=* --enablerepo=remi-php56 php-mysql

~ 略 ~

Installed:
  php-mysqlnd.x86_64 0:5.6.14-1.el5.remi

Dependency Installed:
  php-pdo.x86_64 0:5.6.14-1.el5.remi

Complete!

併せて、旧バージョンのPHPを削除した際にインストールされていたパッケージもインストールします。

# yum install --disablerepo=* --enablerepo=remi-php56 php-mbstring

~ 略 ~

Installed:
  php-mbstring.x86_64 0:5.6.14-1.el5.remi

Complete!

# yum install --disablerepo=* --enablerepo=remi-php56 php-mcrypt

~ 略 ~

Installed:
  php-mcrypt.x86_64 0:5.6.14-1.el5.remi

Complete!

他にも、php-gd、php-lastも同様にインストールしました。
もう一度MySQLのPHP拡張の確認をします。

# php -m | grep mysql
mysql
mysqli
mysqlnd
pdo_mysql

追加されました。
httpdを再起動します。

# /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: [Thu Oct 08 03:02:52 2015] [warn] module php5_module is already loaded, skipping
                                                           [  OK  ]

今度は警告が出てしまいました。
「モジュールは既にロードされているからスキップしました。」というような内容で、要は二重起動しようとしているということです。

# vi /etc/httpd/conf/httpd.conf

LoadModule php5_module        /usr/lib64/httpd/modules/libphp5.so


# vi /etc/httpd/conf.d/php.conf

#<IfModule prefork.c>
#  LoadModule php5_module modules/libphp5.so
#</IfModule>

1行目、6行目がファイル名で、その中にphp5_moduleがそれぞれロードされるようになっていたのが原因です。
どちらかをコメントアウトすると解決します。私は、上記8~10行目の通りphp.confの方をコメントアウトしました。

修正後、もう一度httpdを再起動します。

# /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

問題なく起動しました。

これで解決したかと思い、再びWordPressにアクセスしました。
すると今度は、「データベース接続確立エラー」の大きい文字が…
phpMyAdminはというと、やはり同じメッセージが…

原因を特定するためにコマンドからMySQLでログインしてデータベース、ユーザ、テーブルを確認

# mysql -u root -p
Enter password:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| iptablelog         |
| mysql              |
| performance_schema |
| phpmyadmin         |
| snort_log          |
| wordpress          |
+--------------------+
7 rows in set (0.00 sec)

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select User from user;
+-----------------+
| User            |
+-----------------+
| iptblog_usr     |
| pma             |
| root            |
| snort           |
| wp              |
+-----------------+
5 rows in set (0.04 sec)

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.00 sec)

問題はなさそうなので、PHPから接続する方に原因が…
PHPのエラーログを確認してみます。

# view /var/log/php_errors.log

PHP Warning:  mysqli_real_connect(): The server requested authentication method unknown to the client [mysql_old_password] in ~
PHP Warning:  mysql_connect(): The server requested authentication method unknown to the client [mysql_old_password] in ~

ログが吐き出されていました。
内容を調べると、mysqlndをアップデートすると、古いパスワードハッシュ化方式(16byte)ではデータベースに接続できず、新しいパスワードハッシュ化方式(41byte)にする必要があるようです。

# mysql -u root -p
Enter password:

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select Host,User,Password from user;
+-----------+-----------------+------------------+
| Host      | User            | Password         |
+-----------+-----------------+------------------+
| localhost | root            | 2ea1cef21c3ecd4b |
| localhost | wp              | 67dd004d67da48bc |
| localhost | iptblog_usr     | 499a50d1322a0370 |
| localhost | snort           | 411aba2e21c0a948 |
| localhost | pma             | 0abe3fec4f3e9473 |
+-----------+-----------------+------------------+
6 rows in set (0.00 sec)

確かに、パスワードが16文字となっています。
では、MySQLオプション設定ファイルとパスワードの変更です。

# vi /etc/my.cnf

~ 略 ~
old_passwords=0

~ 略 ~

4行目:old_passwords=1を上記のように書き換え、古いパスワードハッシュプラグインを無効にします。

次にパスワードの変更です。

# mysql -u root -p
Enter password:

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> set password = password('xxxxxxxx');
Query OK, 0 rows affected (0.00 sec)

mysql> set password for wp@localhost=password('xxxxxxxX');
Query OK, 0 rows affected (0.00 sec)

mysql> select Host,User,Password from user;
+-----------+-----------------+-------------------------------------------+
| Host      | User            | Password                                  |
+-----------+-----------------+-------------------------------------------+
| localhost | root            | *CB10E1C9C2CE5D5B75F4D2775E7ADDC32AF8C4E9 |
| localhost | wp              | *E4D3BD8F0CD6B1695558C2A92BB8FF373D27E994 |
| localhost | iptblog_usr     | 499a50d1322a0370                          |
| localhost | snort           | 411aba2e21c0a948                          |
| localhost | pma             | 0abe3fec4f3e9473                          |
+-----------+-----------------+-------------------------------------------+
6 rows in set (0.00 sec)

9行目:rootユーザのパスワードを変更
12行目:rootでログインしているので、ユーザを指定してパスワードを変更
15行目:ユーザテーブルを確認
19,20行目:root及びwpユーザのPasswordの文字数が41文字と変更されている

同じようにすべてのユーザのパスワードを変更していきます。
MySQLと一応、httpdを再起動

# /etc/init.d/mysqld restart
mysqld を停止中:                                           [  OK  ]
mysqld を起動中:                                           [  OK  ]
# /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

これでもう解決したでしょう…
と、思いながらもちょっと不安気にアクセスしてみると…

やっとWordPressが表示されました。
phpMyAdminにもアクセスできました。

と、ここでもう一度ログを確認してみました。
PHPのエラーログは、異常なし…

そういえば、MySQLのログ見てないなぁ…
と思い見てみると、エラーが出てました。しかも、3年前ぐらいから…
でも今まで何でもなく使えているし…
調べてみると、

[ERROR] Column count of mysql.db is wrong. Expected 22, found 20. Created with MySQL 50095, now running 50540. Please use mysql_upgrade to fix this error.

というようなエラーが沢山出ていました。
「カラムが間違っているからmysql_upgradeコマンドを実行してください」という内容なのでコマンドを実行します。

# mysql_upgrade -u root -p
Enter password:

もう一度、念のためmysqldを再起動し、ログを確認すると異常なく動いているようです。

これで、PHPのバージョンアップデートによる一連の障害が解決できました。
改めて、ログを確認する大切さを痛感しました…