Linux
 Computer >> コンピューター >  >> システム >> Linux

Linuxサーバーで高トラフィックのWebサイトに対応させるApacheとPHPの構成方法

Linuxサーバーで高トラフィックのWebサイトに対応させる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人以上の訪問者のような激しいスパイクが予想される場合は、さらに多くのリソースが必要です。VPSを利用している場合は、状況に応じて仮想CPUコアを増やし、SSDストレージを採用しましょう。RAMはそれに次ぐ優先度です。

Debian系ディストリビューションでApache MPM EventとPHP-FPMを使う方法

Debian、Ubuntu、その他この系列のディストリビューションでは、「libapache2-mod-php」パッケージをインストールしないことだけに注意すればOKです。Apacheをインストールした時点で、デフォルトでMPM eventが使われます。ところが前述のパッケージを入れると、スクリプトが自動的にMPM eventを無効化し、MPM preforkを有効化します。ApacheのPHPモジュールは、安全に動作できるのはmpm_preforkの場合のみだからです。もちろん、「libapache2-mod-php」がなければPHPファイルを処理する仕組みがないため、代わりにPHP-FPMを使用します。以下は、まっさらなサーバーにLAMPスタックを構築する手順です。Webアプリケーションの要件に合わせて適宜調整してください。

まずrootとしてログインし、Apacheをインストールします。

apt update && apt install apache2

この時点で、ApacheがデフォルトでMPM eventを有効にした状態で提供されていることを確認できます。

apachectl -V
Linuxサーバーで高トラフィックのWebサイトに対応させるApacheとPHPの構成方法

続いてPHP-FPMをインストールします。

apt install php-fpm

ApacheでPHPプロセッサを有効にする方法の説明が表示されます。

FastCGIプロトコルを有効にします。

a2enmod proxy_fcgi

Apache向けのPHP-FPMデフォルト設定を有効にします。

a2enconf php7.0-fpm

注意:Debian/Ubuntuの今後のバージョンでは、PHP-FPMのバージョンが変わるため、このコマンドはa2enconf php7.6-fpmのように変更される可能性があります。

Apacheを再起動します。

systemctl restart apache2

PHPアプリケーションに必要な残りのコンポーネントをインストールします。以下はその一例です。

apt install mariadb-server php-mysql

これによりデータベースサーバーとPHPのMySQLモジュールがインストールされ、PHPアプリケーションからデータベースへ接続できるようになります。

Red Hat系ディストリビューションでApache MPM EventとPHP-FPMを使う方法

もうひとつの人気の高いサーバー向けディストリビューションがRed Hat、あるいはCentOSです。ここでも同様に、MPM eventを有効にしたApacheとPHP-FPMをクリーンインストールする手順を紹介します。

rootとしてログインし、Apacheをインストールします。

yum install httpd

Debian系とは異なり、執筆時点の最新CentOS 7では、ApacheがデフォルトでMPM preforkを使用していることが確認できます。

apachectl -V
Linuxサーバーで高トラフィックのWebサイトに対応させるApacheとPHPの構成方法

MPM eventを有効にするには、設定ファイルを編集する必要があります。

sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf

このコマンドにより、LoadModule mpm_prefork_module modules/mod_mpm_prefork.soという行の先頭に#が付加され、コメントアウト(無効化)されます。

Linuxサーバーで高トラフィックのWebサイトに対応させるApacheとPHPの構成方法

次のコマンドで先頭の#を削除し、#LoadModule mpm_event_module modules/mod_mpm_event.soという行をコメント解除(有効化)します。

sed -i '/mpm_event\.so$/s/^#//' /etc/httpd/conf.modules.d/00-mpm.conf

Apacheを起動し、システム起動時の自動起動を有効にします。

systemctl start httpd.service
systemctl enable httpd.service

ApacheがMPM eventを使用するようになったか確認しましょう。

apachectl -V
Linuxサーバーで高トラフィックのWebサイトに対応させるApacheとPHPの構成方法

PHP-FPMとFastCGIモジュールをインストールします。

yum install php-fpm mod_fcgid

「/etc/httpd/conf.d/php.conf」を作成し、PHPファイルの処理方法をApacheに指示します。以下の内容をすべてコピーし、ターミナルに一括で貼り付けてENTERキーを押してください。

cat <<PASTE > /etc/httpd/conf.d/php.conf
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
 
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
<FilesMatch ".+\.phps$">
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
PASTE

この優れた設定の功績はDebianに帰属します。他の情報源では、次のようなシンプルな設定ファイルが推奨されることもあります。

<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

しかし、この簡易版は一部の攻撃に対して脆弱です。特定のサービスに障害が発生した場合、PHPファイルがそのまま公開され、保存されたパスワードやコード、機密データが漏洩する恐れがあります。

Apacheを再起動します。

systemctl restart httpd.service

PHP-FPMを起動し、自動起動を有効にします。

systemctl start php-fpm.service
systemctl enable php-fpm.service

まとめ

これで、トラフィック増加にはるかに強いスケーラビリティを持つApacheサーバーが完成しました。ただし、現状の設定はあくまでデフォルト値、つまり「大多数の人にとってベスト」とされるものです。HTTPサーバーから真に最大限のパフォーマンスを引き出したいなら、チューニング可能な各種パラメータについて学ぶ必要があります。最適な値は、サーバーのリソース量、予想されるトラフィック、そしてPHPアプリケーションの特性に大きく左右される点に留意してください。

  1. Linux VPSでCS:GOサーバーを構築する方法【初心者向け完全ガイド】

    Steam公式のCS:GOゲームサーバーは多くの用途に十分対応していますが、細かい設定は自分でコントロールできません。自前のサーバーを立てれば、次のようなことが可能になります。 マッチ時間、フリーズタイム、最大プレイヤー数、フレンドリーファイアなど、独自のルールを自由に設定できる 友人だけのプライベートマッチを開催できる 大会やトーナメントを主催できる カスタムマップでプレイできる なぜLinuxでゲームサーバーを構築するのか? 「Windowsの方が簡単なのでは? 自分のPCでもできるのでは?」と考える方もいるかもしれません。まず、自宅のPCでサーバーをホストする場合、一般的に

  2. OELでの高可用性のためにOracleFormsandReportsをインストールおよび構成します

    このブログでは、Oracle®FormsandReportsバージョン12.2.1.3.0をOracle Enterprise Linux(OEL)バージョン7.2サーバーにインストールして構成し、高可用性を確保する方法を紹介します。 次の図は、高可用性モデルを示しています。 この高可用性モデルを使用するには、次のタスクを実行する必要があります。このブログで詳しく説明しています。 アプリケーションノード(node1およびnode2)にWebLogic®Serverバージョン12.2.1.3をインストールする準備をします。 JDK®1.8をインストールします。 WebLogicServ