How To Configure Apache HTTP with MPM Event and PHP-FPM on FreeBSD 12.0

The author selected the Open Internet/Free Speech Fund as part of Write for DOnations program.

はじめに

The Apache HTTP web server has evolved through the years to work in different environments and solve different needs.The WMSは長年にわたって、さまざまな環境で動作し、異なるニーズを解決するために進化してきました。 Apache HTTP が解決しなければならない重要な問題の一つは、 他のウェブサーバと同様に、http プロトコルのリクエストを処理するために 異なるプロセスをどのように扱うかです。 これは、ソケットを開き、リクエストを処理し、一定期間接続を開いたままにし、その接続を通して発生する新しいイベントを処理し、特定の言語(PHP、Perl、Pythonなど)で作られたプログラムによって生成されたコンテンツを返すというものです。 これらのタスクはマルチプロセッシングモジュール (MPM) によって実行、制御されます。

Apache HTTP には 3 種類の MPM があります:

  • Pre-fork: サーバーに到達する着信接続ごとに新しいプロセスが作成されます。 各プロセスは他のプロセスから分離されているので、 たとえ実行中のある時点で同一の呼び出しを行なっていたとしても、 プロセス間でメモリが共有されることはありません。 これは、スレッド化をサポートしないライブラリにリンクされたアプリケーション (一般に古いアプリケーションやライブラリ) を実行するための安全な方法です。 親プロセスは子プロセスのプールを起動する責任を持ち、 そのうちのいくつかは新しい着信接続を待ち、 他のものは要求されたコンテンツを提供します。 各プロセスはスレッド化されているので (ひとつのスレッドがひとつの接続を扱えます)、ひとつのプロセスで同時に複数のリクエストを扱うことができます。 このようなコネクションの扱い方によって、安定性を保ちつつ、より良いリソースの利用を促すことができます。 これは、利用可能なプロセスのプールの結果であり、多くの場合、新しい接続にすぐに対応できる空きスレッドが用意されています。 Worker をベースに、この MPM はさらに一歩進んで、親プロセスが子プロセスとそれらに関連するスレッドにタスクをスケジュールする方法を最適化します。 接続はデフォルトで 5 秒間開いたままとなり、新しいイベントが発生しないと閉じます。 これは keep-alive ディレクティブのデフォルト値であり、関連するスレッドを保持します。 イベント MPM は、あるスレッドが新しい接続を処理するために自由になり、他のスレッドがライブ接続に束縛され続けるように、プロセスがスレッドを管理することを可能にします。 割り当てられたタスクをスレッドに再分配できるようにすることで、より良いリソースの使用とパフォーマンスを実現します。

MPM Event モジュールは、Apache HTTP Web サーバーで利用可能な高速マルチプロセッシングモジュールです。

PHP-FPM は PHP 用 FastCGI プロセスマネージャです。 FastCGI プロトコルは Common Gateway Interface (CGI) をベースにしており、Apache HTTP のようなアプリケーションと Web サーバーの間に位置するプロトコルです。 これにより、開発者はアプリケーションをウェブサーバーの動作とは別に書くことができます。 プログラムは独立してプロセスを実行し、このプロトコルを介してウェブサーバーにその製品を渡します。

Apache HTTP の MPM イベントと PHP FastCGI Process Manager (PHP-FPM) を組み合わせることにより、 ウェブサイトはより少ないリソースで、より速く読み込み、より多くの同時接続を処理できるようになります。

このチュートリアルでは、デフォルトのマルチプロセッシング モジュールを pre-fork から event に変更し、Apache HTTP の従来の mod_php の代わりに PHP-FPM プロセス マネージャを使用して PHP コードを処理することにより、FAMP スタックのパフォーマンスを向上させます。

前提条件

このガイドを始める前に、以下のものが必要です:

  • このガイドに従って設定された FreeBSD 12.0 サーバ。
  • このチュートリアルに従ってサーバにインストールした FAMP スタック。
  • 設定を変更するために、root権限を持つユーザーへのアクセス(またはsudoを使用して許可)。

ステップ1 – マルチプロセッシング モジュールの変更

まず、httpd.confファイル内のpre-fork指示を探すことから始めます。 これは Apache HTTP の主要な設定ファイルで、モジュールを有効にしたり無効にしたりすることができます。

これらの変更を行うには、nl, number line, program を使用し、-ba フラグで行数をカウントして番号を付け、後の段階で何もミスマッチがないようにします。 grep との組み合わせで、このコマンドはまずパスで指定されたファイルのすべての行を数え、それが終わると探している文字列を検索する。

以下のコマンドを実行すると、nl プログラムが httpd.conf の行を処理し番号を付ける。 そして、grepは与えられた文字列'mod_mpm_prefork'を検索して出力を処理します:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork'

出力として次のようなものが表示されます:

Output
67 LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so

テキストエディターで67行目を編集してみましょう。 このチュートリアルでは、FreeBSD のデフォルトエディターである vi を使用します。

  • sudo vi +67 /usr/local/etc/apache24/httpd.conf

行頭に # シンボルを追加して、この行がコメントアウトされるようにします。

ここで、同じ httpd.conf ファイルに event ディレクティブを見つけます。

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event

以下のような出力が表示されます:

Output
...66 #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

次に、66 行目の # 記号を削除してイベント MPM を有効にします:

  • sudo vi +66 /usr/local/etc/apache24/httpd.conf

ディレクティブは、以下のようになります:

/usr/local/etc/apache24/httpd.Util.Text ファイルに表示されます。conf
...LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so...

MPM pre-fork からイベントに設定を切り替えたので、PHP プロセッサを Apache HTTP に接続する mod_php73 パッケージは、もはや必要なく、システムに残っていると干渉するので、削除することができます。

  • sudo pkg remove -y mod_php73

以下のコマンドを実行して、設定が正しいことを確認します:

  • sudo apachectl configtest

出力に Syntax OK が表示されたら、Apache HTTP サーバを再起動できます:

  • sudo apachectl restart

注意: サーバ上で他の HTTP 接続が実行されているなら、通常の再起動ではなく穏やかな再起動が推奨されます。 これにより、ユーザーが接続を失って押し出されることがなくなります。

  • sudo apachectl graceful

MPM を pre-fork から event に切り替え、Apache HTTP への mod_php73 モジュール接続 PHP を削除しています。 次のステップでは、PHP-FPM モジュールをインストールし、Apache HTTP が PHP とより迅速に通信できるように設定します。

Step 2 – FastCGI プロセスマネージャを使用する Apache HTTP の設定

FreeBSD には、パッケージマネージャでインストールできるサポートされたバージョンの PHP がいくつかあります。 FreeBSDでは、ほとんどのGNU/Linuxディストリビューションがデフォルトのリポジトリで提供しているような1つのバイナリを使用するのではなく、さまざまな利用可能なバージョンのバイナリがコンパイルされています。 ベストプラクティスに従うために、サポートされているバージョンを使用します。これは、PHPのサポートされているバージョンのページで確認することができます。

最初に、/etc/rc.conf ファイルに 'php_fpm_enable=YES' を追加し、PHP-FPM サービスが開始できるようにします。

  • sudo sysrc php_fpm_enable="YES"

次に、php-fpm モジュールを Apache モジュールのディレクトリに追加し、Apache HTTP で使用されるように設定します。 そのために以下のファイルを作成します:

  • sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf

以下を030_php-fpm.confに追加します:

/usr/local/etc/apache24/modules.d/030_php-fpm.conf
<IfModule proxy_fcgi_module> <IfModule dir_module> DirectoryIndex index.php </IfModule> <FilesMatch "\.(php|phtml|inc)$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch></IfModule>

これは、モジュール 'proxy_fcgi''dir_module' と同様に有効になっている場合、括弧内の拡張子に一致する処理済ファイルは、ローカルマシンがプロキシサーバーのように、ポート 9000 を通してローカルマシンで実行中の FastCGI プロセスマネージャによって処理されるべきことを述べています。 これは、PHP-FPMモジュールとApache HTTPが相互接続する場所です。 これを実現するために、このステップではさらにモジュールを有効にします。

Proxy モジュールを有効にするには、まず httpd.conf ファイルでそれを検索します:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so

次のような出力が表示されます。

Output
...129 #LoadModule proxy_module libexec/apache24/mod_proxy.so...

# シンボルを削除して行のコメントを解除します:

  • sudo vi +129 /usr/local/etc/apache24/httpd.conf

行は、編集すると以下のようになります:

/usr/local/etc/apache24/httpd.conf
...LoadModule proxy_module libexec/apache24/mod_proxy.so...

これで、FastCGI モジュールを有効にすることができます。 次のコマンドでモジュールを見つけます:

  • nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so

次のようなものが表示されます:

Output
...133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

他のモジュールですでに行ったように、133 行目のコメントを解除します:

  • sudo vi +133 /usr/local/etc/apache24/httpd.conf

次のように行を残します:

/usr/local/etc/apache24/httpd.httpd.httpd.httpd.httpd.conf
...LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so...

これが終わったら、PHP-FPM サービスを開始します:

  • sudo service php-fpm start

そして、Apache を再起動して PHP モジュールを組み込んだ最新の設定変更を読み込みます:

  • sudo apachectl restart

これで PHP-FPM モジュールをインストールして、Apache HTTP を設定し、 FastCGI が動くために必要なモジュールを有効にし、対応するサービスを開始することができました。

Apache で Event MPM モジュールが有効になり、PHP-FPM が存在して動作するようになったので、すべてが意図したとおりに動作することを確認する時が来ました。

ステップ 3 – 設定の確認

設定の変更が適用されていることを確認するために、いくつかのテストを実行します。 最初のものは、Apache HTTPがどのマルチプロセッシング・モジュールを使用しているかをチェックします。 2番目は、PHPがFPMマネージャーを使用していることを確認します。

Apache HTTP サーバーを次のコマンドを実行してチェックします:

  • sudo apachectl -M | grep 'mpm'

出力は次のようになります:

Output
mpm_event_module (shared)

Proxy モジュールおよび FastCGI についても同じことを繰り返します。

  • sudo apachectl -M | grep 'proxy'

The output will show:

Output
proxy_module (shared)proxy_fcgi_module (shared)

If you want to see the entire list of the modules, you can remove the second part of the command after -M…モジュールの全リストを表示するには、コマンドの 2 番目の部分を削除します。

ここで、PHPがFastCGIプロセスマネージャーを使用しているかどうかを確認することになります。

以下のコマンドを実行して、以下のような名前のファイルを書き込みます:

  • sudo vi /usr/local/www/apache24/data/info.php

以下の内容をinfo.phpファイルに追加します:

info.php
<?php phpinfo(); ?>

次にサーバーのURLを訪れ、以下のように最後にinfo.phpを追加してください。 http://your_server_IP_address/info.php.

サーバーAPIエントリーはFPM/FastCGI.

PHP Screen the Server API entry FPM/FastCGI

サーバーに関する情報が公にならないように、この確認後 info.php ファイルを削除することを覚えておいてください。

  • sudo rm /usr/local/www/apache24/data/info.php

MPMモジュールの動作状況、FastCGIを扱うモジュール、PHPコードの取り扱いを確認しました。

おわりに

Leave a Reply