質問: MacOS上でApacheのテスト環境を(久しぶりに)作成しています。 環境はこの環境です。 $ httpd -v Server version: Apache/2.4.41 (Unix) $ sw_vers ProductName: Mac OS X ProductVersion: 10.15.3 cgiを動かすために、/private/etc/apache2/httpd.confの LoadModule cgi_module libexec/apache2/mod_cgi.soのコメントアウトを外そうとしましたが、 ``` #LoadModule cgi_module libexec/apache2/mod_cgi.so ↓ LoadModule cgi_module libexec/apache2/mod_cgi.so ``` libexec/apache2/mod_cgid.soの記述がmpm_prefork_moduleに入っていました プロセスを複数生成することで同時にリクエストを処理することができるようになるMulti Processing Module(mpm) の機能のようですが、に書かれているのは なぜなのでしょうか。 ここ(173行目)のコメントを解除すると、動作しました。 !でmpm_prefork_moduleあるなしを分けているようですが、Apacehのマニュアルでは、以下の説明がありました。 最適化が施されていることと、以下で説明されている追加の ScriptSock ディレクティブを除いては、 >mod_cgid は mod_cgi と同様の 動作をします。 >Apache と CGI に関する詳細は mod_cgi の概要を読んでください。 まずはcgiが動きましたがこのあたりの理由・背景・事情をご存知の方がいらっしゃったら教えてください。 ``` /private/etc/apache2/httpd.conf 169 170 #LoadModule cgid_module libexec/apache2/mod_cgid.so 171 172 173 LoadModule cgi_module libexec/apache2/mod_cgi.so 174 ``` High serriaのMacでは、165行目にこのように書かれていました。 ``` 163 #LoadModule asis_module libexec/apache2/mod_asis.so 164 #LoadModule info_module libexec/apache2/mod_info.so 165 LoadModule cgi_module libexec/apache2/mod_cgi.so 166 #LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so 167 #LoadModule dav_lock_module libexec/apache2/mod_dav_lock.so ``` $ httpd -v Server version: Apache/2.4.33 (Unix) Server built: Apr 3 2018 17:54:07 tutiMacBookAir:apache2 taro$ sw_vers ProductName: Mac OS X ProductVersion: 10.13.6High serria
回答: mod_cgi と mod_cgid のマニュアルと見ると、mod_cgid がマルチスレッド用ということだと思います。 マルチスレッド MPM (worker, event) で、プロセスをフォークするコストについての記述があります。 下記 URL の「mod_cgiとmod_cgidのアーキテクチャの違い」までが参考になると思います。 (後半はパフォーマンスの話) ApacheでCGIを使う場合にpreforkを使った方が良い状況とそのチューニングについて その他、マルチスレッド MPM を使用する場合、CGI がスレッドセーフかどうかも注意した方がよさそうです。 CGI の作りに関わらず、mod_cgid がよしなに取り扱ってくれるのかもしれませんが、不安であれば、preform MPM + mod_cgi にしておいた方が安全と思います。