高トラフィックのウェブサイト向けにLinuxサーバーでApacheとPHPを設定する方法

LAMPスタック(Linux、Apache、MySQL、PHP)をインストールする方法に関するほとんどすべてのチュートリアルでは、PHPスクリプトを処理するために組み込まれたApacheモジュールを使用することを推奨しています。たとえば、Ubuntuでは、sudo apt install libapache2-mod-phpのようなコマンドを使用してパッケージをインストールするときにこれを有効にします。これにより、Apacheはmpm_preforkを使用することを強制されます。訪問者があなたのウェブサイトにアクセスするたびに、新しいプロセスがその接続を処理するために起動されます。これはトラフィックが少ないときにはうまく機能します。
しかし、突然のトラフィックの急増があった場合、大きな問題になります。たとえば、Redditの投稿にあなたのウェブサイトが含まれていて、その投稿が人気になると、数分で何千人もの訪問者が訪れることがあります。
最良のシナリオでは、Apacheがトラフィックの急増を処理できる場合でも、不幸な訪問者はページが読み込まれるまでに約30秒から60秒待たなければならない可能性があり、これは今日の世界では馬鹿げています。最悪のシナリオでは、サーバーはひどく遅延し、リソース不足のためにいくつかの接続が単に切断されることになります。この場合、訪問者はブラウザでエラーを目にします。
どちらのシナリオも良くありません。興味を持っている読者、顧客、ファンの何百人または何千人の注意を失う可能性があるからです。
残念ながら、いずれにせよPHPはかなりのリソースを消費します。しかし、mpm_eventを使うことで、Apacheはトラフィックの急増をより効率的に処理できます。ただし、サーバーには少なくとも2GBのRAMと2つのCPUコア(実際または仮想)が必要であり、10秒あたり10人以上の訪問者が予想される場合は、さらに多くのリソースが必要です。もし仮想プライベートサーバーを使用しているなら、状況に応じて仮想CPUコアとSSDストレージを追加してください。RAMは二次的な要素です。
関連記事: Nginx対Apache:どちらがあなたに最適か?
Debian系ディストリビューションでのApache MPMイベントとPHP-FPMの使用方法
Debian、Ubuntu、またはこのファミリーの他のディストリビューションでは、単に「libapache2-mod-php」パッケージをインストールしないでください。Apacheをインストールすると、デフォルトでMPMイベントが有効になります。しかし、前述のパッケージをインストールすると、スクリプトがMPMイベントを無効にし、MPM preforkを有効にします。ApacheのPHPモジュールはmpm_preforkでのみ(安全に)動作します。もちろん、「libapache2-mod-php」がないと、PHPファイルを処理するプロセッサがありません。したがって、Apacheに含まれているPHPモジュールの代わりにPHP-FPMを使用します。以下は、新しいサーバーにLAMPスタックをインストールする方法です。ステップは、ウェブアプリケーションの要件に応じて調整できます。
まず、rootとしてログインします。次に、Apacheをインストールします。
apt update && apt install apache2この時点で、Apacheが実際にデフォルトでMPMイベントを有効にしていることがわかります。
apachectl-V
PHP-FPMをインストールします。
apt install php-fpmApacheでPHPプロセッサを有効にする方法に関する指示が表示されます。

FastCGIプロトコルを有効にします。
a2enmod proxy_fcgiApache用にPHP-FPMのデフォルト設定を有効にします。
a2enconf php7.0-fpm注: Debian/Ubuntuの将来のバージョンでは、このコマンドが他のものに変更される可能性があります。たとえば、a2enconf php7.6-fpmのように、PHP-FPMのバージョンが異なるためです。
Apacheを再起動します。
systemctl restart apache2PHPアプリケーションの他の要件をインストールします。以下は一例です。
apt install mariadb-server php-mysqlこれにより、データベースサーバーとPHP MySQLモジュールがインストールされ、PHPアプリケーションがデータベースに接続できるようになります。
関連記事: ApacheサーバーでMod_evasiveを使用してDDoS攻撃から保護する方法
RedHat系ディストリビューションでのApache MPMイベントとPHP-FPMの使用方法
もうひとつの人気のあるサーバーディストリビューションの選択肢はRedHat、またはCentOSです。同様に、MPMイベントが有効でPHP-FPMがインストールされたApacheのクリーンインストールの例が提供されます。
rootとしてログインし、Apacheをインストールします。
yum install httpdDebian系のディストリビューションとは異なり、ここでは最新のCentOS 7でもApacheがデフォルトでMPM preforkを使用していることがわかります。
apachectl-V
MPMイベントを有効にするには、設定ファイルを編集する必要があります。
sed-i'/mpm_prefork\.so$/s/^/#/'/etc/httpd/conf.modules.d/00-mpm.confこれにより、LoadModule mpm_prefork_module modules/mod_mpm_prefork.soという行に#記号が追加され、コメントアウト(無効化)されます。

次に、次のコマンドを使用して#LoadModule mpm_event_module modules/mod_mpm_event.soの行をコメント解除(有効化)します。
sed-i'/mpm_event\.so$/s/^#//'/etc/httpd/conf.modules.d/00-mpm.confApacheを起動し、ブート時に自動起動するように設定します。
systemctl start httpd.service
systemctl enable httpd.serviceApacheが現在MPMイベントを使用しているかどうかを確認します。
apachectl-V
PHP-FPMとFastCGIモジュールをインストールします。
yum install php-fpm mod_fcgidApacheにPHPファイルをどのように処理するかを指示するために「/etc/httpd/conf.d/php.conf」を作成します。以下の全コンテンツをコピーして、一度にターミナルに貼り付け、ENTERキーを押してください。
cat</etc/httpd/conf.d/php.conf
# mod_phpが利用できない場合はローカルphp-fpmにリダイレクト
# HTTP認証ヘッダーを有効にする
SetEnvIfNoCase ^Authorization$ "(.+)"HTTP_AUTHORIZATION=$1
IfModule>
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
SetHandler "proxy:fcgi://127.0.0.1:9000"
FilesMatch>
# デフォルトで生のphpソースへのアクセスを拒否
# 再度有効にする場合は特定のバーチャルホストまたはディレクトリ内のファイルへのアクセスを有効にすることを推奨
Require all denied
FilesMatch>
# ファイル名のないファイル(例:'.php')へのアクセスを拒否
Require all denied
FilesMatch>
IfModule>
IfModule>
PASTE この素晴らしい設定はDebianによるものです。他の情報源は次のようなシンプルな設定ファイルを推奨しています。
SetHandler "proxy:fcgi://127.0.0.1:9000"
しかし、これはいくつかの攻撃に対して脆弱であり、特定のサービスが失敗した場合、PHPファイルを一般に公開してしまい、保存されたパスワード、コード、および機密データを潜在的に公開する可能性があります。
Apacheを再起動します。
systemctl restart httpd.servicePHP-FPMを起動し、ブート時に自動起動するように設定します。
systemctl start php-fpm.service
systemctl enable php-fpm.service結論
これで、トラフィックによりスケールアップできるApacheサーバーが得られました。ただし、あなたはデフォルト設定を使用していることを理解してください。これはほとんどの人にとって「最適な」設定です。HTTPサーバーから最も利益を得たい場合は、調整できる様々な変数について読み込む必要があります。これらの適切な値は、サーバーのリソース、予想されるトラフィック、PHPアプリケーションに大きく依存します。