CakePHP2からCakePHP4へのバージョンアップ 〜其の1 共存環境におけるリクエストの振り分け方編〜
はじめに
こんにちは。株式会社ペライチ のエンジニアリングマネージャーの三井と申します。
ペライチではオフショア開発の立ち上げからオフショア開発のプロジェクト推進を行っております。オフショアのプロジェクトにつきましては以下に簡単なご紹介記事がございますので合わせてお読み頂けますと幸いです。
現在ペライチでは保守開発として、現行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のバーチャルホストを使用し、CakePHP4用のアクセスを追加し、proxy_passディレクティブを用いてリクエストURLに応じてCakePHP4へ振り分けます。
実際の手順は以下です。
- CakePHP4用のバーチャルホストの追加
- proxy_passで振り分けの設定
次項より設定方法を紹介します。
振り分け手順
1.CakePHP4用のバーチャルホストの追加📄
nginxのconfファイルに既存のCakePHP2用の設定に加え、CakePHP4アクセス用のバーチャルホストの設定を行います。
下記の (ここから追加)CakePHP4+PHP7.4用のバーチャルホスト定義 からが追加部分です。
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コンテキスト内に以下を定義します。
# フロントエンドリソースへのアクセスは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コンテキスト内に以下を定義します。
# 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に限らずフレームや言語のバージョンアップにおけます移行方式の参考になりますと幸いです。
以上です。読んでいただきありがとうございました。
採用情報
ペライチの開発は面白そうなことしてるなー、と思ったそこのあなたに朗報です!
現在エンジニア募集しています!
▼ 選考をご希望の方はこちら(募集職種一覧)
▼ まずはカジュアル面談をご希望の方はこちら
募集中の職種についてご興味がある方は、お気軽にお申し込みください(CTOがお会いします)
Discussion