インフラエンジニアの金澤です。
この度、ランサーズ稼働環境(PHP + CakePHP)のバージョンアップを決断しました。
まずは私から、その経緯と計画についてお話いたします。
バージョンアップ決断の理由
ランサーズは、2008年にサービスを開始しました。
現在、PHP 5.3.29 + CakePHP 1.3.6 で稼働しており、長らくバージョンアップせずに開発を続けてきましたが、今回、PHP 7 + CakePHP 3までバージョンアップすることを決断しました。
その理由は、主に以下になります。
旧バージョンのサポート終了
PHP 5.3もCakePHP 1.3も、サポートが終了しています。
今後、特にセキュリティに関わるバグが報告された場合、今のバージョンを続ける限り、自分たちで対応する必要があります。
(実際、独自に手を入れている箇所がいくつか存在します)
ライブラリバージョンアップへの追従
サードパーティが提供するPHPライブラリも、PHP5.3をサポートしなくなってきています。
例えば、以下のライブラリです。
- FaceBookSDK
- 最新バージョンをインストールするにはPHP 5.4以上が必要になります
- AWS SDK
- 最新バージョンをインストールするにはPHP 5.5以上が必要になります
最新ライブラリを利用するためには、要求するPHPバージョンまで追従する必要がありました。
開発生産性向上とエンジニア採用
開発エンジニアからも、新しいPHPの関数が使えないことを嘆く声が出ていました。
PHPの古いバージョンで好んで開発したいエンジニアはほとんどいないでしょう。
最新のPHP、CakePHPの提供するライブラリを利用できれば、開発生産性の向上が期待できます。
また、常に最新の技術を採用し続けることで、エンジニアにとっても魅力的な開発環境を提供したいと思いました。
バージョンアップ計画
今回、バージョンアップの幅がかなり大きくなるので、条件を整理しました。
- PHP 5.4にするには、Apacheのバージョンアップが必要(後述)
- PHP 5.4→5.5→5.6については、大きな構成変更は生じない
- CakePHP 3にするには、PHP 5.6以上が必要
- PHP 7ではCakePHP 1.3はまともに動かない
- 昨年のエンジニア合宿で検証済
上記の条件を踏まえ、バージョンアップは、以下のフェーズに分け、段階的に行うことにしました。
- Apache + mod_php → Nginx + PHP-FPM移行
- PHP 5.3 → PHP 5.6移行
- CakePHP 1.3 → CakePHP 3移行
- PHP 5.6 → PHP 7移行
Apache + mod_php → Nginx + PHP-FPM移行
現在のランサーズは、Amazon Linux + Apache(httpd)2.2 + mod_php で稼働しています。
※以前はCentOS6で稼働していたのですが、昨年Amazon Linuxに移行しました。
Amazon LinuxのyumでPHPをインストールすると、Apache(httpd)もセットでインストールされます。
PHPとApache(httpd)のバージョン組み合わせは以下の通りです。
php | httpd |
---|---|
5.3.29 | 2.2.31 |
5.4.45 | 2.4.25 |
5.6.30 | 2.4.25 |
つまり、yumでPHPを5.3からバージョンアップすると、Apache(httpd)も2.4にバージョンアップされます。
Apache(httpd)2.2と2.4では設定ファイルの構成が大幅に変更されていますので、単純に2.2の設定ファイルをそのまま使うというわけにはいきません。
移行するなら、設定項目を1から見直す必要があります。
設定を1から見直すのであれば、Apache + mod_php以外の選択肢も候補に入ります。
今回は、パフォーマンスの向上が期待できるNginx + PHP-FPMを採用しました。
PHP 5.3 → PHP 5.6移行
Nginx + PHP-FPMの移行が終わったら、PHPを5.6までバージョンアップします。
PHP 5.6までバージョンアップするには、以下の条件を満たすようにソースを修正する必要があります。
- PHP 5.3.x から PHP 5.4.x への移行
- PHP 5.4.x から PHP 5.5.x への移行
- PHP 5.5.x から PHP 5.6.x への移行
当初、PHP 5.4 → PHP 5.5 → PHP 5.6と段階的にバージョンアップする計画でしたが、PHP5.4では関連ライブラリのインストールが難しく、断念しました。
PHP 5.6へ一気にバージョンアップする計画は、一度に修正する量は多くなりますが、総合的に考えてこちらの方が速く移行できると判断しました。
CakePHP 1.3 → CakePHP 3移行
ここが一番の難関になります。
CakePHP 1.3 → 2移行は大きな壁で、稼働中のサービスをどのように移行するのか、課題が山積みです。
しかしながら、CakePHP 2 → 3移行は、それと比較すれば、それほど難しくないと見積もっています。
移行状況や以降方法次第で計画が変更される可能性はありますが、現在はCakePHP 1.3 → CakePHP 3に一気に移行する計画を立てています。
CakePHP 1.3 → 3移行は、実績がほとんどないので、大きなチャレンジになります。
2017/5/30追記:
すみません。雑に書きすぎました。
CakePHP2→3の方が大変ではないかという意見を多く頂きましたので補足させてください。
開発エンジニアからも、CakePHP2→3のほうが大変だという意見が出ています。
(特に、CakePHP2→3でモデル周りが全部変更されている点など)
その一方で、古株のエンジニアは、CakePHP本体にも修正を入れている点を懸念しております。
(過去のセキュリティアップデートを自前で組み込んだり、独自の機能のためにcoreソースを書き換えている箇所が結構存在します)
CakePHP2に移行するには、
- UTを完全整備(過去の試みはことごとく失敗)
- ランサーズ独自の修正を完全に撤廃(かなり大変)
- UTをチェックしながらCakePHP1.3→2へ移行
というステップが必要になります。
逆に、ここまでできれば、体制がかなり整います。
CakePHP2→3はランサーズ独自の修正がない状態で取り掛かれますし、他社での移行事例や意見もそのまま参考にできます。
とはいえ、CakePHP2→3の移行は、一般的にはCakePHP1→2よりも大変な作業になります。
(「難しくない」という表現が適切ではありませんでした)
同じ苦労を2度するのであれば、一度にやる方法も検討しても良いのではないかという意見もあります。
(CakePHP1.3のbootstrap.phpのuriのパス指定で3.4.xに切り替える方法で移行した方もいるとのこと)
何れにせよ、ここはまだ明確な結論が出ていません。
今後も議論しながら、現状は、今できる作業を着実に進めている状態です。
※ここら辺、知見のある方に是非ご意見いただきたいです。
PHP 5.6 → PHP 7移行
CakePHP 3に移行できれば、PHP 7に移行できます。
PHP 7は実装が新しくなり、5.6まで維持していた互換性を排除している部分も多いので、この移行作業は1フェーズとし、じっくり行う予定です。
※PHP 7.1も検討していましたが、現状、Amazon LinuxのyumリポジトリではPHP 7.0までしかサポートしていないため、現状は7.0までアップデートする計画にしています。
現在の状況
Nginx + PHP-FPM化
ほぼ検証が完了し、近日中に移行予定です。
移行が完了しましたら、その結果をブログに書きたいと思います。
PHP 5.3 → 5.6化
Nginx版でPHP5.6をインストールした開発環境用Dockerコンテナを構築中です。
ランサーズではDockerで開発環境を構築しています。
PHP 5.6のコンテナを構築し、PHP5.3版とは別にDockerレジストリにアップしておきます。
開発エンジニアは、利用するコンテナをPHP5.3、PHP5.6に自由に切り替えることができるので、この仕組みで互換性を検証していく予定です。
UTテストジョブの整備
現状のUTテストジョブのうち、正常に終了しないものや、非常に時間がかかるものがあります。
そのため、CIを完全に回しきれていない状態です。
バージョンアップによるエラーやバグを速やかに検知できるように、全て正常終了し、かつCIを現実時間内に回せるレベルまで整備中です。
エンジニア合宿
5/27~5/28にエンジニア合宿を行います。
UTのテストジョブ整備を中心に、プロジェクトを推進する予定です。
PHPカンファレンス登壇
6/10(金)PHPカンファレンス福岡 で登壇予定です。
http://phpcon.fukuoka.jp/2017/
今回ブログに書かせていただいた内容を、さらに詳しく発表したいと思います。
エンジニア募集中!
ランサーズでは、このバージョンアップのプロジェクトに協力していただけるエンジニアを募集しています。
PHP/CakePHP大規模なバージョンアップを推進するエンジニアを募集!
本プロジェクトに興味を持った方と、是非一緒に推進したいです!
いよいよ、プロジェクトが本格的に始動します。