会社サイトのPHP/MySQLを一気に更新した話

こんにちは。
ご飯や麺が大盛り無料なら大体そうしてもらう木村です。

 

先日、今後に備えてWebサーバのメンテナンスを行いました。
パッケージの更新や各種調整が主な作業だったのですが、パフォーマンスの向上や技術面での調査も兼ねてPHPとMySQLのアップデートを同時に行っています。

 

  • PHPを7.0へアップデート
  • MySQLも5.7へアップデート

 

という構成に上げています。
ちなみに、作業時点での最新版だったのですが、PHPが直後に7.1が出てしまいました…。

 

今回は、そんなアップデートを行う上で行った手順やはまったポイントについて書いてみたいと思います。


 

事前調査

まずは現在利用しているアプリケーションやミドルウェアの現在のバージョンを把握しておきます。
アップデート前はこんなバージョンでした。

 

  • PHP 5.3
  • MySQL 5.1

 

ホストがCentOS6なので、確かにこの辺が公式リポジトリにあるバージョンの最新版です。
(ちょっと前のレンタルサーバなんかはこんな構成だったかと思いますが、最近はMySQLはもうちょっと新しいかもしれません。)

 

現在設置されているPHP/MySQLに依存するアプリケーションはWordPressくらいですが、推奨構成はPHP 5.6/MySQL 5.6なので最新版であれば問題なさそうです。
PHP 7向けの対応が4.3で行われている事もリリースノートから確認できます。

 

…ここまでの調査を踏まえると問題なさそうな雰囲気があります。
が、万が一止まってしまっては一大事なので、Vagrantを利用して同じ状態を再現した上でアップデート回りのチェックを進めていきました。

 

PHPのアップデート

まずはPHPのアップデートを行いました。

 

何かしら不都合があるのではないかという予感がしていましたが、既存の環境を置き換えてphp.iniを再設定して完了でした。
特に凝った設定をしている訳ではなくほぼデフォルトに近い状態になっていたので、そのせいかもしれません。
動作確認も特に問題なしで、めでたしめでたしです。

 

MySQLのアップデート

お次はMySQLのアップデートですが、PHPとは打って変わって、こちらは少し難航しました…。

 

アップデート後の起動時に、mysql.userのテーブル構成が異なるせいかmysql.user tables is damaged. Please run mysql_upgrade.というエラーが表示されてしまい、単純に既存の環境を入れ替えるだけでは起動しなかったためです。

 

それであれば、

このようにmysqld_safeを権限回りのチェックをパスする状態(≒mysql.userを利用しない)で起動してアップグレードします。
これで修復はできたのですが、今度は通常のMySQLを起動すると一部のユーザーでログインできなくなってしまいました。

 

色々調査してみると、my.cnfold_passwords=1の記述が…。
MySQL 5.7.5からはold_passwords利用できなくなり、完全に古いパスワードでログインできなくなってしまっているので、これを何とかする必要があります。
しかし、流石に現状のパスワードの形式変換はできないため、アップグレード前に予めold_passwordsを解除した上で、ハッシュが短いユーザーのパスワードを再設定する事で解決する必要がありました。

 

一通りの予防策と手順を確認した所で再度通しで作業した所、問題は発生しませんでした。
こちらの動作確認も問題ありませんでしたので、無事に完了しています。

 

おわりに

今回通して実行してみて、事前に手元の環境で検証していたというのは非常に大きかったです。
特にMySQL回りはかなりバージョンをスキップしている為、何かしら問題が発生する予感がしていましたので大正解でした。

 

今後のメンテナンスですが、継続的に行うのはもちろん、EOLも気にしつつ進める必要があります。
PHPの場合、7.0と5.6のEOLは大体2年後までなので、それまでにはPHP7.1にする必要がありそうです。
MySQLは5.7の場合は2020年までなので、こちらはしばらくこのままでも良さそうです。
とはいえ、既に8.0の足音も聞こえてきていますので、こちらも出たら是非試してみたいなぁというのが正直な感想です。