Apache Web サーバーのパフォーマンスを向上させる 5 つのヒント
Netcraft (Web ブラウザの使用統計を提供する有名なインターネット企業) の最近のレポートによると、 サイトやインターネットに接続されたコンピュータの間で最も広く使用されている Web サーバーは引き続き Apache です。
さらに、 トップ Web サーバーの中で最大の成長を続けているのはApache であり、 次にNginx とIIS が続きます。したがって、Apache インストールの管理を担当するシステム管理者は、Web サーバーが自分 (またはクライアント) のニーズに応じてその能力を最大限に発揮できるようにする方法を知る必要があります。
この記事では、Apache をスムーズに実行し、リモート クライアントから予想される数のリクエストを処理できるようにするためのヒントをいくつか説明します。
ただし、Apache はベンチマーク記録を達成することを目的として設計されたものではないことに留意してください。それでも、考えられるほとんどすべての使用例で高いパフォーマンスを提供できます。
ヒント #1: Apache を常に最新バージョンに更新し続ける
言うまでもなく、最新バージョンの Apache をインストールすることが、おそらく最初に考慮する必要があることの 1 つです。 2015 年 11 月 19 日の時点で、CentOS 7 リポジトリで利用可能な Apache の最新バージョンは 2.4.6 ですが、Debian の では >2.4.10です。
ただし、新しくリリースされた安定バージョンに最近の改善やバグ修正が追加され、ソースからダウンロードしてインストールできるようになっている場合があります。コンパイルとインストールの手順もここで説明します。この更新方法を選択した場合は、予防措置として現在の構成ファイル/サイト/仮想ホストをバックアップする必要がある場合があることに注意してください。
いずれの場合も、現在インストールされているバージョンは次のようにして確認できます。
httpd -v [On RedHat/CentOS based systems]
apache2 –v [On Debian/Ubuntu based systems]
経験則として、選択したディストリビューションのパッケージ マネージャーが提供する更新方法 (CentOS または Debian の場合は yum update httpd
または aptitude safety-upgrade apache2
) を使用してください。それぞれ)他に方法がない場合を除きます。最新のリリース ノートは、Apache HTTP サーバー プロジェクト Web サイトの「Apache ドキュメント」セクションで読むことができます。
ヒント #2: 2.4 より古いカーネルを使用している場合は、今すぐアップグレードすることを検討してください。
なぜ?カーネル バージョン2.4 以降では、sendfile カーネル システム コールがデフォルトで有効になっています。これにより、(Web サーバーとクライアントの通信のコンテキストで求められる) 高性能のネットワーク ファイル転送が容易になり、Apache が読み取りと送信の操作を同時に実行することで、より高速に、より低い CPU 使用率で静的コンテンツを配信できるようになります。
現在インストールされているカーネルは、次のコマンドで表示できます。
uname -r
そして、www.kernel.org にある最新の安定したカーネル (この記事の執筆時点では 4.3) と比較してください。
これは初心者向けのプロセスではありませんが、カーネルのアップグレードは、Linux の内部構造について詳しく学ぶための興味深い演習です。
ヒント #3: ケースに最適なマルチプロセッシング モジュール (MPM) を選択する
実際には、MPM は、マシン上のネットワーク ポートにバインドする Web サーバーの構成方法、クライアントからのリクエストの受け入れ方法、および子プロセス (およびスレッド、あるいは)そのようなリクエストを処理します。
バージョン 2.4 以降、Apache はニーズに応じて選択できる 3 つの異なる MPM を提供します。
prefork
MPM は、スレッド化せずに複数の子プロセスを使用します。各プロセスは、それぞれに個別のスレッドを作成せずに、一度に 1 つの接続を処理します。詳細には触れませんが、この MPM は、mod_php などの非スレッドセーフ モジュールを使用するアプリケーションをデバッグする場合、またはアプリケーションで処理する必要がある場合にのみ使用すると言えます。worker
MPM は子プロセスごとに複数のスレッドを使用し、各スレッドは一度に 1 つの接続を処理します。これは、前のケースよりも少ない RAM でより多くの同時接続を処理できるため、トラフィックの多いサーバーに適しています。- 最後に、
event
MPM は、バージョン 2.4 以降のほとんどの Apache インストールにおけるデフォルトの MPM です。これは、子プロセスごとに複数のスレッドを作成するという点でワーカー MPM に似ていますが、キープアライブまたはアイドル接続を (その状態に留まっている間) 発生させるという利点があります。単一のスレッドで処理できるため、メモリが解放され、他のスレッドに割り当てることができます。この MPM は、mod_php などの非スレッドセーフ モジュールでの使用には適していないため、代わりに PHP-FPM などの代替モジュールを使用する必要があります。
Apache インストールで使用されているMPM を確認するには、次の手順を実行できます。
httpd -V
下の画像は、 この特定の Web サーバーがプリフォーク MPM を使用していることを示しています。
これを変更するには、以下を編集する必要があります。
/etc/httpd/conf.modules.d/00-mpm.conf [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load [On Debian/Ubuntu based systems]
次のように、目的のモジュールをロードする行のコメントを解除します。
LoadModule mpm_event_module modules/mod_mpm_event.so
注: Debian でイベント MPM を機能させるには、非フリーのソフトウェアから libapache2-mod-fastcgi パッケージをインストールする必要がある場合があります。リポジトリ。
さらに、CentOS の場合は php-fpm (fcgi および mod_fcgid とともに) が必要ですが、Debian では php5-fpm< と呼ばれます。 (apache2-mpm-event とともに)。
最後に、Web サーバーと新しくインストールした php-fpm (または php5-fpm) サービスを再起動します。
RedHat/CentOS の場合
systemctl restart httpd php-fpm && systemctl enable httpd php-fpm
Debian/Ubuntu の場合
systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm
特定の MPM を使用するように Apache を設定できますが、その構成は、前に示したのと同じ方法で仮想ホストごとにオーバーライドできます。
対応するタグを各仮想ホストの構成ファイルにドロップするだけで準備完了ですが、仮想ホストごとに 1 つの MPM のみを使用していることを確認してください。
最後に、選択したディストリビューションに関係なく、php-fpm はFastCGI の実装に依存していることに注意してください。これが、先ほど追加のパッケージのインストールを推奨した理由です。
php-fpm の詳細と例、およびイベント MPM と併用して Apache のパフォーマンスをどのように向上させることができるかについては、公式ドキュメントを参照してください。
前の画像と同じボックスでデフォルトの MPM をプリフォークからイベントに変更すると、次のようになります。
CentOS 7 では、http サービスと https サービスがファイアウォール経由で有効になっていること、およびネットワーク インターフェイスが有効になっていることを確認する必要があります。 ) がデフォルト ゾーンに適切に追加されます。
例えば:
firewall-cmd --zone=internal --add-interface=tun6to4
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent
firewall-cmd --set-default-zone=internal
firewall-cmd --add-service=http
firewall-cmd --add-service=https
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
このことを取り上げる理由は、クラウド VPS のデフォルトの firewalld 構成設定によりphp-fpm と Apache が php ファイルを処理できないという問題を最近経験したためです。
基本的なテストとして (もっと複雑でストレスのかかるテストが考えられると思います)、2 つの CentOS の同じディレクトリに test.php
という名前の別のファイルが存在するかどうかを確認する php ファイルを作成します。ハードウェア特性と負荷は同じですが、MPM が異なる 7 台のサーバー。そのうちの 1 つはイベントを使用し、もう 1 つはプリフォークを使用します。
これは、checkiffileexists.php
という名前のファイルに保存した PHP コードです。
<?php
$filename = 'test.php';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
次に、2000 のリクエストが完了するまで、200 の同時リクエストで Apache ベンチマーク ツール (ab) を実行します。
ab -k -c 100 -n 2000 localhost/checkiffileexists.php
テストを実行して結果を比較してみましょう。パフォーマンス統計に注意してください。
ご覧のとおり、イベントを含むサーバーのパフォーマンスは、 このテストのあらゆる面でプリフォークのサーバーよりも非常に優れています。
ヒント #4: Apache に RAM を賢く割り当てる
おそらく、考慮すべき最も重要なハードウェア項目は、各 Apache プロセスに割り当てられたRAM の量です。これを直接制御することはできませんが、MaxRequestWorkers ディレクティブ (Apache 2.2 では以前は MaxClients として知られていました) を使用して子プロセスの数を制限できます。これにより、Apache による RAM の使用量に制限がかかります。この値も、ホストごとまたは仮想ホストごとに設定できます。
これを行うには、Apache によって使用される RAM の平均量を記録し、それにMaxRequestWorkers の数を掛ける必要があります。これが、Apache プロセスに割り当てられるメモリ量となります。 Web サーバーに絶対にやってほしくないことの 1 つは、スワップの使用を開始することです。スワップの使用を開始すると、パフォーマンスが大幅に低下します。したがって、Apache による RAM の使用量を常に許容できる制限内に保つ必要があり、決してスワップに頼らないようにする必要があります。
たとえば、次のブロックは同時クライアント数を 30 に制限します。より多くのクライアントがホストにアクセスすると、遅延や一時的な障害が発生する可能性がありますが、ブラウザを更新することで簡単に解決できます。これは望ましくないことだと思われるかもしれませんが、サーバーにとってはより健全であり、長期的にはサイトにとっても最善です。
CentOS と Debian のどちらを使用しているかに応じて、このブロックを /etc/httpd/conf/httpd.conf
または /etc/apache2/apache2.conf
内に配置できます。
同じ原則がすべてのMPM に適用されることに注意してください。ここでは、前のヒントで概説した概念を続けるためにイベントを使用しています。
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 30
MaxConnectionsPerChild 1000
</IfModule>
いずれにしても、Apache 2.4 ドキュメントを参照して、選択した MPM にどのディレクティブが許可されているかを確認することを強くお勧めします。
ヒント #5: アプリケーションを理解する
経験則として、アプリケーションが動作するために厳密に必要でない Apache モジュールはロードしないでください。これには、サーバー上で実行されているアプリケーションに関する少なくとも全体的な知識が必要です。特に、あなたがシステム管理者で、開発を担当する別のチームがいる場合はそうです。
次のコマンドを使用して、現在ロードされているモジュールを一覧表示できます。
httpd -M [On RedHat/CentOS based systems]
apache2ctl -M [On Debian/Ubuntu based systems]
CentOS でモジュールをアンロード/無効にするには、(メイン構成ファイルまたは 内の補助構成ファイルのいずれかで) LoadModule で始まる行をコメント アウトする必要があります。 /etc/httpd/conf.modules.d。
一方、Debian ではモジュールを無効にするためのa2dismod というツールが提供されており、次のように使用されます。
a2dismod module_name
有効に戻すには:
a2enmod module_name
どちらの場合も、変更を有効にするために必ず Apache を再起動してください。
概要
この記事では、Apache Web サーバーを調整してパフォーマンスを向上させるのに役立つ 5 つのヒント を確認しました。さらに、セキュリティなしの最適化とパフォーマンスは無意味であることを覚えておく必要があります。そのため、Web サーバーのパフォーマンスを向上させるための mod_pagespeed のインストールと、linux-console.net の Apache 強化に関するヒントの記事も参照することをお勧めします。
この記事ではこのトピックのすべての側面を適切にカバーすることはできないため、コミュニティの他のメンバーと共有したい他のアイデアを思いつくかもしれません。その場合は、以下のコメントフォームを使用してお気軽にお知らせください。