🐙

CakePHP2からCakePHP4へのバージョンアップ 〜其の1 共存環境におけるリクエストの振り分け方編〜

2022/03/03に公開

はじめに

こんにちは。株式会社ペライチ のエンジニアリングマネージャーの三井と申します。
ペライチではオフショア開発の立ち上げからオフショア開発のプロジェクト推進を行っております。オフショアのプロジェクトにつきましては以下に簡単なご紹介記事がございますので合わせてお読み頂けますと幸いです。

https://qiita.com/mitsui_peraichi/items/a13bee395da3281c8622

現在ペライチでは保守開発として、現行CakePHP2からCakePHP4へのバージョンアップ作業を行っております💪。

背景としまして、かねてから新規機能開発を優先してきた結果、保守開発が後手にまわってきたことと、セキュリティリスク排除のため、経営的な意思決定としてCakePHP2を4系にジャンプアップすることにしました。

このシリーズではバージョンアップ作業の中で発生した技術的課題とそのアプローチ方法などを抜粋してご紹介したいと思います。

移行方針と技術的課題

今回のCakePHPのバージョンアップにおきましては、既存の開発を止めずに移行したいため、方式として以下の通り単一リポジトリ内にCakePHP2とCakePHP4の2つのフレームワークを共存させ段階的に移行しております。

段階移行のイメージ

上記のような段階移行を行うための共存環境を作るにあたっては、以下のような技術的課題をクリアする必要があります。

  • 同一リポジトリで異なるバージョンのFW/言語の共存(ペライチではCakePHP2+PHP5系とCakePHP4+PHP7系の共存)
  • 同一ドメインにおいて、機能単位(Controller)でリクエストの振り分け(CakePHP2 or CakePHP4)
  • CakePHP2/CakePHP4間でのセッションの共有

この中で今回は、太字部分の機能単位でのリクエストの振り分け方法についてご紹介できればと思います。

CakePHP2/CakePHP4間でのリクエストの振り分け方のご紹介

環境

  • Amazon Linux 2
  • nginx
  • CakePHP 2/PHP 5.6
  • CakePHP 4/PHP 7.4
  • 利用ドメイン:peraichiapp.com

上記は1サーバにおける環境です(CakePHP2/4の共存環境)。

CakePHP2/PHP5.6についてはCakePHPのマニュアルに従って、nginxでCakePHPを利用する設定を行っているものとします。

なお、フロントエンド(webroot配下)はCakePHP2/PHP5.6側を使用しているものとします。

振り分けイメージ

以下の通りアクセスするリクエストに応じてnginxが振り分け、動作するバックエンドが変わります。


メルマガ機能(CakePHP2で動作)
[https://peraichiapp.com/crm_mail_magazines]
ショップ管理機能(CakePHP4で動作)
[https://peraichiapp.com/shops]

nginxによる振り分けのイメージ

振り分け方式

前述の通りnginxで振り分けを行います。
具体的にはnginxのバーチャルホストを使用し、CakePHP4用のアクセスを追加し、proxy_passディレクティブを用いてリクエストURLに応じてCakePHP4へ振り分けます。

実際の手順は以下です。

  1. CakePHP4用のバーチャルホストの追加
  2. proxy_passで振り分けの設定

次項より設定方法を紹介します。

振り分け手順

1.CakePHP4用のバーチャルホストの追加📄

nginxのconfファイルに既存のCakePHP2用の設定に加え、CakePHP4アクセス用のバーチャルホストの設定を行います。

下記の (ここから追加)CakePHP4+PHP7.4用のバーチャルホスト定義 からが追加部分です。

/etc/nginx/conf.d/vhost-peraichi.conf
server {
    listen       80;
    server_name  peraichiapp.com ;
    access_log  /var/log/nginx/access.log  main;

    location / {
        root   /var/www/hoge/app/webroot;
        index  index.php;
        try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args;
        location ~ ^\/images\/.*\.(jpg|gif|png|jpeg|svg) {
            expires 7d;
        }
    }

    location  ~\.php$ {
        try_files       $uri =404;
        root   /var/www/hoge/app/webroot;
        index  index.php;
        fastcgi_pass   unix:/var/run/php-fpm/php56-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        /etc/nginx/fastcgi_params;
    }

### (ここから追加)CakePHP4+PHP7.4用のバーチャルホスト定義
server {
    listen       8888;   
    access_log  /var/log/nginx/cake4_access.log  main;

    location / {
        root   /var/www/hoge/cake_v4/webroot/;
        index  index.php;
        try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args;
        location ~ ^/images/.*.(jpg|gif|png|jpeg|svg) {
            expires 7d;
        }
    }
    location  ~.php$ {
        try_files       $uri =404;
        root   /var/www/hoge/cake_v4/webroot/;
        index  index.php;
        fastcgi_pass   unix:/var/run/php-fpm/php74-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }
}

👆listenディレクティブに重複しないポートを新規に設定する以外は、CakePHP4+PHP7.4インストール時の情報を入力してください。
(ここでは/var/www/hoge/cake_v4/webroot/をCakePHP4のドキュメントルートにしております)

2.proxy_passによる振り分け設定📄

フロントエンドへのアクセス振り分け

まずは、フロントエンドのリソースは全てCakePHP2で処理するように、CakePHP2用のserverコンテキスト内に以下を定義します。

/etc/nginx/conf.d/vhost-peraichi.conf
    # フロントエンドリソースへのアクセスはCakePHP2側へ
    location ~* \.(js|css|scss|jpg|gif|png|jpeg|svg|ico|otf|eot|ttf|woff|woff2|eot|swf|pug|html|pdf)$ {
        root   /var/www/hoge/app/webroot;
    }

CakePHP4への振り分け

例として https://peraichiapp.com/shops へのアクセスをCakePHP4で処理したい場合、
CakePHP2用のserverコンテキスト内に以下を定義します。

/etc/nginx/conf.d/vhost-peraichi.conf
    # shop機能へのアクセスはCakePHP4側へ
    location ~* ^/shops {
        proxy_pass http://localhost:8888$request_uri;
    }

👆なお、上記は区切りのないシンプルなURLですが、区切りがあるURLを振り分ける場合は、振り分けたいアドレスを全て定義する必要があります。

例:以下URLを許可する場合
[https://peraichiapp.com/domain_dashboards]
[https://peraichiapp.com/DomainDashboards]

    location ~* ^/(domain_dashboards|DomainDashboards) {

👆上記は設計次第かと思いますので適宜追加するようにしてください。

このような設定により特定の機能のみ、CakePHP4で処理されるようになります。
(nginxの再起動はお忘れなく)

設定から分かる通り、ユーザからのリクエストをCakePHP2側のserverで受け、URIによってCakePHP4に振り分けています。

まとめ

いかがだったでしょうか。上記により、複数バージョンのCakePHPを共存させながら、Controller単位ではありますが段階移行を行うことができます。
注意点としまして、CakePHP2/CakePHP4どちらに振り分けられたかの確認が難しく、デバッグなどを使って確認するしかないためご注意ください。

なお、実際のnginxの設定はCakePHP2とCakePHP4間のセッション共有などもあるため、ここからさらに追加の定義が必要となりますがこれは別途ご紹介とさせてください。

今回の記事がCakePHPに限らずフレームや言語のバージョンアップにおけます移行方式の参考になりますと幸いです。
以上です。読んでいただきありがとうございました。

採用情報

ペライチの開発は面白そうなことしてるなー、と思ったそこのあなたに朗報です!

現在エンジニア募集しています!

▼ 選考をご希望の方はこちら(募集職種一覧)
https://hrmos.co/pages/peraichi/jobs?category=1629135637016141824&utm_source=techblog&utm_medium=referral&utm_campaign=article-01fwfv1gwx4jnzdhst2cw0afrv

▼ まずはカジュアル面談をご希望の方はこちら
https://hrmos.co/pages/peraichi/jobs/0000029?utm_source=techblog&utm_medium=referral&utm_campaign=article-01fwfv1gwx4jnzdhst2cw0afrv

募集中の職種についてご興味がある方は、お気軽にお申し込みください(CTOがお会いします)

ペライチ

Discussion