php_modが非推奨になったのね

昔のバージョンのphp環境でphpバージョンを上げるという対応中。 apache + PHP8のインスタンスを構築してドキュメントルートまで到達を確認。 対応する人にドキュメントルートまで到達するからプロジェクトのファイルを置いてバージョンアップのエラーを確認してもらうため依頼しましたが HTTP 503 Service Unavailable のエラーが出ているとのこと。 HTMLファイルはアクセスできているからPHPの実行ができていないと思い調べると Apache HTTP サーバーで使用するために PHP に提供されている mod_php モジュールが非推奨になりました。 php-fpmをインストールして起動し、リクエストを流してphp-fmpでphpを実行するようにして解決。 しばらくPHPを触っていなかったのでモジュールが非推奨になったことに気づかずでした。

cakePHP3の.htaccessでrewriteできなくてはまる。。。②

cakePHP3でconfにrewriteの設定を記載したのに

効かなくて困った


先日の続きです

先日は対応に至った経緯を記事にしましたが
今回は何に困ったかに到るまでの作業編を書いていこうと思います

さ今回の対応の概要ですが
cakePHP3/apache/mysql/amazonLinux

今は管理者(企業)と利用ユーザーのシステなんですが
管理者(企業)は一つの環境構成に一つしか存在できない設計です

利用管理者(企業)企業が増えるたびにサーバなどの環境が無限に増えていくこの状況では運用コストもランニングコストも増え続けて利益とコストは比例型という状況を解消すべく今回は今まで一つの管理者のところ複数の管理者が共存できるように改修するわけです

といってもVirtualh Hostを作成してドキュメントルートを別に作成してもメンテナンスコストがかかるのでドキュメントルートは同じで管理者ドメインとDBも同一DBホスト内にdatabaseが増えていくような感じにしました
※本当はdatabase設計も変更して一緒にしたかったんですけどね。。

さて本題です

まずは、cakePHP3.4だったのですが環境設定ファイルはconfig配下でdevelop/productionの環境設定の定義が書かれたファイルを置き、environmentというファイルを作りこの中にdevelopと記載されていればdevelopのファイルを参照するって感じでした

独自で作ったんでしょうか?

しかも、Git管理されてしまっているのであんまりよろしくもありません。。

とりあえずこのままでは一つの管理者(企業)に用意した環境の設定した記載されません
今の状態でconfig/bootstrap.php記載されている記述をカスタマイズして複数設定を出来るようにしても良かったのですが他のプロジェクトで言語は違いましたが環境変数を使った設定をしたくこちらでも実装しようかなとそちらで対応することにしました

そして導入したのがこちら

Dotenv

基本的には、config/.envというファイルを置いて、Git管理外にしてとかするんですがそれだと元のまま一つしか設定はできないのでちょっとカスタマイズしました
ちなみにこの導入に一番参考になり分かり安かったのがこちらのサイトでした!

まずはcomposerでDotenvをインストールします
# composer require josegonzalez/dotenv:dev-master

そして参考にしたサイトにあるようにconfig/bootstrap.phpno42行目あたりに追記したんですが、今回は複数の設定が出来るようにgetenv('PROJECT_CODE')でアクセスするドメインに応じて設定ファイルが切り替わるように手をいれました

>> try {
>>     if(getenv('PROJECT_CODE')) {
>>         $dotenv_name = '.env' . DS . '.' . getenv('PROJECT_CODE') . 'Env';
>>     } else {
>>         $dotenv_name = '.env';
>>     }
>>     josegonzalez\Dotenv\Loader::load([
>>         'filepath' => __DIR__ . DS . $dotenv_name,
>>         'toEnv' => true
>>     ]);
>> } catch (InvalidArgumentException $e) {
>>     // do nothing in case the file doesn't exist
>> }

さてこのgetenv('PROJECT_CODE')ですが、環境変数です。apacheのvirtualhostのconfファイルでアクセスドメインごとに管理者(企業)の設定を切り替えるようにしたわけです

virtualhostのconfファイルには先ほどの
PROJECT_CODEを設定します

>> Define project project_code

project_codeは管理者(企業)ごとの個別の識別子を設定します

Define でprojectに一度設定しているのはログなどの名前も分けたかったので一箇所で記載すればその他の部分も反映させられるのでこうしました

>> Define project project_code
>> <VirtualHost *:80>
>>     ServerName domain.com
>>     DocumentRoot /var/www/html
>>     CustomLog      /var/log/httpd/${project}.log combined
>>     <Directory /var/www/html>
>>         RewriteEngine on
>>         RewriteCond %{REQUEST_URI} !^/img/${project}
>>         RewriteRule ^img/(.*)$ img/${project}/$1 [L]
>>         SetEnv PROJECT_CODE ${project} 
>>     </Directory> 
>> </VirtualHost>

ざっくりはこんな感じです
これでcakePHPのbootstrap.phpに追記した部分で、virtualhostごとに設定したプロジェクトの識別コードの設定ファイルを見にいくことになります

config/.env/.projec_codetEnv

厳密には元の.envファイルの場合にも対応できるように分岐させていますが、ファイルがなければcatchに入りますが何もしません(設定が何もないのでエラーになるだけです)

また長くなりましたので今回はここまで

次回は、管理者(企業)ごとにイメージディレクトリを分けるにあたり
        RewriteCond %{REQUEST_URI} !^/img/${project}
        RewriteRule ^img/(.*)$ img/${project}/$1 [L]
こちらの記載でリダイレクトループになった今回のタイトルの件がメインのお話になります!

前回はこちら cakePHP3の.htaccessでrewriteできなくてはまる。。。①

次の記事も書きました
前回はこちら cakePHP3の.htaccessでrewriteできなくてはまる。。。③

コメント

このブログの人気の投稿

nginxで画像が表示されない。。

AWSのS3バケットをマウントするs3fsでマウントが外れた件

CakePHP3でHTTPSにする