色々あってほぼ1日溶かした。Linuxよくわからんのです。一応最終的には解決できたわけで備忘録を残す。
主にハマったポイント
- ci4では必須のPHP intlモジュールが入っていなかった。
- パーミッション設定。
- .htaccessが効かない
前提環境
OS | AlmaLinux |
WEBサーバ | apache |
php | 8.1.12 |
PHP intlモジュールをインストールしても、phpinfoに表示されない問題。
インストール方法は「php intl インストール」等で調べてすぐにわかった。今回参考にしたのは下記のサイト様。
だがこの通りにやってもcodeigniter4ではエラーのままだった。この時の状態は、phpコマンドでは認識されているけれど、phpinfoにもintlブロックが表示されず、phpファイルでも認識されない。
apacheは再起動しているし・・・なんだろう。と悩むこと3時間。
答えはphp-fpmを再起動していなかったこと。
確認コマンドと再起動コマンドは以下の通り。
確認コマンド
systemctl status php-fpm.service
再起動コマンド
systemctl restart php-fpm.service
パーミッションを777にしてもwritableフォルダに書き込み権限を付与できない問題。
実際に出ていたエラーは下記となる。
CodeIgniter\Cache\Exceptions\CacheException
パーミッション問題は割りと良くあるので、とりあえず775にしたが改善せず。そして777でも改善せず。なんだこれ。
ここから3時間ほど調べたり悩んだり。
原因はSELinuxのセキュリティだった。
パーミッションとは別に、SELinuxがファイルやディレクトリへのアクセスや書き込みをブロックしているらしい。下記のコマンドで解除できた(フォルダパスは例)。
chcon -Rv --type=httpd_sys_rw_content_t /var/www/app/writable/
stack overflowはマジで神。githubのissueにもあがってたけど。
.htaccessが効かない問題。
本番環境はルートディレクトリ直下にデプロイするんだけれど、開発環境ではサブディレクトリに配置しているため、publicフォルダの.htaccessにRewriteBaseを記述しているが、これが効いてないようだった。
RewriteBase /xxxxx-api
当然ci4の404オーバーライドも効いていない。
httpd.confで、.htaccessでのオーバーライドが許可されていなかった。
これはそんなには迷わずたどり着けた。どちらかというと、.htaccessが原因というところまでたどり着くのにそこそこ費やした。
下記コマンドでhttpd.confを探し編集する。
find / -name 'httpd.conf'
その後、下記のドキュメントルートあたりのAllowOverrideを編集して、許可する。今回はSTG環境のためAllとした。
<Directory "/var/www/html">
Options Indexes FollowSymLinks
# AllowOverride None
AllowOverride All
Require all granted
</Directory>
もちろん、すべての人に当てはまるトラブルシューティングではないが誰かの助けになると良いなぁ。