Ubuntu18.04でMPMイベントとPHP-FPMを使用してApacheHTTPを設定する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Apache HTTP Webサーバーは、さまざまな環境で動作し、さまざまなニーズを解決するために、何年にもわたって進化してきました。 他のWebサーバーと同様に、Apache HTTPが解決しなければならない重要な問題の1つは、httpプロトコル要求を処理するためにさまざまなプロセスを処理する方法です。 これには、ソケットを開き、要求を処理し、接続を一定期間開いたままにし、その接続を介して発生する新しいイベントを処理し、特定の言語(PHP、Perl、Pythonなど)で作成されたプログラムによって生成されたコンテンツを返すことが含まれます。 。 これらのタスクは、マルチプロセッシングモジュール(MPM)によって実行および制御されます。
Apache HTTPには、次の3つの異なるMPMが付属しています。
- Pre-fork :サーバーに到達する着信接続ごとに新しいプロセスが作成されます。 各プロセスは他のプロセスから分離されているため、実行のある時点で同じ呼び出しを実行している場合でも、プロセス間でメモリは共有されません。 これは、スレッド化をサポートしていないライブラリ(通常は古いアプリケーションまたはライブラリ)にリンクされたアプリケーションを実行するための安全な方法です。
- Worker :親プロセスは子プロセスのプールを起動する責任があり、その一部は新しい着信接続をリッスンし、その他は要求されたコンテンツを提供します。 各プロセスはスレッド化されているため(1つのスレッドで1つの接続を処理できます)、1つのプロセスで複数の要求を同時に処理できます。 接続を処理するこの方法は、安定性を維持しながら、より良いリソース使用率を促進します。 これは、利用可能なプロセスのプールの結果であり、多くの場合、新しい接続をすぐに提供する準備ができている無料の利用可能なスレッドがあります。
- Event :ワーカーに基づいて、このMPMは、親プロセスが子プロセスとそれらに関連付けられたスレッドにタスクをスケジュールする方法を最適化することにより、さらに一歩進んでいます。 接続はデフォルトで5秒間開いたままになり、新しいイベントが発生しない場合は閉じます。 これはkeep-aliveディレクティブのデフォルト値であり、関連付けられたスレッドを保持します。 イベントMPMを使用すると、プロセスでスレッドを管理できるため、一部のスレッドは新しい着信接続を自由に処理でき、他のスレッドはライブ接続にバインドされたままになります。 割り当てられたタスクをスレッドに再配布できるようにすると、リソースの使用率とパフォーマンスが向上します。
MPMイベントモジュールは、ApacheHTTPWebサーバーで使用できる高速マルチプロセッシングモジュールです。
PHP-FPM は、PHP用のFastCGIプロセスマネージャーです。 FastCGIプロトコルは、アプリケーションとApacheHTTPなどのWebサーバーの間にあるプロトコルであるCommonGateway Interface(CGI)に基づいています。 これにより、開発者はWebサーバーの動作とは別にアプリケーションを作成できます。 プログラムはプロセスを独立して実行し、このプロトコルを介して製品をWebサーバーに渡します。 アプリケーションによる処理が必要な新しい接続ごとに、新しいプロセスが作成されます。
ApacheHTTPのMPMイベントをPHPFastCGIProcess Manager(PHP-FPM)と組み合わせることにより、Webサイトはより高速にロードし、より少ないリソースを使用しながらより多くの同時接続を処理できます。
このチュートリアルでは、デフォルトのマルチプロセッシングモジュールをプリフォークからイベントに変更し、PHP-FPMプロセスマネージャーを使用して従来の[ ApacheHTTPのX231X]。
前提条件
このガイドを開始する前に、次のものが必要です。
- Ubuntu 18.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーとファイアウォールを含む)。
- Ubuntu 18.04 にLinux、Apache、MySQL、PHP(LAMPスタック)をインストールする方法に従ってサーバーにインストールされたLAMPスタック。
ステップ1—マルチプロセッシングモジュールの変更
Ubuntuは、親ディストリビューションであるDebianからApacheHTTPモジュールを有効または無効にするスクリプトを継承します。 このステップでは、このツールセットを使用して、プレフォークモジュールを無効にし、イベントモジュールを有効にします。
このステップでは、Apache HTTPを停止し、Pre-forkモジュールにリンクされているPHP 7.2
モジュールを無効にしてから、Pre-forkを無効にしてイベントモジュールをすぐに有効にします。
まず、ApacheHTTPサービスを停止します。
sudo systemctl stop apache2
これで、Pre-forkモジュールに関連するPHP 7.2
モジュールを無効にできます。
sudo a2dismod php7.2
次に、プリフォークMPMモジュールを無効にします。
sudo a2dismod mpm_prefork
次に、イベントMPMモジュールを有効にします。
sudo a2enmod mpm_event
MPMをプリフォークからイベントに切り替え、PHPとApacheHTTP間のPHP 7.2
モジュール接続を削除しました。 次のステップでは、php-fpm
モジュール、および関連するライブラリとプロキシモジュールをインストールします。 PHPとも通信できるようにApacheHTTPを設定します。
ステップ2—FastCGIプロセスマネージャを使用するようにApacheHTTPを設定する
この段階で、Pre-fork MPMからEventに移行することで、ApacheHTTPが接続を処理する方法を切り替えました。 ただし、途中で、ApacheHTTPをPHPで実行されているプログラムに接続するPHPモジュールを無効にしました。
このステップでは、PHP-FPMプロセッサをインストールして、ApacheHTTPがPHPプログラムを再び処理できるようにします。 また、依存関係ライブラリをインストールしてモジュールを有効にすることで、両方が以前よりもスムーズかつ迅速に連携できるようになります。
最初にphp-fpm
をインストールします。 次のコマンドはPHP-FPMパッケージをインストールし、 systemdと統合されたphp7.2-fpm
サービスを自動的に有効にするため、サービスは起動時に開始されます。
sudo apt install php-fpm
通信するために、Apache HTTPとPHPには、その容量を有効にするライブラリが必要です。 ここで、libapache2-mod-fcgid
をインストールします。これは、プログラムとWebサーバー間のインターフェイスとして機能し、ApacheHTTPに固有のものです。 この通信は、UNIXソケットを介して行われます。
このライブラリをインストールします。
sudo apt install libapache2-mod-fcgid
php-fpm
とlibapache2-mod-fcgid
をインストールしましたが、どちらもまだ有効になっていません。
まず、次のコマンドを使用してphp-fpm
モジュールを有効にします。
sudo a2enconf php7.2-fpm
次に、Apache HTTPproxy
モジュールを有効にします。
sudo a2enmod proxy
3番目に、ApacheHTTPでFastCGIproxy
モジュールを有効にします。
sudo a2enmod proxy_fcgi
注:次のUNIXソケットを介してPHPプログラムとApacheHTTP間のこの相互作用の構成を読み取ることができます。
cat /etc/apache2/conf-enabled/php7.2-fpm.conf
これですべてが整ったので、ApacheHTTPを開始できます。 最初に構成チェックを行います。
sudo apachectl configtest
OutputSyntax OK
その後、FastCGIライブラリlibapache2-mod-fcgid
のインストール時に自動的に開始されたため、ApacheHTTPの再起動に進むことができます。
sudo systemctl restart apache2
php-fpm
モジュールをインストールし、それと連動するようにApache HTTPを構成し、FastCGIプロトコルが機能するために必要なモジュールを有効にして、対応するサービスを開始しました。
ApacheでイベントMPMモジュールが有効になり、PHP-FPMが存在して実行されているので、すべてが意図したとおりに機能していることを確認します。
ステップ3—構成を確認する
構成の変更が適用されたことを確認するために、いくつかのテストを実行します。 1つ目は、ApacheHTTPが使用しているマルチプロセッシングモジュールを確認します。 2つ目は、PHPがFPMマネージャーを使用していることを確認します。
次のコマンドを実行して、ApacheHTTPサーバーを確認します。
sudo apachectl -M | grep 'mpm'
出力は次のようになります。
Outputmpm_event_module (shared)
proxy
モジュールとFastCGIについても同じことを繰り返すことができます。
sudo apachectl -M | grep 'proxy'
出力には次のように表示されます。
Outputproxy_module (shared) proxy_fcgi_module (shared)
モジュールのリスト全体を表示したい場合は、-M
の後のコマンドの2番目の部分を削除できます。
PHPがFastCGIProcessManagerを使用しているかどうかを確認するときが来ました。 そのためには、PHPに関連するすべての情報を表示する小さなPHPスクリプトを作成します。
次のコマンドを実行して、次の名前のファイルを書き込みます。
sudo nano /var/www/your_domain/info.php
次のコンテンツをinfo.php
ファイルに追加します。
info.php
<?php phpinfo(); ?>
次に、サーバーのURLにアクセスし、http://your_domain/info.php
のように最後にinfo.php
を追加します。
サーバーAPIエントリはFPM/FastCGIになります。
このチェックの後でinfo.php
ファイルを削除して、サーバーに関する情報が公開されないようにします。
sudo rm /var/www/yourdomain.com/info.php
MPMモジュール、FastCGIを処理するモジュール、およびPHPコードの処理の動作ステータスを確認しました。
結論
元のLAMPスタックを最適化したため、新しいApache HTTPプロセスを作成するための接続数が増え、PHP-FPMがPHPコードをより効率的に処理し、全体的なリソース使用率が向上しました。
さまざまなモジュールおよび関連プロジェクトの詳細については、ApacheHTTPサーバープロジェクトドキュメントを参照してください。