序章

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プロセスマネージャーを使用してクラシックの代わりにPHPコードを処理することにより、LAMPスタックのパフォーマンスを向上させます。 mod_php ApacheHTTPで。

前提条件

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

  • Ubuntu 18.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーとファイアウォールを含む)。
  • Ubuntu 18.04 にLinux、Apache、MySQL、PHP(LAMPスタック)をインストールする方法に従ってサーバーにインストールされたLAMPスタック。

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

Ubuntuは、親ディストリビューションであるDebianからApacheHTTPモジュールを有効または無効にするスクリプトを継承します。 このステップでは、このツールセットを使用して、プレフォークモジュールを無効にし、イベントモジュールを有効にします。

このステップでは、Apache HTTPを停止し、 PHP 7.2 モジュールをPre-forkモジュールにリンクし、Pre-forkを無効にして、イベントモジュールをすぐに有効にします。

まず、ApacheHTTPサービスを停止します。

  1. sudo systemctl stop apache2

今、あなたは無効にすることができます PHP 7.2 プレフォークモジュールに関連するモジュール:

  1. sudo a2dismod php7.2

次に、プリフォークMPMモジュールを無効にします。

  1. sudo a2dismod mpm_prefork

次に、イベントMPMモジュールを有効にします。

  1. sudo a2enmod mpm_event

MPMをプレフォークからイベントに切り替え、 PHP 7.2 PHPとApacheHTTP間のモジュール接続。 次のステップでは、をインストールします php-fpm モジュール、および関連するライブラリとプロキシモジュール。 PHPとも通信できるようにApacheHTTPを設定します。

ステップ2—FastCGIプロセスマネージャを使用するようにApacheHTTPを設定する

この段階で、Pre-fork MPMからEventに移行することで、ApacheHTTPが接続を処理する方法を切り替えました。 ただし、途中で、ApacheHTTPをPHPで実行されているプログラムに接続するPHPモジュールを無効にしました。

このステップでは、PHP-FPMプロセッサをインストールして、ApacheHTTPがPHPプログラムを再び処理できるようにします。 また、依存関係ライブラリをインストールしてモジュールを有効にすることで、両方が以前よりもスムーズかつ迅速に連携できるようになります。

最初のインストール php-fpm. 次のコマンドはPHP-FPMパッケージをインストールし、自動的に有効にします php7.2-fpm サービスはsystemdと統合されているため、サービスは起動時に開始されます。

  1. sudo apt install php-fpm

通信するために、Apache HTTPとPHPには、その容量を有効にするライブラリが必要です。 これでインストールします libapache2-mod-fcgid、これはWebサーバーとのプログラム間のインターフェースとして機能することができ、ApacheHTTPに固有です。 この通信は、UNIXソケットを介して行われます。

このライブラリをインストールします。

  1. sudo apt install libapache2-mod-fcgid

インストールしました php-fpm そしてその libapache2-mod-fcgid、ただしどちらもまだ有効になっていません。

まず、を有効にします php-fpm 次のコマンドを使用したモジュール:

  1. sudo a2enconf php7.2-fpm

2番目にApacheHTTPを有効にします proxy モジュール:

  1. sudo a2enmod proxy

3番目にFastCGIを有効にします proxy Apache HTTPのモジュール:

  1. sudo a2enmod proxy_fcgi

注:次のUNIXソケットを介してPHPプログラムとApacheHTTP間のこの相互作用の構成を読み取ることができます。

  1. cat /etc/apache2/conf-enabled/php7.2-fpm.conf

これですべてが整ったので、ApacheHTTPを開始できます。 最初に構成チェックを行います。

  1. sudo apachectl configtest
Output
Syntax OK

その後、FastCGIライブラリのインストール時に自動的に開始されたため、ApacheHTTPの再起動に進むことができます。 libapache2-mod-fcgid:

  1. sudo systemctl restart apache2

インストールしました php-fpm モジュールは、Apache HTTPを使用するように構成し、FastCGIプロトコルが機能するために必要なモジュールを有効にして、対応するサービスを開始しました。

ApacheでイベントMPMモジュールが有効になり、PHP-FPMが存在して実行されているので、すべてが意図したとおりに機能していることを確認します。

ステップ3—構成を確認する

構成の変更が適用されたことを確認するために、いくつかのテストを実行します。 1つ目は、ApacheHTTPが使用しているマルチプロセッシングモジュールを確認します。 2つ目は、PHPがFPMマネージャーを使用していることを確認します。

次のコマンドを実行して、ApacheHTTPサーバーを確認します。

  1. sudo apachectl -M | grep 'mpm'

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

Output
mpm_event_module (shared)

あなたはのために同じことを繰り返すことができます proxy モジュールとFastCGI:

  1. sudo apachectl -M | grep 'proxy'

出力には次のように表示されます。

Output
proxy_module (shared) proxy_fcgi_module (shared)

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

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

次のコマンドを実行して、次の名前のファイルを書き込みます。

  1. sudo nano /var/www/your_domain/info.php

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

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

次に、サーバーのURLにアクセスして、追加します info.php 最後にそのように: http://your_domain/info.php.

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

を削除します info.php このチェックの後にファイルするので、サーバーに関する情報は公開されません。

  1. sudo rm /var/www/yourdomain.com/info.php

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

結論

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

さまざまなモジュールおよび関連プロジェクトの詳細については、ApacheHTTPサーバープロジェクトドキュメントを参照してください。