blog2022/03/03に公開2022/04/07PHPnginxCakePHPマイグレーションtechはじめにこんにちは。エンジニアリングマネージャーの三井と申します。ペライチではオフショア開発の立ち上げからオフショア開発のプロジェクト推進を行っております。オフショアのプロジェクトにつきましては以下に簡単なご紹介記事がございますので合わせてお読み頂けますと幸いです。https://qiita.com/mitsui_peraichi/items/a13bee395da3281c8622現在ペライチでは保守開発として、現行CakePHP2からCakePHP4へのバージョンアップ作業を行っております💪。背景としまして、かねてから新規機能開発を優先してきた結果、保守開発が後手にまわってきたことと、セキュリティリスク排除のため、経営的な意思決定としてCakePHP2を4系にジャンプアップすることにしました。このシリーズではバージョンアップ作業の中で発生した技術的課題とそのアプローチ方法などを抜粋してご紹介したいと思います。今回のCakePHPのバージョンアップにおきましては、既存の開発を止めずに移行したいため、方式として以下の通り単一リポジトリ内にCakePHP2とCakePHP4の2つのフレームワークを共存させ段階的に移行しております。上記のような段階移行を行うための共存環境を作るにあたっては、以下のような技術的課題をクリアする必要があります。CakePHP4)CakePHP2/CakePHP4間でのセッションの共有この中で今回は、太字部分の機能単位でのリクエストの振り分け方法についてご紹介できればと思います。7.4利用ドメイン:peraichiapp.com上記は1サーバにおける環境です(CakePHP2/4の共存環境)。CakePHP2/PHP5.6についてはCakePHPのマニュアルに従って、nginxでCakePHPを利用する設定を行っているものとします。フロントエンド(webroot配下)はCakePHP2/PHP5.6側を使用しているものとします。振り分けイメージ以下の通りアクセスするリクエストに応じてnginxが振り分け、動作するバックエンドが変わります。前述の通りnginxで振り分けを行います。具体的にはnginxのバーチャルホストを使用し、CakePHP4用のアクセスを追加し、proxy_passディレクティブを用いてリクエストURLに応じてCakePHP4へ振り分けます。実際の手順は以下です。次項より設定方法を紹介します。振り分け手順1.CakePHP4用のバーチャルホストの追加📄nginxのconfファイルに既存のCakePHP2用の設定に加え、CakePHP4アクセス用のバーチャルホストの設定を行います。}}👆listenディレクティブに重複しないポートを新規に設定する以外は、CakePHP4+PHP7.4インストール時の情報を入力してください。(ここでは/var/www/hoge/cake_v4/webroot/をCakePHP4のドキュメントルートにしております)2.proxy_passによる振り分け設定📄フロントエンドへのアクセス振り分けまずは、フロントエンドのリソースは全てCakePHP2で処理するように、CakePHP2用のserverコンテキスト内に以下を定義します。アクセスをCakePHP4で処理したい場合、CakePHP2用のserverコンテキスト内に以下を定義します。}👆なお、上記は区切りのないシンプルなURLですが、区切りがあるURLを振り分ける場合は、振り分けたいアドレスを全て定義する必要があります。{👆上記は設計次第かと思いますので適宜追加するようにしてください。このような設定により特定の機能のみ、CakePHP4で処理されるようになります。(nginxの再起動はお忘れなく)設定から分かる通り、ユーザからのリクエストをCakePHP2側のserverで受け、URIによってCakePHP4に振り分けています。まとめいかがだったでしょうか。上記により、複数バージョンのCakePHPを共存させながら、Controller単位ではありますが段階移行を行うことができます。注意点としまして、CakePHP2/CakePHP4どちらに振り分けられたかの確認が難しく、デバッグなどを使って確認するしかないためご注意ください。実際のnginxの設定はCakePHP2とCakePHP4間のセッション共有などもあるため、ここからさらに追加の定義が必要となりますがこれは別途ご紹介とさせてください。今回の記事がCakePHPに限らずフレームや言語のバージョンアップにおけます移行方式の参考になりますと幸いです。読んでいただきありがとうございました。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。