php-fpmの動作確認。

Apache 2.4 の構成をいろいろといじっています。

Apacheのmod_cgiとmod_cgidとpreforkとevent。でも触れていますが、PHP と Perl と Python をそれぞれ別のアプリケーションで使いたいということなのですが、歴史的な経緯もあり、Perl は太古の CGI(ゆいちゃっと)、PHP は WordPress、Python は GNU Mailman 2 となります。それぞれの API は、ゆいちゃっとと Mailman が CGI で、WordPress が FastCGI を使おうと考えています。実際には CGI と FastCGI はアプリケーションから見ると同じなので、結局すべてを CGI または FastCGI でやる、という感じです。

NetBSD の pkgsrc では、www/fcgi に cgi-fcgi という実行形式が含まれていて、CGI 形式でリクエストを送ると、FastCGI として FastCGI デーモンに投げ、応答を再度 CGI 形式にして返してくれます。php-fpm で使ってみるとこんな感じ。
$SCRIPT_NAME=info.php SCRIPT_FILENAME=/srv/www/Test/info.php REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php_fpm.sock

Apache の mod_cgid は、ちょっと勘違いしていたんですが、Apache 2.4 の説明をよく読むと、
Unix オペレーティングシステムの中には、マルチスレッドのサーバから プロセスを fork するのが非常にコストの高い動作になっているものがあります。 理由は、新しいプロセスが親プロセスのスレッドすべてを複製するからです。 各 CGI 起動時にこのコストがかかるのを防ぐために、mod_cgid は子プロセスを fork して CGI スクリプトを実行するための 外部デーモンを実行します。 主サーバは unix ドメインソケットを使ってこのデーモンと通信します。
となっていて、mod_cgid 自体が子プロセスを fork して外部デーモンを起動する、ということは、別途外部デーモンを用意する必要はなく、そのあたりは mod_cgid で面倒を見てくれる、ということのようです。prefork で使われる mod_cgi は自分自身で面倒を見るけれど、worker/event で使われる mod_cgid は自分でデーモンを起動してそちらに任せる、ということで、アプリケーションから見ると何も変わらないことになります。

ということであれば、上記の Perl / PHP / Python のアプリケーションは全部 mod_cgid で引き受けることができそうです。外部に CGI サーバを別途用意するなら uWSGI の CGI plugin を使って、とか考えていましたが、特に必要はなさそうです。

一方、php-fpm などの FastCGI サーバが動かせるタイプのものは mod_proxy_fcgi を使ってやれば、Apache からプロセスを切り離すことができます。

ところで PHP 7.3.4 で preg_match() あたりで JIT 警告(正確には、"Warning: preg_match(): JIT compilation failed: no more memory in xxx")が出てるんですが、5月2日にリリースされた 7.3.5 では修正されているようですね。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...