キャッシングとは何ですか?

キャッシングは、一般的に要求されるコンテンツを、より高速なアクセスを可能にする方法で一時的に保存できるようにすることで、サーバーのパフォーマンスを向上させる方法です。 これにより、リソースを大量に消費する操作が削減され、処理と配信が高速化されます。

効果的なキャッシュルールを作成することにより、キャッシュに適したコンテンツが保存され、応答時間が改善され、リソースが節約され、負荷が最小限に抑えられます。 Apacheは、さまざまなタイプの操作を高速化するのに適したさまざまなキャッシュを提供します。 このガイドでは、さまざまなキャッシングモジュールを使用してCentOS7でApache2.4を設定する方法について説明します。

一般的なキャッシュ戦略の開発の詳細については、この記事をご覧ください。

Apacheでのキャッシングの概要

Apacheは、さまざまなレベルの洗練度とスケーラビリティを備えたコンテンツをキャッシュできます。 プロジェクトは、コンテンツがキャッシュされる方法に従って、これらを3つのグループに分割します。 一般的な内訳は次のとおりです。

  • ファイルキャッシング:最も基本的なキャッシング戦略です。これは、サーバーの起動時にファイルまたはファイル記述子を開き、アクセスを高速化するためにそれらを利用できるようにしておくだけです。
  • キー値キャッシング:主にSSLおよび認証キャッシングに使用されるキー値キャッシングは、繰り返し計算するのにコストがかかるアイテムを格納できる共有オブジェクトモデルを使用します。
  • 標準HTTPキャッシング:最も柔軟で一般的に有用なキャッシングメカニズムであるこのスリーステートシステムは、応答を保存し、有効期限が切れたときにそれらを検証できます。 これは、特定のニーズに応じて、パフォーマンスまたは柔軟性を考慮して構成できます。

上記の説明をざっと見てみると、上記の方法にはいくつかの重複があることがわかりますが、同時に複数の戦略を使用すると役立つ場合もあります。 たとえば、SSLセッションにKey-Valueストアを使用し、応答に標準のHTTPキャッシュを有効にすると、データソースの負荷を大幅に軽減し、クライアントの多くのコンテンツ配信操作を高速化できます。

Apacheの各キャッシングメカニズムについての幅広い理解ができたので、これらのシステムをさらに詳しく見ていきましょう。

ファイルキャッシング

総括

  • 関連するプライマリモジュールmod_file_cache
  • 主な使用例:サーバーの起動時にファイルの内容またはファイル記述子を保存します。 これらは静的な表現であり、サーバーを再起動するまで確実に変更することはできません。
  • 機能:シンプルで、低速のファイルシステムのパフォーマンスを向上させます
  • 欠点:実験的な機能、ファイルシステムの更新に応答しない、オペレーティングシステムの制限内に収まるように慎重に使用する必要があり、静的ファイルでのみ使用できます

詳細

The mod_file_cache モジュールは主に、ファイルシステムが遅いサーバーでのファイルアクセスを高速化するために使用されます。 これは、2つの構成ディレクティブの選択肢を提供します。どちらも、ファイルが要求されたときではなく、サーバーの起動時に一部の作業を実行することにより、静的ファイルを提供するプロセスを加速することを目的としています。

The CacheFile ディレクティブは、アクセスを高速化するディスク上のファイルへのパスを指定するために使用されます。 Apacheが起動すると、Apacheは指定された静的ファイルを開き、ファイルハンドルをキャッシュします。これにより、要求されたときにファイルを開く必要がなくなります。 この方法で開くことができるファイルの数は、オペレーティングシステムによって設定された制限の影響を受けます。

The MMapFile ディレクティブは、Apacheが最初に起動されたときにもファイルを開きます。 でも、 MMapFile ファイルハンドラだけでなく、ファイルの内容をメモリにキャッシュします。 これにより、これらのページのパフォーマンスが向上しますが、いくつかの重大な制限があります。 使用したメモリ量の記録がないため、メモリが不足する可能性があります。 また、子プロセスは割り当てられたメモリのいずれかをコピーするため、当初の予想よりもリソースが枯渇する可能性があることに注意してください。 このディレクティブは慎重に使用してください。

これらのディレクティブは、Apacheの起動時にのみ評価されます。 つまり、Apacheを使用して、開始後に行われた変更を取得することはできません。 これらは、Apacheセッションの存続期間中変更されない静的ファイルでのみ使用してください。 ファイルの変更方法によっては、サーバーに変更が通知される場合がありますが、これは予期された動作ではなく、常に正しく機能するとは限りません。 これらのディレクティブに渡されるファイルに変更を加える必要がある場合は、変更を加えた後でApacheを再起動してください。

ファイルキャッシュを有効にする方法

ファイルのキャッシュは、 mod_file_cache モジュール。 この機能を使用するには、モジュールを有効にする必要があります。

CentOS 7を実行している場合、Apacheをインストールするとモジュールがインストールされますが、デフォルトの構成ではモジュールはロードされません。 モジュールをロードするには、に簡単なファイルを作成します /etc/httpd/conf.modules.d モジュールをロードするディレクトリ。 このファイルを呼び出します 00-cache.conf:

  1. sudo nano /etc/httpd/conf.modules.d/00-cache.conf

内部では、を使用する必要があります LoadModule 必要な機能を有効にするためのディレクティブ。 次の行をファイルに追加します。

/etc/httpd/conf.modules.d/00-cache.conf
LoadModule file_cache_module modules/mod_file_cache.so

終了したら、ファイルを保存して閉じます。

その後、メインの構成ファイルを編集して、ファイルキャッシュディレクティブを設定する必要があります。 次のように入力してファイルを開きます。

  1. sudo nano /etc/httpd/conf/httpd.conf

ファイルハンドルのキャッシュを設定するには、 CacheFile 指令。 このディレクティブは、次のように、スペースで区切られたファイルパスのリストを取ります。

/etc/httpd/conf/httpd.conf
CacheFile /var/www/html/index.html /var/www/html/somefile.index

サーバーが再起動されると、Apacheはリストされたファイルを開き、アクセスを高速化するためにファイルハンドルをキャッシュに保存します。

代わりに、いくつかのファイルをメモリに直接マップする場合は、 MMapFile 指令。 その構文は、ファイルパスのリストを取得するという点で、基本的に最後のディレクティブと同じです。

/etc/httpd/conf/httpd.conf
MMapFile /var/www/html/index.html /var/www/html/somefile.index

実際には、両方を構成する理由はありません。 CacheFileMMapFile 同じファイルのセットに対してですが、異なるファイルのセットに対して両方を使用できます。

終了したら、ファイルを保存して閉じることができます。 次のように入力して、構成ファイルの構文を確認します。

  1. sudo apachectl configtest

最後の行が Syntax OK、Apacheインスタンスを安全に再起動できます。

  1. sudo systemctl restart httpd

Apacheが再起動し、使用したディレクティブに応じてファイルの内容またはハンドラーをキャッシュします。

キーバリューキャッシング

総括

  • 関連するプライマリモジュールmod_socache_dbm, mod_socache_dc, mod_socache_memcache, mod_socache_shmcb
  • 関連するサポートモジュールmod_authn_socache, mod_ssl
  • 主な使用例:SSLセッションまたは認証の詳細の保存、SSLステープル
  • 機能:複雑なリソースを格納するための共有オブジェクトキャッシュ、SSLセッションのキャッシュとステープリングを支援できる柔軟なバックエンド
  • 欠点:検証メカニズムがないため、パフォーマンスが高く柔軟なバックエンド用に個別のソフトウェアを構成する必要があります。コードにいくつかのバグがあります。

詳細

キー値キャッシングはファイルキャッシングよりも複雑であり、より焦点を絞った利点があります。 共有オブジェクトキャッシュとも呼ばれるApacheのキー値キャッシュは、コンテンツ自体ではなく、コンテンツへのクライアントのアクセスの設定に関連する高価な操作の繰り返しを回避するために主に使用されます。 具体的には、認証の詳細、SSLセッションをキャッシュし、SSLステープリングを提供するために使用できます。

ノート

現在、すべての共有オブジェクトキャッシュプロバイダーにいくつかの問題があります。 問題への参照は以下に概説されます。 この機能を有効にするかどうかを評価するときは、これらを考慮に入れてください。

実際のキャッシングは、共有オブジェクトキャッシングプロバイダーモジュールの1つを使用して実行されます。 これらは:

  • mod_socache_dbm :このバックエンドは単純な dbm データベースエンジン。ハッシュと固定サイズのバケットを利用するファイルベースのKey-Valueストアです。 このプロバイダーはいくつかのメモリリークに悩まされているため、ほとんどの場合、使用することをお勧めします mod_socache_shmcb 代わりは。
  • mod_socache_dc :このプロバイダーはdistcacheセッションキャッシングソフトウェアを使用します。 このプロジェクトは2004年以降更新されておらず、一部のディストリビューション用にパッケージ化されていないため、十分に注意して使用してください。
  • mod_socache_memcache :これはアイテムを保存するためにmemcache分散メモリオブジェクトキャッシュを使用します。 これは、複数のサーバーに分散されたキャッシュに最適なオプションです。 現在、エントリは適切に期限切れになりませんが、パッチが問題を修正するApacheのバージョン管理のトランクにコミットされました。
  • mod_socache_shmcb :現在、これはKey-Valueキャッシングに最適なオプションです。 これは共有メモリの循環バッファにキャッシュされ、エントリがいっぱいになるとエントリが削除されます。 現在、サイズが11kを超えるエントリでチョークします。

上記のプロバイダーモジュールに加えて、キャッシュされるオブジェクトに応じて追加のモジュールが必要になります。 たとえば、SSLセッションをキャッシュしたり、SSLステープリングを構成したりするには、 mod_ssl 有効にする必要があります。 SSLSessionCacheSSLStaplingCache それぞれディレクティブ。 同様に、認証キャッシュを設定するには、 mod_authn_socache モジュールを有効にして、 AuthnCacheSOCache ディレクティブを設定できます。

キー値キャッシュを有効にする方法

上記のバグと警告を念頭に置いて、Apacheでこのタイプのキャッシュを構成したい場合は、以下に従ってください。

キー値キャッシュの設定に使用される方法は、使用目的と使用しているプロバイダーによって異なります。 以下では、認証キャッシングとSSLセッションキャッシングの両方の基本について説明します。

現在、認証キャッシングにバグがあり、キャッシュプロバイダーに引数を渡すことができません。 したがって、フォールバックするデフォルト設定を提供していないプロバイダーには問題があります。

認証キャッシング

認証キャッシュは、LDAPやデータベース認証などの高価な認証方法を使用している場合に役立ちます。 これらのタイプの操作は、認証要求が行われるたびにバックエンドをヒットする必要がある場合、パフォーマンスに大きな影響を与える可能性があります。

キャッシュの設定には、既存の認証構成の変更が含まれます(このガイドでは、認証の設定方法については説明しません)。 バックエンドの認証方法に関係なく、変更自体はほとんど同じです。 使用します mod_socache_shmcb 私たちのデモンストレーションのために。 このモジュールはすでに有効になっています /etc/httpd/conf.modules.d/00-base.conf ファイル。

メインのApache構成ファイルを開いて、認証で使用するこの共有キャッシュバックエンドを指定できるようにします。

  1. sudo nano /etc/httpd/conf/httpd.conf

内部で、ファイルの上部に向かって、 AuthnCacheSOCache 指令。 それを指定します shmcb プロバイダーとして使用する必要があります。 オプションの受け渡しを防ぐ前述のバグがこれを読むまでに修正されている場合は、キャッシュの場所とサイズを指定できます。 数値はバイト単位であるため、コメント付きの例では512キロバイトのキャッシュになります。

/etc/httpd/conf/httpd.conf
AuthnCacheSOCache shmcb

# If the bug preventing passed arguments to the provider gets fixed,
# you can customize the location and size like this
#AuthnCacheSOCache shmcb:${APACHE_RUN_DIR}/auth_cache(512000)

終了したら、ファイルを保存して閉じます。

次に、認証が構成されている仮想ホスト構成ページを開きます。 と呼ばれる仮想ホスト構成を使用していると想定します site.conf 内にあります /etc/httpd/conf.d ディレクトリですが、環境を反映するように変更する必要があります。

  1. sudo nano /etc/httpd/conf.d/site.conf

認証を使用して設定された基本的な仮想ホストは、次のようになります。

/etc/httpd/conf.d/site.conf
<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    <Directory /var/www/html/private>
        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/.htpasswd
        AuthBasicProvider file
        Require valid-user
    </Directory>
</VirtualHost>

認証を構成した場所で、ブロックを変更してキャッシュを追加します。 具体的には、を追加する必要があります AuthnCacheProvideFor キャッシュする認証ソースを指定するには、次のようにキャッシュタイムアウトを追加します。 AuthnCacheTimeout、および追加 socacheAuthBasicProvider 従来の認証方法の前にリストします。 結果は次のようになります。

/etc/httpd/conf.d/site.conf
<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    <Directory /var/www/html/private>
        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/apache/.htpasswd
        AuthBasicProvider socache file
        AuthnCacheProvideFor file
        AuthnCacheTimeout 300
        Require valid-user
    </Directory>
</VirtualHost>

上記の例はファイル認証用であり、キャッシュによるメリットはあまりありません。 ただし、他の認証方法を使用する場合の実装は非常に似ている必要があります。 唯一の大きな違いは、上記の例で「ファイル」の指定がある場合であり、代わりに他の認証方法が使用されます。

ファイルを保存して閉じます。 次のように入力して、構文エラーの変更を確認します。

  1. sudo apachectl configtest

構文エラーが見つからない場合は、Apacheを再起動して、キャッシュの変更を実装します。

  1. sudo systemctl restart httpd

SSLセッションキャッシング

SSL接続を確立するために実行する必要のあるハンドシェイクには、かなりのオーバーヘッドが伴います。 そのため、セッションデータをキャッシュして、以降の要求に対するこの初期化ステップを回避すると、このペナルティを回避できる可能性があります。 共有オブジェクトキャッシュは、これに最適な場所です。

Apacheサーバー用にSSLがすでに構成されている場合は、 mod_ssl 有効になります(そうでない場合は、 yum インストールするには mod_ssl モジュール)。 CentOS 7では、これは ssl.conf ファイルはで利用可能になります /etc/httpd/conf.d ディレクトリ。 これは実際にはすでにキャッシュを設定しています。 内部には、次のような行が表示されます。

/etc/httpd/conf.d/ssl.conf
. . .

SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300

. . .

これは、実際にはセッションキャッシュを設定するのに十分です。 これをテストするには、OpenSSLの接続クライアントを使用できます。 タイプ:

  1. openssl s_client -connect 127.0.0.1:443 -reconnect -no_ticket | grep Session-ID

すべての結果でセッションIDが同じである場合、セッションキャッシュは正しく機能しています。 CTRL-Cを押して終了し、ターミナルに戻ります。

標準のHTTPキャッシング

総括

  • 関連するプライマリモジュールmod_cache
  • 関連するサポートモジュールmod_cache_disk, mod_cache_socache
  • 主な使用例:一般的なコンテンツのキャッシュ
  • 機能:HTTPキャッシングヘッダーを正しく解釈でき、古いエントリを再検証でき、ニーズに応じて最高の速度または柔軟性でデプロイできます
  • 欠点:設定が正しくないと機密データが漏洩する可能性があります。キャッシュポリシーを正しく設定するには、追加のモジュールを使用する必要があります

詳細

HTTPプロトコルは、コンテンツ配信パスに沿って応答をキャッシュするためのメカニズムを奨励および提供します。 コンテンツにアクセスするコンピューターは、コンテンツのオリジンで設定されたキャッシュポリシーとコンピューター自体のキャッシュルールに応じて、特定の時間、各アイテムをキャッシュできる可能性があります。

Apache HTTPキャッシングメカニズムは、表示されるHTTPキャッシングポリシーに従って応答をキャッシュします。 これは、配信に関与する中間サーバーが従うのと同じルールに準拠する汎用キャッシングシステムです。 これにより、このシステムは非常に柔軟で強力になり、コンテンツにすでに設定されているはずのヘッダーを活用できるようになります(これを行う方法については以下で説明します)。

ApacheのHTTPキャッシュは、「スリーステート」キャッシュとも呼ばれます。 これは、保存されているコンテンツが3つの状態のいずれかになり得るためです。 新鮮な場合、つまりそれ以上チェックせずにクライアントに提供できる場合、古い場合、コンテンツのTTLが期限切れになっている場合、またはコンテンツがキャッシュに見つからない場合は存在しない場合があります。 。

コンテンツが古くなった場合、次のリクエストで、キャッシュは元のコンテンツをチェックすることでコンテンツを再検証できます。 変更されていない場合は、鮮度の日付をリセットして現在のコンテンツを提供できます。 それ以外の場合は、変更されたコンテンツをフェッチし、キャッシュポリシーで許可されている期間保存します。

モジュールの概要

HTTPキャッシングロジックは、 mod_cache モジュール。 実際のキャッシングは、キャッシングプロバイダーの1つを使用して行われます。 通常、キャッシュはを使用してディスクに保存されます mod_cache_disk モジュールですが、共有オブジェクトのキャッシュは、 mod_cache_socache モジュール。

The mod_cache_disk モジュールはディスク上にキャッシュされるため、リモートの場所からコンテンツをプロキシする場合、動的プロセスからコンテンツを生成する場合、またはコンテンツが通常存在するよりも高速なディスクにキャッシュすることで処理を高速化する場合に便利です。 これは最もよくテストされたプロバイダーであり、ほとんどの場合、おそらく最初の選択肢になるはずです。 キャッシュは自動的にクリーンアップされないため、 htcacheclean キャッシュをスリム化するために時々実行する必要があります。 これは手動で実行でき、通常のように設定できます cron ジョブ、またはデーモンとして実行します。

The mod_cache_socache モジュールは、共有オブジェクトプロバイダーの1つ(前のセクションで説明したものと同じもの)にキャッシュします。 これにより、パフォーマンスが向上する可能性があります mod_cache_disk (選択されている共有キャッシュプロバイダーによって異なります)。 ただし、これははるかに新しく、前述のバグがある共有オブジェクトプロバイダーに依存しています。 を実装する前に、包括的なテストを行うことをお勧めします mod_cache_socache オプション。

HTTPキャッシュの配置

ApacheのHTTPキャッシュは、ニーズに応じて2つの異なる構成でデプロイできます。

の場合 CacheQuickHandler が「オン」に設定されている場合、キャッシュはリクエスト処理プロセスの非常に早い段階でチェックされます。 コンテンツが見つかった場合、それ以上の処理なしで直接提供されます。 これは、信じられないほど高速であることを意味しますが、コンテンツの認証などのプロセスを許可しないことも意味します。 通常は認証またはアクセス制御を必要とするコンテンツがキャッシュにある場合、認証なしで誰でもにアクセスできます。 CacheQuickHandler 「オン」に設定されています。

基本的に、これはWebサーバーの前にある個別のキャッシュをエミュレートします。 Webサーバーが何らかの条件付きチェック、認証、または承認を行う必要がある場合、これは発生しません。 Apacheは内のディレクティブを評価しません <Location> また <Directory> ブロック。 ご了承ください CacheQuickHandler デフォルトによって「オン」に設定されます!

の場合 CacheQuickHandler が「オフ」に設定されている場合、キャッシュはリクエスト処理シーケンスのかなり後の方でチェックされます。 この構成は、Apache処理ロジックと実際のコンテンツの間にキャッシュを配置するものと考えてください。 これにより、キャッシュからコンテンツを取得する前に、従来の処理ディレクティブを実行できます。 これを「オフ」に設定すると、要求をより深く処理する機能と少し速度が低下します。

標準のHTTPキャッシングを構成する方法

キャッシュを有効にするには、を有効にする必要があります mod_cache モジュールとそのキャッシングプロバイダーの1つ。 上で述べたように、 mod_cache_disk 十分にテストされているので、それに依存します。

キャッシュを自動的に管理するためのhtcachecleanの設定

CentOS 7システムでは、 htcacheclean キャッシュが大きくなるにつれてキャッシュを削減するために使用されるユーティリティは、 httpd インストール。 A systemd と呼ばれる単位ファイル htcacheclean.service デフォルトで含まれています。

キャッシングの設定を計画している場合は、このサービスを自動的に実行するように構成することをお勧めします。 サービスファイルは実際にサービスをデーモン化し、構成可能な間隔でクリーニング操作を実行します。 ただし、デフォルトでは、Apacheの起動時に起動するメカニズムはありません。

これを設定するには、というディレクトリを作成します httpd.service.requires 以内 /etc/systemd/system ディレクトリ。 これは、の依存関係を指定するために使用できます httpd.service Apacheを起動するユニットファイル:

  1. sudo mkdir -p /etc/systemd/system/httpd.service.requires

その後、リンクすることができます htcacheclean.service このディレクトリにユニットファイル。 これにより、 htcacheclean Apacheの起動時に定期的にキャッシュを開始およびクリーンアップするサービス:

sudo ln -s /usr/lib/systemd/system/htcacheclean.service /etc/systemd/system/httpd.service.requires

あなたは設定することができます htcacheclean クリーニング間隔を含むオプションを編集して htcacheclean のファイル /etc/sysconfig ディレクトリ:

sudo nano /etc/sysconfig/htcacheclean

ここで、クリーニング間隔、キャッシュルート、最大キャッシュサイズ、およびユーティリティのその他のオプションを変更できます。

/ etc / sysconfig / htcacheclean
INTERVAL=15
CACHE_ROOT=/var/cache/httpd/proxy
LIMIT=100M
OPTIONS=

ノート

の値を変更する場合は、 CACHE_ROOT、値を調整する必要があります CacheRoot Apache構成で設定するディレクティブ。

終了したら、ファイルを保存して閉じます。

Apacheを再起動して開始します htcacheclean キャッシュを自動的にクリーンアップするには:

sudo systemctl restart httpd

グローバル構成の変更

キャッシュの構成のほとんどは、個々の仮想ホスト定義またはロケーションブロック内で行われます。 ただし、いくつかの一般的な属性を設定するために使用する必要があるいくつかのグローバル構成項目もあります。 メインのApache構成ファイルを開いて、次の項目を構成します。

  1. sudo nano /etc/httpd/conf/httpd.conf

追加する必要があります CacheRoot キャッシュされたアイテムを保存するために使用する必要があるパスを指すディレクトリ。 これは常に一致する必要があります CACHE_ROOT あなたの中に見つかった値 /etc/sysconfig/htcacheclean キャッシュを正しく管理できるようにファイルします。 また、 CacheDirLevelsCacheDirLength ディレクティブ。どちらも、キャッシュディレクトリ構造の構築方法の定義に役立ちます。

/etc/httpd/conf/httpd.conf
CacheRoot /var/cache/httpd/proxy
CacheDirLevels 2
CacheDirLength 1

The CacheDirLevelsCacheDirLength どちらも、キャッシュディレクトリ構造の構築方法の定義に貢献します。 アン md5 提供されるURLのハッシュは、データの保存に使用されるキーとして作成されます。 データは、各ハッシュの先頭文字から派生したディレクトリに編成されます。 CacheDirLevels 作成するサブディレクトリの数を指定し、 CacheDirLength 各ディレクトリの名前として使用する文字数を指定します。 だからのハッシュ b1946ac92492d2347c6235b4d2611184 上記のデフォルト値では、次のディレクトリ構造にファイルされます。 b/1/946ac92492d2347c6235b4d2611184. 通常、これらの値を変更する必要はありませんが、それらが何に使用されているかを知っておくとよいでしょう。

このファイルで設定できる他のいくつかの値は次のとおりです。 CacheMaxFileSizeCacheMinFileSize これは、Apacheがキャッシュにコミットするファイルサイズの範囲をバイト単位で設定します。 CacheReadSizeCacheReadTime、これにより、クライアントに送信する前にコンテンツを待機してバッファリングできます。 これは、コンテンツがこのサーバー以外の場所にある場合に役立ちます。

仮想サーバーの変更

キャッシュの構成のほとんどは、仮想ホスト定義または特定のロケーションブロックのいずれかで、より詳細なレベルで行われます。

フォローする仮想ホストファイルの1つを開きます。 と呼ばれるファイルを使用していると仮定します site.conf あなたの中で /etc/httpd/conf.d このガイドのディレクトリ:

  1. sudo nano /etc/httpd/conf.d/site.conf

仮想ホストブロックでは、任意のロケーションブロックの外側で、いくつかのキャッシュプロパティの構成を開始できます。 このガイドでは、 CacheQuickHandler より多くの処理が行われるようにオフにします。 これにより、より完全なキャッシュルールを作成できます。

また、この機会にキャッシュロックを構成します。 これは、コンテンツがまだ有効かどうかを確認するためにコンテンツオリジンにチェックインするときにApacheが使用するファイルロックのシステムです。 このクエリが満たされている間に、同じコンテンツに対する追加のリクエストが届くと、バックエンドリソースへの追加のリクエストが発生し、負荷が急上昇する可能性があります。

検証中にリソースにキャッシュロックを設定すると、リソースが現在更新されていることがApacheに通知されます。 この間、古いリソースには、その状態を示す警告ヘッダーを付けることができます。 これをキャッシュロックディレクトリで設定します /tmp フォルダ。 ロックが有効であると見なされるまで、最大5秒かかります。 これらの例はApacheのドキュメントから直接引用されているため、私たちの目的にはうまく機能するはずです。

また、Apacheに無視するように指示します Set-Cookie ヘッダーであり、キャッシュに保存されません。 そうすることで、Apacheがユーザー固有のCookieを誤って他の当事者に漏らしてしまうのを防ぐことができます。 The Set-Cookie ヘッダーは、ヘッダーがキャッシュされる前に削除されます。

/etc/httpd/conf.d/site.conf
<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    CacheQuickHandler off

    CacheLock on
    CacheLockPath /tmp/mod_cache-lock
    CacheLockMaxAge 5

    CacheIgnoreHeaders Set-Cookie
</VirtualHost>

この仮想ホストのキャッシュを実際に有効にする必要があります。 私たちはこれを行うことができます CacheEnable 指令。 これが仮想ホストブロックに設定されている場合、キャッシュ方法を提供する必要があります(disk また socache)およびキャッシュする必要のある要求されたURI。 たとえば、すべての応答をキャッシュするには、これを次のように設定できます。 CacheEnable disk /、ただし、応答をキャッシュしたいだけの場合 /public URI、これをに設定できます CacheEnable disk /public.

特定のロケーションブロック内でキャッシュを有効にすることで、別のアプローチを取ります。 そうすることで、へのURIパスを提供する必要がなくなります。 CacheEnable 指図。 その場所から提供されるURIはすべてキャッシュされます。 また、 CacheHeader ディレクティブ。これにより、応答ヘッダーは、キャッシュが要求を処理するために使用されたかどうかを示します。

設定するもう1つのディレクティブは CacheDefaultExpire どちらも有効期限(秒単位)を設定できるように Expires また、 Last-Modified ヘッダーはコンテンツに設定されます。 同様に、設定します CacheMaxExpire アイテムが保存される時間を制限します。 設定します CacheLastModifiedFactor Apacheが有効期限を作成できるように、 Last-Modified 日付ですが、有効期限はありません。 係数に変更後の時間を掛けて、妥当な有効期限を設定します。

/etc/httpd/conf.d/site.conf
<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    CacheQuickHandler off

    CacheLock on
    CacheLockPath /tmp/mod_cache-lock
    CacheLockMaxAge 5

    CacheIgnoreHeaders Set-Cookie

    <Location />
        CacheEnable disk
        CacheHeader on

        CacheDefaultExpire 600
        CacheMaxExpire 86400
        CacheLastModifiedFactor 0.5
    </Location>
</VirtualHost>

必要なものをすべて構成したら、ファイルを保存して閉じます。

次のように入力して、構成全体の構文エラーを確認します。

  1. sudo apachectl configtest

エラーが報告されない場合は、次のように入力してサービスを再起動します。

  1. sudo systemctl restart httpd

コンテンツに有効期限とキャッシュヘッダーを設定する

上記の構成では、HTTPヘッダーに依存するHTTPキャッシングを構成しました。 ただし、実際に提供しているコンテンツには、 Expires また Cache-Control インテリジェントなキャッシュ決定を行うために必要なヘッダー。 これらのヘッダーを設定するには、さらにいくつかのモジュールを利用する必要があります。

The mod_expires モジュールは両方を設定できます Expires ヘッダーと max-age のオプション Cache-Control ヘッダ。 The mod_headers モジュールを使用して、より具体的なものを追加できます Cache-Control キャッシュポリシーをさらに調整するためのオプション。 これらのモジュールは両方とも、CentOS7Apacheパッケージでデフォルトで有効になっています。

仮想ホストファイルを再度変更して、次の項目の構成を開始できます。

  1. sudo nano /etc/httpd/conf.d/site.conf

The mod_expires モジュールは3つのディレクティブのみを提供します。 The ExpiresActive 「オン」に設定することにより、特定のコンテキストで有効期限処理をオンにします。 他の2つのディレクティブは互いに非常に似ています。 The ExpiresDefault ディレクティブはデフォルトの有効期限を設定し、 ExpiresByType コンテンツのMIMEタイプに応じて有効期限を設定します。 これらの両方が設定します Expires そしてその Cache-Control 「max-age」を正しい値に設定します。

これらの2つの設定は、2つの異なる構文を取ることができます。 最初は単に「A」または「M」の後に秒数が続きます。 これにより、コンテンツが最後に「アクセス」または「変更」された時間に関連して有効期限が設定されます。 たとえば、これらは両方とも、アクセスされてから30秒後にコンテンツの有効期限が切れます。

ExpiresDefault A30
ExpireByType text/html A30

他の構文では、より詳細な構成が可能です。 これにより、人間が計算しやすい秒以外の単位を使用できます。 また、「アクセス」または「変更」という完全な単語を使用します。 有効期限の構成全体は、次のように引用符で囲む必要があります。

ExpiresDefault "modification plus 2 weeks 3 days 1 hour"
ExpiresByType text/html "modification plus 2 weeks 3 days 1 hour"

ここでは、デフォルトの有効期限を設定するだけです。 まずは5分に設定して、慣れて間違えてもクライアントのパソコンに長時間保存されないようにします。 コンテンツに適したポリシーを選択する能力に自信がある場合は、これをより積極的なものに調整できます。

/etc/httpd/conf.d/site.conf
<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    CacheQuickHandler off

    CacheLock on
    CacheLockPath /tmp/mod_cache-lock
    CacheLockMaxAge 5

    CacheIgnoreHeaders Set-Cookie

    <Location />
        CacheEnable disk
        CacheHeader on

        CacheDefaultExpire 600
        CacheMaxExpire 86400
        CacheLastModifiedFactor 0.5

        ExpiresActive on
        ExpiresDefault "access plus 5 minutes"
    </Location>
</VirtualHost>

これは私たちを設定します Expires ヘッダーを5分先に設定し、 Cache-Control max-age=300. キャッシュポリシーをさらに洗練するために、 Header 指令。 使用できます merge 追加するオプション Cache-Control オプション。 これを複数回呼び出して、必要なポリシーを追加できます。 このガイドをチェックして、コンテンツに設定するキャッシュポリシーについてのアイデアを入手してください。 この例では、「public」を設定して、他のキャッシュがコピーの保存を許可されていることを確認できるようにします。

設定するには ETags 私たちのサイトの静的コンテンツ(検証に使用するため)には、 FileETag 指令。 これは静的コンテンツに対して機能します。 動的に生成されたコンテンツの場合、アプリケーションは正しく生成する責任があります ETags.

ディレクティブを使用して、Apacheが計算に使用する属性を設定できます。 Etag. これは INode, MTime, Size、 また All 変更するかどうかによって異なります ETag ファイルの inode 変更、変更時間の変更、サイズの変更、または上記のすべて。 複数の値を指定できます。また、新しい設定の前に、子コンテキストで継承された設定を変更できます。 + また -. ここでは、すべての変更が登録されるように「すべて」を使用します。

/etc/httpd/conf.d/site.conf
<VirtualHost *:80>
    ServerName server_domain_or_IP
    DocumentRoot /var/www/html

    CacheQuickHandler off

    CacheLock on
    CacheLockPath /tmp/mod_cache-lock
    CacheLockMaxAge 5

    CacheIgnoreHeaders Set-Cookie

    <Location />
        CacheEnable disk
        CacheHeader on

        CacheDefaultExpire 600
        CacheMaxExpire 86400
        CacheLastModifiedFactor 0.5

        ExpiresActive on
        ExpiresDefault "access plus 5 minutes"

        Header merge Cache-Control public
        FileETag All
    </Location>
</VirtualHost>

これにより、任意の値に「public」(コンマで区切られます)が追加されます Cache-Control すでに持っており、含まれる予定 ETag 静的コンテンツ用。

終了したら、ファイルを保存して閉じます。 次のように入力して、変更の構文を確認します。

  1. sudo apachectl configtest

エラーが見つからなかった場合は、サービスを再起動してキャッシュポリシーを実装します。

  1. sudo systemctl restart httpd

結論

Apacheを使用してキャッシュを構成することは、オプションがいくつもあるため、大変な作業のように思えます。 幸いなことに、単純なものから始めて、より複雑なものが必要になったときに成長するのは簡単です。 ほとんどの管理者は、各キャッシュタイプを必要としません。

キャッシングを構成するときは、さまざまな実装の選択で迷子にならないように、解決しようとしている特定の問題に注意してください。 ほとんどのユーザーは、少なくともヘッダーを設定することでメリットが得られます。 コンテンツをプロキシまたは生成している場合は、HTTPキャッシュを設定すると役立つ場合があります。 共有オブジェクトのキャッシュは、バックエンドプロバイダーを使用している場合に、SSLセッションや認証の詳細の保存などの特定のタスクに役立ちます。 ファイルのキャッシュは、システムが遅いものに限定される可能性があります。