apacheで.htaccessのphp_valueが使えない(解決編)
こんばんは。
にしやまです。
前回問題提起編として未解決の問題を記事にしてしまったわけですが、、
無事解決できたので進捗を報告いたします!
あらすじ
前回は
apache「phpのモジュールがなくて.htaccessのphp_valueがわかんないよぉ^^;」
ぼく「phpのモジュール持っとるやないかーい」
という感じでした。
原因
原因としてはphpのモジュールが読み込めていなかったことでした。
というのも、前回あげたここ
cat /etc/httpd/conf.modules.d/15-php.conf
# Cannot load both php5 and php7 modules
<IfModule !mod_php5.c>
<IfModule prefork.c>
LoadModule php7_module modules/libphp7.so
</IfModule>
</IfModule>
の<IfModule prefork.c>
というところで弾かれてphpのモジュールがロードされていませんでした。
そもそもpreforkって何
prefork
というのはapacheのMPMの種類の一つで他にはworker
とevent
というものがあります。
MPMとは
※MPMについては僕も今日初めて存在を知っていろいろググった程度の知識しかないので引用を基本とさせていただきます。
MPM は (Multi Processing Module) の略で、Webブラウザからのリクエストを Apache がどのように並行処理するか、という部分の処理をモジュール化したものです。 Apache MPMとはなんぞやという話
下はapacheの公式
- workerMPMは、多くのスレッドごとに複数の子プロセスを使用しています。各スレッドは一度に1つの接続を処理します。一般にワーカーは、prefork MPMよりもメモリフットプリントが小さいため、トラフィックの多いサーバーに適しています。
- eventMPMは、ワーカーMPMのようにねじ込まれ、より多くの要求は、スレッドをサポート新しい要求上で動作するように、メインスレッドを解放するためにいくつかの処理作業をオフに渡すことで同時に提供できるように設計されています。
- preforkMPMは、それぞれ1つのスレッドで複数の子プロセスを使用しています。各プロセスは一度に1つの接続を処理します。多くのシステムでは、preforkの速度はworkerに匹敵しますが、より多くのメモリを使用します。Preforkのスレッドレス設計は、状況によってはワーカーよりも利点があります。非スレッドセーフのサードパーティモジュールで使用でき、スレッドデバッグサポートが不十分なプラットフォームではデバッグが容易です。
Apache MPMイベント
【図解/apache】MPM prefork/worker/event の違い
なるほど。わからん。
たぶんだけど、worker, eventはCGI版用でpreforkはモジュール版用ってことかな?
workerかeventにするならphp-fpm使っとけってことだと思う。(適当)
このへんよくわかってないからまたちゃんと調べないとだね。
あと、話それるんだけど、
みたいな表記をよく見るんだけど、これはCLI版=モジュール版ってことでいいのかな?
誰か教えてください。
なぜデフォルトの設定のままなのに弾かれたのか
- centos8からdnfで降ろしてくるhttpdのデフォルトがpreforkからeventに変更された 第5章 RHEL 8.0.0 リリース
httpd -V | grep MPM
Server MPM: event
たしかにevent
になっている
デフォルトでeventになっているならそりゃphpのモジュールなんて使わないんだから読み込まないもんねえ
解決策
(今回の場合は)apacheのMPMをpreforkに変更する
vi /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # コメントアウト外した ~中略~ #LoadModule mpm_event_module modules/mod_mpm_event.so # コメントアウト付けた
systemctl reload httpd
httpd -V | grep MPM
Server MPM: prefork
こうすることで
- apacheのMPMがpreforkになる
- phpがモジュール版としてapacheに読み込まれる
- apacheにphpが組み込まれている(=モジュール版)から.htaccess内でphp_valueが使える
- エラー解消!!!
はい、素晴らしい。
今回はモジュール版でやるからこれだけで済んだけど、
もしcgi版でphp-fpm使うでも.htaccessとかはそのまま使うよとか言われたらどうしてたんだろ。。
MPMはeventでphp-fpm使ってなんやかんやしないといけないんだよな。。大変そう。。
いや、それはもしその時が来たら考えます。
お疲れ様でした!
ここまで読んでくれてありがとうございました!
誰かのお役に立てれば幸いです。