ホームページ >バックエンド開発 >PHPチュートリアル >Apache vs Nginxパフォーマンス:最適化技術
キーポイント
httpd(http Processのみを意味します)という名前で、メインのLinux分布にプリインストールされています。
1995年に出版され、ウィキペディアは「ワールドワイドウェブの初期の開発で重要な役割を果たした」と言っていると引用しました。 W3Techsによると、それは依然として最も一般的に使用されるWebサーバーソフトウェアです。ただし、過去10年間でいくつかの傾向を示し、他のソリューションとの比較を示すレポートに基づいて、その市場シェアは減少しています。 NetcraftとBuiltはわずかに異なるレポートを提供しますが、Apacheの市場シェアは下降傾向にあることに同意しますが、Nginxの市場シェアは増加しています。nginx(発音
エンジンx)は、2004年にIgor Sysoevによってリリースされ、Apacheを超えることを明確に目標としています。 NginxのWebサイトには、これら2つのテクノロジーを比較する価値のある記事があります。最初は、主に静的ファイルを提供するために、主にApacheの補完として使用されていましたが、さまざまなWebサーバータスクを処理するために進化し続けるにつれて着実に成長しています。
逆プロキシ、ロードバランサー、およびHTTPキャッシュとして一般的に使用されます。 CDNおよびビデオストリーミングプロバイダーは、それを使用して、パフォーマンスに不可欠なコンテンツ配信システムを構築します。Apacheは長い間存在しており、多くのモジュールを選択できます。 Apacheサーバーの管理は、ユーザーフレンドリーであることがよく知られています。動的モジュールの読み込みにより、メインサーバーバイナリを再コンパイルせずに、さまざまなモジュールをコンパイルしてApacheスタックに追加できます。通常、モジュールはLinux Distributionリポジトリにあり、インストール後、システムパッケージマネージャーを介してA2ENMODのようなコマンドを使用して優雅にスタックに追加できます。 Nginxはまだこの柔軟性を見ていません。 HTTP/2をサポートするためにNGINXをセットアップするガイドを見ると、モジュールはNGINXがビルドする必要があるもの - ビルド時に構成されています。
Apache市場の優位性に貢献するもう1つの機能は、.htaccessファイルです。これはApacheのキラーであり、ディレクトリレベルでのサーバー構成を制御できるため、共有ホスティング環境に優先ソリューションになっています。 Apacheが提供するサーバー上の各ディレクトリは、独自の.htaccessファイルを持つことができます。
nginxには、同等のソリューションがないだけでなく、パフォーマンスの影響によりこの使用を防ぎます。
LiteSpeedまたはLSWSは、パフォーマンスを犠牲にすることなくApacheに匹敵する柔軟性のレベルがそのレベルのサーバー競争相手です。 Apacheスタイルの.htaccess、mod_security、およびmod_rewriteをサポートしており、設定を共有するために検討する価値があります。 Apacheの直接代替品として計画されており、CpanelとPleskで使用できます。 2015年以来、HTTP/2をサポートしています。
Litespeedには、OpenLiteSpeed、LSWS Standard、およびLSWS Enterpriseの3つのライセンスレベルがあります。 StandardとEnterpriseには、サーバー自体に組み込まれており、.htaccessファイル(各ディレクトリ)の書き換えルールを使用して制御できます。また、いくつかのDDOS緩和「バッテリー」が組み込まれています。これは、イベント主導のアーキテクチャと組み合わさって、パフォーマンスに焦点を当てたホスティングプロバイダーをターゲットにしている強力な競争相手になりますが、小規模なサーバーやWebサイトでもセットアップする価値があります。
ハードウェアの予防策
パフォーマンスチューニングのハードウェアの側面をより深く理解するために、Dropboxには良い記事があります。
監視
その他の監視ツールには、New Relic(フルセットのツールを備えた高度なソリューション)とNetData(優れたスケーラビリティ、細粒メトリック、小型VPSシステムおよびサーバーネットワーク監視用のカスタマイズ可能なWebダッシュボードを提供するオープンソースソリューション)が含まれます。電子メール、Slack、Pushbullet、Telegram、Twilioなどを介して、アプリケーションまたはシステムプロセスのアラートを送信できます。
Monitは、システムを監視するもう1つのヘッドレスオープンソースツールであり、特定の条件が満たされたときに警告するように構成することができます。
AB(Apache Benchmark)は、Apache Foundationの単純な負荷テストツールであり、Siegeは別の負荷テストプログラムです。この記事では、それらをセットアップする方法について説明します。ABに関するより高度なヒントをいくつか紹介します。包囲のより深い理解がここにあります。
Webインターフェイスを好む場合、LocustはWebサイトのパフォーマンスのテストに非常に便利なPythonベースのツールです。
Locustをインストールした後、発売するディレクトリにLocustFileを作成する必要があります。
<code>from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task(1) def index(self): self.client.get("/") @task(2) def shop(self): self.client.get("/?page_id=5") @task(3) def page(self): self.client.get("/?page_id=2") class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 300 max_wait = 3000 </code>その後、コマンドラインから起動するだけです:
<code>locust --host=https://my-website.com </code>これらの負荷テストツールに関する警告:DDOS攻撃の効果があるため、テストを自分のWebサイトに制限することをお勧めします。
Apache
モードを設計しました。各プロセスに埋め込まれた動的言語通訳(MOD_PHPなど)は依然としてコストがかかり、Apacheのデフォルト設定によりサーバーがクラッシュします。各プロセスは、1つの着信接続のみを処理できます。 このモデルは、ApacheのMPM(マルチプロセスモジュール)システムでMPM_PREFORK_MODULE
と呼ばれます。 Apacheのウェブサイトによると、このモードは自己調整できるため、ほとんど構成を必要としません。最も重要なことは、MaxRequestworkersの指令は、あなたが期待すると同じくらい多くの同時リクエストを処理するのに十分な大きさですが、確実にするのに十分なほど小さいすべてのプロセスには、十分な物理的RAMがあります。
着信トラフィックを処理するために生成された多数のアパッチプロセスを示す小さなイナゴロードテスト。
このパターンは、Apacheの悪名高い評判の主な理由かもしれないと付け加えることができます。リソースは非効率的です。
Apacheのバージョン2.0は、プレフォルクモードの問題を解決しようとする他の2つのMPMをもたらします。それらは、ワーカーモジュールまたは mpm_worker_moduleおよびイベントモジュールです。
ワーカーモジュールはプロセスベースではありません。 ApacheのWebサイトを引用:
単一制御プロセス(親プロセス)は、子プロセスの開始を担当します。各子のプロセスは、スレッドスパーチャイルドディレクティブで指定された番号に基づいて固定数のサーバースレッドを作成し、接続をリッスンし、接続が到着したときに処理するためにサーバースレッドに渡すリスニングスレッドを作成します。このモードはより多くのリソースを節約します。
Apacheのバージョン2.4は、3番目のMPM -Eventモジュールをもたらします。これは、Worker MPMに基づいており、HTTPリクエストが完了した後に眠いキープアライブ接続を管理する別のリスニングスレッドを追加します。これは、メモリフットプリントが小さい非ブロッキング非同期モードです。バージョン2.4の改善の詳細については、こちらをご覧ください。
仮想サーバーに約1200の投稿を備えたテストWooCommerceインストーラーをロードし、デフォルトのプレフィックモードとMOD_PHPでApache 2.4でテストしました。
最初に、https://tools.pingdom.comでlibapache2-mod-php7とmmpm_prefork_moduleを使用してテストしました。
次に、イベントMPMモジュールをテストしました。
/etc/apt/sources.list:
に多元宇宙を追加する必要があります
php-fpmはapacheとは別のサービスであるため、再起動する必要があります。
<code>from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
@task(1)
def index(self):
self.client.get("/")
@task(2)
def shop(self):
self.client.get("/?page_id=5")
@task(3)
def page(self):
self.client.get("/?page_id=2")
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 300
max_wait = 3000
</code>
<code>locust --host=https://my-website.com
</code>
その後、プレフィックモジュールを無効にし、イベントモードとproxy_fcgiを有効にしました:<code>deb http://archive.ubuntu.com/ubuntu xenial main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu xenial partner</code>
このスニペットをApache仮想ホストに追加します:<code>sudo apt-get install libapache2-mod-fastcgi php7.0-fpm
</code>
このポートは、/etc/php/7.0/fpm/pool.d/www.confのPHP-fpm構成と一致する必要があります。 PHP-FPM設定の詳細については、こちらをご覧ください。 <code>sudo service start php7.0-fpm
</code>
<code>from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
@task(1)
def index(self):
self.client.get("/")
@task(2)
def shop(self):
self.client.get("/?page_id=5")
@task(3)
def page(self):
self.client.get("/?page_id=2")
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 300
max_wait = 3000
</code>
Apacheを調整するためのその他のヒント:
:
一般的に言えば、.htaccessファイルは、プライマリサーバー構成ファイルにアクセスする許可がない場合にのみ使用する必要があります。 …一般的に言えば、.htaccessファイルはできるだけ回避する必要があります。メインサーバー構成ファイルの
セクションを使用するのと同じくらい効率的に.htaccessファイルに入れたいと思う構成を実行できます。ソリューションは、/etc/apache2/apache2.confで無効にすることです
特定のディレクトリに必要な場合は、仮想ホストファイルの
<code>locust --host=https://my-website.com </code>
セクションで有効にすることができます。
<code>deb http://archive.ubuntu.com/ubuntu xenial main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse deb http://archive.canonical.com/ubuntu xenial partner</code>hostnameLookupsをオフにしておく - hostnameLookupsオフは、Apache 1.3以来デフォルトでしたが、パフォーマンスの損失につながる可能性があるため、オフのままであることを確認してください。
apache2buddyは、システムを調整するためのトリックを実行できる簡単なスクリプトです フォーキングプロセスは、イベントループに比べて非常に高価です。イベントベースのHTTPサーバーが最終的に勝ちます。
nginxアーキテクチャのより包括的な視覚的説明は、こちらをご覧ください。nginx設定
nginxは、Worker_Processesを/etc/nginx/nginx.conf(デフォルトは1)にAutoに設定することにより、労働者の数をPCコアの数(ApacheのMPM_Event構成で行ったように)に修正することをお勧めします。
worker_connections各ワーカープロセスが処理できる接続の数を設定します。デフォルトは512ですが、通常は増加できます。
KeepAlive接続は、パフォーマンスに影響するサーバーの側面であり、通常はベンチマークでは見えません。
:
HTTP KeepAlive接続は、レイテンシを削減し、Webページの読み込みをスピードアップする必要なパフォーマンス機能です。
新しいTCP接続を確立することは高価になる可能性があります。
Keepalive_Requestsは、クライアントが単一のキープライブ接続を介して行うことができるリクエストの数を規制する設定です。 keepalive_timeoutは、アイドルキープライブの接続が開いたままである時間を設定します。
KeepAliveは、nginxの上流サーバーへの接続に関連する設定です。これは、プロキシまたはロードバランサーとして機能する場合です。これは、労働者プロセスごとに無料のキープアライブ上流接続の数を意味します。
上流のキープアライブ接続を有効にするには、これらの命令をnginxメイン構成に入れる必要があります。
nginxアップストリーム接続は、NGX_HTTP_UPSTREAM_MODULEによって管理されます。
<code>from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task(1) def index(self): self.client.get("/") @task(2) def shop(self): self.client.get("/?page_id=5") @task(3) def page(self): self.client.get("/?page_id=2") class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 300 max_wait = 3000 </code>
フロントエンドアプリケーションがバックエンドアプリケーションを更新のためにポーリングし続けている場合、KeepAlive_RequestsとKeepalive_Timeoutの増加により、作成する必要がある接続の数が制限されます。 KeepAliveディレクティブは、アップストリームサーバーへの他の接続を許可するために大きすぎてはなりません。
これらの設定の調整は、特定の状況に基づいており、テストする必要があります。これはおそらく、Keepaliveにデフォルトの設定がない理由の1つです。
Unixソケットを使用して通常、nginxを使用した仮想ホスト設定は次のとおりです。
FASTCGIとHTTPは異なるプロトコルであるため、最初の2行はいくつかのパラメーターとヘッダーをPHP -FPMに前進させ、3番目の行はローカルネットワークソケットを介してプロキシ要求の要求を指定します。
<code>locust --host=https://my-website.com </code>これは、マルチサーバーのセットアップに実用的です。リクエストをプロキシにするリモートサーバーも指定できるためです。
ただし、単一のシステムでセットアップ全体をホストする場合は、UNIXソケットを使用してリスニングPHPプロセスに接続する必要があります。
unixソケットは、TCPよりも優れたパフォーマンスを持っていると考えられており、この設定はより安全であると考えられています。この設定の詳細については、この記事でRackspaceにご覧ください。
Unixソケットに関するこのヒントは、Apacheでも機能します。詳細はこちらをご覧ください。
GZIP_STATIC:Webサーバーのパフォーマンスに関する一般的な見解は、静的リソースを圧縮することです。これは通常、各リクエストで動的にリソースを圧縮することは高価になる可能性があるため、妥協して特定のしきい値を超えるファイルのみを圧縮しようとすることを意味します。 nginxには、通常のリソースの代わりに、gzipバージョンのファイル(拡張機能.gz)を提供できるGZIP_staticディレクティブがあります。
このようにして、nginxはstyle.cssの代わりにstyle.css.gzを提供しようとします(この場合、自分でgzippingを処理する必要があります)。<code>from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): @task(1) def index(self): self.client.get("/") @task(2) def shop(self): self.client.get("/?page_id=5") @task(3) def page(self): self.client.get("/?page_id=2") class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 300 max_wait = 3000 </code>この方法では、CPUサイクルは、各リクエストの動的圧縮で無駄になりません。
nginx
でキャッシュ
Nginxについてのストーリーは、コンテンツのキャッシュ方法について言及せずに不完全です。 Nginxキャッシュは非常に効率的であるため、多くのシステム管理者は、別のHTTPキャッシュ層(ワニスなど)があまり意味がないと考えています。 「シンプルさは特徴です。」 Nginxキャッシュを有効にすることは非常に簡単です。これは、サーバーブロックの外側にある仮想ホストファイルに配置する指令です。 proxy_cache_pathパラメーターは、キャッシュを保存する任意のパスにすることができます。レベルは、NGINXがキャッシュコンテンツを保存するディレクトリレベルの数を指定します。パフォーマンスの理由から、通常、2つのレベルは問題ありません。ディレクトリをトラバースするのは時間がかかる場合があります。 keys_zoneパラメーターは、キャッシュキーを保存するために使用される共有メモリ領域の名前であり、10mはメモリ内のこれらのキーのスペースです(10MBで十分です。これは実際のキャッシュコンテンツのスペースではありません)。 max_sizeはオプションであり、キャッシュされた内容の上限を設定します - ここに10GBがあります。指定されていない場合、利用可能なすべてのスペースを占有します。非アクティブでは、コンテンツが要求される前にキャッシュにとどまることができる時間を指定し、Nginxによって削除されます。
<code>locust --host=https://my-website.com </code>設定後、メモリ領域の名前をサーバーまたはロケーションブロックに含む次の行を追加します。
Nginxの追加断層耐性層は、ソースサーバー、アップストリームサーバー、またはサーバーダウンタイムでエラーが発生したときにキャッシュからアイテムを提供するようにNginxに指示することにより実装できます。
サーバーまたはロケーションブロックの指示の詳細については、nginxキャッシュをさらに調整するには、こちらを参照してください。
<code>deb http://archive.ubuntu.com/ubuntu xenial main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu xenial-updates main restricted universe multiverse deb http://security.ubuntu.com/ubuntu xenial-security main restricted universe multiverse deb http://archive.canonical.com/ubuntu xenial partner</code>プロキシ
キャッシュ
<code>sudo apt-get install libapache2-mod-fastcgi php7.0-fpm </code>ディレクティブは静的リソースに使用されますが、通常、Webアプリケーションの動的な出力をキャッシュしたいのです。この場合、Proxyの代わりにfastCGI
キャッシュ
ディレクティブを使用します cache *: 上記の最後の行は、応答ヘッダーを設定して、コンテンツがキャッシュから渡されるかどうかを確認します。 次に、サーバーまたはロケーションブロックで、いくつかのキャッシュの例外を設定できます。たとえば、リクエストURLにクエリ文字列が存在する場合:
また、PHPの場合、サーバーの.phpブロックで、次のようなものを追加します。<code>sudo service start php7.0-fpm </code>上記の上記、fastcgi_cache* linesおよびfastcgi_no_cacheはキャッシュと除外を調節します。これらすべての指示への詳細な参照は、NGINXドキュメントWebサイトにあります。
詳細については、Nginxのスタッフはこのトピックに関する無料のウェビナーを提供しており、多くの電子書籍があります。
Webサーバーのパフォーマンスとその背後にある理論の改善に役立ついくつかのテクノロジーを導入しようとしています。しかし、このトピックは決して網羅的なものではありません。まだ逆プロキシ設定やApacheとNginxで構成されるマルチサーバー設定をカバーしていません。両方のサーバーの最良の結果は、特定の実際のケースのテストと分析に依存します。これは終わりのないトピックです。
ApacheおよびNginxパフォーマンス最適化テクノロジーに関するFAQパフォーマンスを向上させるためにnginxを最適化するにはどうすればよいですか?
パフォーマンスを向上させるためにApacheを最適化する方法は?
ApacheとNginxを同時に使用できますか?
nginxは、イベント駆動型アーキテクチャのために静的コンテンツを提供することに優れています。これにより、最小限のメモリ使用量と同時に数千の同時接続を処理できます。動的なコンテンツの場合、NGINXはリクエストをアプリケーションサーバー(PHP-FPMなど)に渡すか、それらをApacheサーバーにプロキシできます。ただし、NGINXは、ApacheがMOD_PHPモジュールを使用するように、ローカルで動的コンテンツを処理しません。
Apacheは静的コンテンツと動的なコンテンツを提供できます。静的コンテンツの場合、Apacheはコアモジュールを使用します。動的なコンテンツの場合、ApacheはMOD_PHPなどの追加のモジュールを使用してPHPスクリプトを処理します。ただし、Apacheのプロセス駆動型モデルは、複数の同時接続を扱う際に大量のメモリ使用量につながる可能性があり、静的コンテンツの配信に関してNginxよりも効率が低くなります。
サーバーの最適化により、ウェブサイトのパフォーマンスが大幅に向上する可能性があります。サーバーの応答時間を短縮し、サーバーが処理できる同時接続の数を増やし、帯域幅の使用量を減らすことができます。これにより、ページの読み込み時間が短縮され、ユーザーエクスペリエンスが向上し、SEOランキングが改善されます。
apacheとnginxを選択することは、特定のニーズに依存します。多くの同時接続を効率的に処理できるサーバーが必要な場合、または主に静的コンテンツを提供できる場合は、Nginxがより良い選択かもしれません。動的なコンテンツ処理を強力にサポートするサーバーが必要な場合、または構成用に.htaccessファイルに依存している場合、Apacheがより適切になる場合があります。
ApacheとNginxのパフォーマンスを監視する方法は?
以上がApache vs Nginxパフォーマンス:最適化技術の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。