_著者はhttps://www.brightfunds.org/funds/open-internet-free-speech[Open Internet / Free Speech Fund]を選択してhttps://do.co/w4do-ctaの一部として寄付を受け取りました[寄付のために書く]プログラム。

前書き

Apache HTTP Webサーバーは、さまざまな環境で動作し、さまざまなニーズを解決するために長年にわたって進化してきました。 Apache HTTPが解決しなければならない重要な問題の1つは、他のWebサーバーと同様に、HTTPプロトコル要求を処理するためのさまざまなプロセスの処理方法です。 これには、ソケットのオープン、リクエストの処理、一定期間の接続のオープンの維持、その接続を通じて発生する新しいイベントの処理、および特定の言語(PHP、Perl、Pythonなど)で作成されたプログラムによって生成されたコンテンツの返却が含まれます。 これらのタスクは、Multi-Processing Module(MPM)によって実行および制御されます。

Apache HTTPには3つの異なるMPMが付属しています。

  • * Pre-fork *:サーバーに到達する着信接続ごとに新しいプロセスが作成されます。 各プロセスは他のプロセスから分離されているため、実行中のある時点で同じ呼び出しを実行していても、プロセス間でメモリは共有されません。 これは、スレッド化をサポートしないライブラリにリンクされたアプリケーション、通常は古いアプリケーションまたはライブラリを実行する安全な方法です。

  • ワーカー:親プロセスは、子プロセスのプールの起動を担当します。子プロセスのいくつかは、新しい着信接続をリッスンし、他は要求されたコンテンツを提供します。 各プロセスはスレッド化されているため(1つのスレッドで1つの接続を処理できます)、1つのプロセスで複数の要求を同時に処理できます。 接続を処理するこの方法は、安定性を維持しながら、リソース使用率を向上させます。 これは利用可能なプロセスのプールの結果であり、多くの場合、利用可能な空きスレッドがすぐに新しい接続を提供する準備ができています。

  • イベント:ワーカーに基づいて、このMPMは、親プロセスが子プロセスおよびそれらに関連付けられたスレッドにタスクをスケジュールする方法を最適化することにより、さらに一歩前進します。 接続はデフォルトで5秒間開いたままで、新しいイベントが発生しなければ閉じます。これは、キープアライブディレクティブのデフォルト値であり、関連付けられたスレッドを保持します。 イベントMPMにより、プロセスはスレッドを管理できるため、一部のスレッドは新しい着信接続を自由に処理でき、他のスレッドはライブ接続にバインドされたままになります。 割り当てられたタスクのスレッドへの再配布を許可すると、リソースの使用率とパフォーマンスが向上します。

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

PHP-FPMは、PHP用のFastCGI Process Managerです。 FastCGIプロトコルは、アプリケーションとApache HTTPなどのWebサーバーの間に位置するプロトコルであるCommon Gateway Interface(CGI)に基づいています。 これにより、開発者はWebサーバーの動作とは別にアプリケーションを作成できます。 プログラムはプロセスを独立して実行し、このプロトコルを介して製品をWebサーバーに渡します。 アプリケーションによる処理が必要な新しい接続ごとに、新しいプロセスが作成されます。

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

このチュートリアルでは、https://www.digitalocean.com/community/tutorials/how-to-install-an-apache-mysql-and-php-famp-stack-on-freebsd-12-のパフォーマンスを改善します0 [FAMPスタック]デフォルトのマルチプロセッシングモジュールをプリフォークからイベントに変更し、Apache HTTPの従来の `+ mod_php +`の代わりにPHP-FPMプロセスマネージャーを使用してPHPコードを処理します。

前提条件

このガイドを始める前に、次のものが必要です。

  • このhttps://www.digitalocean.com/community/tutorials/how-to-get-started-with-freebsd [ガイド]に従ってセットアップされたFreeBSD 12.0サーバー。

  • このhttps://www.digitalocean.com/community/tutorials/how-to-install-an-apache-mysql-and-php-famp-stack-on-freebsd-12-0に従ってサーバーにインストールされたFAMPスタック[チュートリアル]。

  • 構成を変更するために、root権限を持つ(またはsudoを使用して許可される)ユーザーへのアクセス。

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

最初に、 `+ httpd.conf`ファイルでpre-forkディレクティブを探します。 これは、モジュールを有効または無効にすることができるApache HTTPのメイン構成ファイルです。 Apache HTTPがコンテンツを提供するリスニングポートや、このファイルに表示するコンテンツの場所などのディレクティブを編集および設定できます。

これらの変更を行うには、「+ nl 」、番号行、プログラムを使用し、「-ba 」フラグを使用して行を数え、番号を付けて、後の段階で不一致がないようにします。 「 grep +」と組み合わせることで、このコマンドは最初にパスで指定されたファイル内のすべての行をカウントし、終了したら、探している文字列を検索します。

次のコマンドを実行して、 `+ nl `プログラムが ` httpd.conf`の行を処理して番号を付けるようにします。 次に、 `+ grep `は、指定された文字列 ` ‘mod_mpm_prefork’ +`を検索して出力を処理します。

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

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

Output  LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so

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

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

行の先頭に「#」記号を追加して、次のようにこの行をコメントアウトします。

/usr/local/etc/apache24/httpd.conf

...
# LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
...

「#」記号を追加すると、プリフォークMPMモジュールが無効になります。

これで、同じ `+ httpd.conf`ファイルにイベントディレクティブが見つかります。

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

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

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

次に、行の「#」記号を削除して、イベントMPMを有効にします。

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

ディレクティブは次のようになります。

/usr/local/etc/apache24/httpd.conf

...
LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
...

設定をMPMプリフォークからイベントに切り替えたので、PHPプロセッサをApache HTTPに接続する `+ mod_php73 +`パッケージを削除できます。これは不要になり、システムに残っていると干渉するためです。

sudo pkg remove -y mod_php73

次のコマンドを実行してテストし、構成が正しいことを確認します。

sudo apachectl configtest

出力に「+ Syntax OK +」が表示された場合、Apache HTTPサーバーを再起動できます。

sudo apachectl restart

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

ステップ2-FastCGI Process Managerを使用するためのApache HTTPの構成

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

この手順では、起動時に開始する実行中のサービスとしてPHP-FPMを追加します。 モジュール専用の設定を追加するとともに、 `+ httpd.conf +`でいくつかのモジュールを有効にすることで、PHPで動作するようにApache HTTPを設定します。

まず、 `+ ‘php_fpm_enable = YES’ `を ` / etc / rc.conf `ファイルに追加して、PHP-FPMサービスを開始できるようにします。 それには、 ` sysrc +`コマンドを使用します。

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' +`が有効になっている場合、括弧で囲まれた拡張子に一致する処理済みファイルは、ポートを介してローカルマシンで実行されているFastCGIプロセスマネージャーによって処理されることを示しています+ 9000 +`-ローカルマシンがプロキシサーバーであるかのように。 これは、PHP-FPMモジュールとApache HTTP相互接続です。 これを実現するには、このステップでさらにモジュールをアクティブ化します。

プロキシモジュールを有効にするには、最初に `+ httpd.conf +`ファイルで検索します:

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

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

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

「#」記号を削除して、行のコメントを解除します。

sudo vi + /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...
#LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
...

他のモジュールで既に行ったように、行のコメントを外します。

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

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

/usr/local/etc/apache24/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'

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

Outputmpm_event_module (shared)

プロキシモジュールとFastCGIについても同じことを繰り返すことができます。

sudo apachectl -M | grep 'proxy'

出力には以下が表示されます。

Outputproxy_module (shared)
proxy_fcgi_module (shared)

モジュールのリスト全体を表示したい場合は、 `+ -M +`の後のコマンドの2番目の部分を削除できます。

PHPがFastCGI Process Managerを使用しているかどうかを確認します。 そのためには、PHPに関連するすべての情報を表示する非常に小さなPHPスクリプトを作成します。

次のコマンドを実行して、次の名前のファイルを作成します。

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

info.phpファイルに次のコンテンツを追加します。

info.php

<?php phpinfo(); ?>

サーバーのURLにアクセスして、最後に + info.php +`を追加します(例: `+ http:/// info.php +)。

サーバーAPIエントリは* FPM / FastCGI *になります。

image:https://assets.digitalocean.com/articles/MPMEvent/FastCGIPHP.png [PHPサーバーAPIエントリFPM / FastCGIのスクリーニング]

このチェックの後に `+ info.php`ファイルを忘れずに削除して、サーバーに関する情報が公開されないようにしてください。

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

MPMモジュール、FastCGIを処理するモジュール、PHPコードの処理の動作ステータスを確認しました。

結論

元のFAMPスタックを最適化したため、新しいApache HTTPプロセスを作成するための接続数が増加し、PHP-FPMがPHPコードをより効率的に処理し、全体的なリソース使用率が向上しました。

さまざまなモジュールと関連プロジェクトの詳細については、Apache HTTPサーバープロジェクトhttp://httpd.apache.org/[documentation]を参照してください。