How To Configure Apache HTTP with MPM Event and PHP-FPM on Ubuntu 18.04

The author selected the COVID-19 Relief Fund as part of Write for DOnations program.

はじめに

WebサーバーApache HTTPは長年にわたって進化し、異なる環境で機能し、異なるニーズを解決しています。 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 プロセスマネージャー (PHP-FPM) を組み合わせることにより、ウェブサイトはより少ないリソースで、より速く読み込み、より多くの同時接続を処理できます。

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

前提条件

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

  • Ubuntu 18.04 初期サーバー設定ガイドに従って設定された、sudo 非 root ユーザーとファイアウォールを含む 1 台の Ubuntu 18.04 サーバー。
  • How To Install Linux, Apache, MySQL, PHP (LAMP stack) on Ubuntu 18.04.

Step 1 – Changing the Multi-Processing Module

Ubuntu は Apache HTTP モジュールを有効または無効にするスクリプトをその親ディストリビューションの Debian から継承しています。 このステップでは、このツールセットを使用して Pre-fork モジュールを無効にし、Event モジュールを有効にします。

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

まず、Apache HTTP サービスを停止します:

  • sudo systemctl stop apache2

次に、Pre-fork モジュールに関連する PHP 7.2 モジュールを無効にします:

  • sudo a2dismod php7.2

それから Pre-fork MPM モジュールを無効化します。

  • sudo a2dismod mpm_prefork

次に Event MPM モジュールを有効にします:

  • sudo a2enmod mpm_event

これで MPM を pre-fork から event に切り替え、PHP と Apache HTTP 間の PHP 7.2 モジュールの接続を削除しました。 次のステップでは、php-fpmモジュールと、関連するライブラリやプロキシモジュールをインストールします。

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

この段階で、Apache HTTP が Pre-fork MPM から Event に移行して接続を処理する方法を変更しました。

このステップでは、Apache HTTP が再び PHP プログラムを処理できるように、 PHP-FPM プロセッサをインストールします。 また、依存ライブラリーをインストールし、モジュールを有効にすることで、両者が以前よりもスムーズかつ迅速に協力できるようになります。 次のコマンドは PHP-FPM パッケージをインストールし、systemd に統合された php7.2-fpm サービスを自動的に有効にするので、起動時にサービスが開始されます:

  • sudo apt install php-fpm

通信するために、Apache HTTP と PHP にはその能力を可能にするライブラリが必要です。 これから libapache2-mod-fcgid をインストールしますが、これは Web サーバーとプログラム間のインターフェイスとして機能するもので、Apache HTTP に特化したものです。

Install this library:

  • sudo apt install libapache2-mod-fcgid

php-fpmlibapache2-mod-fcgid をインストールしましたが、どちらもまだ有効になっていませんね。

最初に次のコマンドで php-fpm モジュールを有効にします:

  • sudo a2enconf php7.2-fpm

次に Apache HTTP proxy モジュールを有効にします:

  • sudo a2enmod proxy

次に Apache HTTP で FastCGI proxy モジュールを有効にします:

  • sudo a2enmod proxy_fcgi

注意してください。 この PHP プログラムと Apache HTTP との間の UNIX ソケットを介した相互作用の設定は、次のようにして読むことができます:

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

これですべてが整ったので、Apache HTTP を起動することができるようになりました。 FastCGI ライブラリ libapache2-mod-fcgid:

  • sudo systemctl restart apache2

では、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'

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

Output
proxy_module (shared)proxy_fcgi_module (shared)

モジュールの全リストを表示したい場合は、コマンドの -M の後の部分を削除することができます。

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

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

  • 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になります。

PHP Screen the Server API entry FPM/FastCGI

この後、サーバーに関する情報が公開されないようにinfo.phpファイルを削除します。

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

これで、MPMモジュール、FastCGIを扱うモジュール、PHPコードの処理についての動作状態を確認することが出来ました。