apacheで.htaccessのphp_valueが使えない(解決編)

こんばんは。

にしやまです。

前回問題提起編として未解決の問題を記事にしてしまったわけですが、、

無事解決できたので進捗を報告いたします!

あらすじ

前回は
apachephpのモジュールがなくて.htaccessphp_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の種類の一つで他にはworkereventというものがあります。

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使っとけってことだと思う。(適当)
このへんよくわかってないからまたちゃんと調べないとだね。

あと、話それるんだけど、

  • CGI版とモジュール版
  • CGI版とCLI

みたいな表記をよく見るんだけど、これはCLI版=モジュール版ってことでいいのかな?
誰か教えてください。

なぜデフォルトの設定のままなのに弾かれたのか

httpd -V | grep MPM

Server MPM:     event

たしかにeventになっている

  • phpのデフォルトがcgi版に変わった(httpdとは別のデーモンとして動く)
  • phpcgi版はphp-fpmを使用してphpを動かす(apacheの中でphpを動かさない)

  • だからpreforkを使わない限りはapachephpのモジュールを読み込む必要がない

デフォルトで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

こうすることで

  1. apacheのMPMがpreforkになる
  2. phpがモジュール版としてapacheに読み込まれる
  3. apachephpが組み込まれている(=モジュール版)から.htaccess内でphp_valueが使える
  4. エラー解消!!!

はい、素晴らしい。

今回はモジュール版でやるからこれだけで済んだけど、
もしcgi版でphp-fpm使うでも.htaccessとかはそのまま使うよとか言われたらどうしてたんだろ。。
MPMはeventでphp-fpm使ってなんやかんやしないといけないんだよな。。大変そう。。
いや、それはもしその時が来たら考えます。

お疲れ様でした!

ここまで読んでくれてありがとうございました!

誰かのお役に立てれば幸いです。