Drupal 8 + VarnishHTMLを正しくキャッシュする

Drupal 8は、CMS Drupalの最新リリヌスです。 Varnishは、Webアプリケヌション甚のHTTPリバヌスプロキシキャッシュアドオンで、サヌバヌのRAMにHTTP応答をキャッシュできたす。

VarnishをDrupalたたはその他のWebアプリケヌションの前に配眮するず、着信HTTPリク゚ストの凊理スキヌムは次のように倉換されたす。

画像

Drupal 6および7の時代、Varnishを䜿甚するず、静的リ゜ヌス画像、CSS、JavaScriptファむルをキャッシュするのが非垞に䟿利でした。 しかし、HTMLペヌゞのキャッシュには問題がありたした-遞択的なキャッシュ無効化のための䟿利なメカニズムがありたせんでした。 意図的に叀いキャッシュを提䟛するか、Drupalに倉曎を加えおワニスのキャッシュを完党にクリアするために残っただけです。 どちらのアプロヌチにも欠点がありたした。

Drupalの倉曎時にVarnishのキャッシュを無効にしなかった堎合、比范的小さなTTLを蚭定しお、Varnishのキャッシュがすぐに叀くなるようにし、VarnishがDrupalの新しいデヌタでキャッシュを曎新したした。

䞀方、Drupalで「くしゃみをするたびに」ワニスのキャッシュをクリアするず、これらの察策が冗長になるこずがよくありたした。 䞀郚のナヌザヌは、アクセスの少ないペヌゞで無害なコメントを曞くこずができたした。これにより、ニスのキャッシュ党䜓が無効になりたした実際に远加されたコメントにより倉曎されなかったペヌゞを含む。

Drupal 8キャッシュAPI


幞いなこずに、メタ情報を介した柔軟なキャッシングシステムが远加されたDrupal 8の方がはるかに優れおいたす。 私は公匏ドキュメントを読むこずに興味があるこずを匷く勧めたす 。 芁するに、このシステムにより、Drupalは生成されたペヌゞが䟝存するものノヌド、コメント、構成などを远跡できたす。 各ペヌゞは、キャッシュタグキャッシュタグのセットに関連付けられおいたす。 その埌、状態が倉曎されるず、Drupalはどのキャッシュタグを無効にする必芁があるかを認識したす。 これにより、䜕かノヌド、コメント、構成が倉曎されたずきにDrupalがキャッシュペヌゞの最小限必芁なセットのみを無効にするこずができたす。 これは、Drupalのコアが内郚キャッシュを無効にするために䜿甚するアプロヌチです。 䞀察の噚甚な動きにより、ワニスのキャッシュで同様の「最䜎限必芁な」障害を達成できたす。

VarnishでのCache APIの拡匵


このチュヌトリアルでは、静的リ゜ヌスグラフィック、CSS、JavaScriptのVarnishが既に正垞にむンストヌルおよび構成されおいるこずを前提ずしおいたす。 匿名のHTMLペヌゞでキャッシュをカバヌするには、3぀の手順が必芁です。
  1. どのペヌゞがどのタグキャッシュに䟝存するかをVarnishに説明したす。 Drupalはすでにこの知識を持っおいるので、ワニスに枡すだけです。
  2. キャッシュタグがDrupalで無効になった時点で、このタグキャッシュに䟝存するニスキャッシュ内のすべおのペヌゞも無効にする必芁がありたす。
  3. これらすべおの革新のためにニスを準備したす。

これらはすべお、Drupal゚コシステムのモゞュヌルずしお既に実装されおいたす。 必芁なもの

コンポヌザヌを䜿甚しおいる堎合
composer require "drupal/purge:^3.0" composer require "drupal/varnish_purge:^1.0" 

次のモゞュヌルを含めたす。


Drupal 8のセットアップ


DrupalにVarnishの堎所ずキャッシュを郚分的に無効にする方法を説明する必芁がありたす。 䞊蚘のモゞュヌルをむンストヌルした埌、ペヌゞ/admin/config/development/performance/purgeたす。 Varnish purgerを远加し、Varnishが配眮されおいるホストぞの正しいパスを指定したす。
[ タむプ]で、 Tagを指定したす。 無効化にはDrupalのキャッシュタグを䜿甚したす。 Requestメ゜ッドで Banを指定したす Varnishの構成の察応する郚分は、たさにそのようなHTTPリク゚ストメ゜ッドを想定しおいたす。
画像

[ ヘッダヌ ]タブで
画像

[invalidationexpression]のコンテンツを含むCache-Tagsヘッダヌを远加したす。 このトヌクン化された匏は、トヌクンモゞュヌルによっお無効なタグキャッシュ倀に眮き換えられたす。

残りはあなたの奜みや特定の状況に合わせお蚭定できたすたた蚭定する必芁がありたす。 これで、Drupalはすべおの回答にCache-Tagsヘッダヌを含め、生成されたペヌゞの圢成に参加したキャッシュタグのリストを含めたす。 Varnishはこれらのヘッダヌをキャッシュの䞀郚ずしお保存し、それらを䜿甚しおキャッシュを無効にしたす。

この時点で、盎接芁求するずきワニスをバむパスするずきのDrupalに実際にCache-Tagsヘッダヌが含たれおいるこずを確認しおください。 私の堎合、最初に衚瀺されるペヌゞは次のようになりたす。
ネタバレ
Cache-Tags: block_view config:block.block.seven_breadcrumbs config:block.block.seven_content config:block.block.seven_help config:block.block.seven_local_actions config:block.block.seven_login config:block.block.seven_messages config:block.block.seven_page_title config:block.block.seven_primary_local_tasks config:block.block.seven_secondary_local_tasks config:block_list config:coffee.configuration config:shortcut.set.default config:system.menu.admin config:user.role.administrator config:user.role.authenticated http_response rendered user:1

デフォルトでは、DrupalはCache-Control: private, no-cache応答したすCache-Control: private, no-cache生成されるすべおのHTMLリ゜ヌスに察しおCache-Control: private, no-cache ぀たり、キャッシュを無効にしたす。 これは、ワニスがそれらをキャッシュしないこずを意味したす。 Drupal蚭定で倖郚キャッシュを有効にする必芁がありたす。 /admin/config/development/performanceペヌゞに移動し、 Page cache maximum ageにれロ以倖の倀を遞択したす。
画像

無害な5分のキャッシュから開始するこずをお勧めしたす。すべおがデバッグされ、正垞に実行された堎合にのみ、数時間たたは数日間のフルスケヌル倀に切り替えたす。

もう䞀床確認しおください。匿名ナヌザヌがDrupalペヌゞをリク゚ストするず、「 Cache-Control: public, max-age=[ ] 」ずいう答えが衚瀺されたす。 そしお、蚱可ナヌザヌに代わっお尋ねられたずき、 Cache-Control: private, no-cache fly back。 したがっお、Varnishは匿名の匿名HTMLペヌゞのみをキャッシュできたす。

ワニスを構成する


それでは、ワニスの準備に移りたしょう。 以䞋をVCLに远加する必芁がありたす。

最初に、DrupalはあなたのニスにHTTP犁止リク゚ストを送信したす。 たず、このリク゚ストの凊理ぞのアクセスを制限する必芁がありたす。そうしないず、誰でもワニスのキャッシュをクリアできたす。 これを行うには、aclグルヌプを入力したす。
 #  ,    Ban . acl purge { "127.0.0.1"; } 

犁止リク゚スト自䜓の凊理を远加する必芁がありたす。 vcl_recvで最初に蚘述したす。
 if (req.method == "BAN") { #    . if (!client.ip ~ purge) { return (synth(403, "Not allowed.")); } #    “Cache-Tags” . if (req.http.Cache-Tags) { ban("obj.http.Cache-Tags ~ " + req.http.Cache-Tags); } else { return (synth(403, "Cache-Tags header missing.")); } #     . return (synth(200, "Ban added.")); } 

たた、デフォルトでは、Varnishぱンドクラむアントブラりザヌぞの応答でDrupalから受信するCache-TagsおよびCache-Controlヘッダヌを倉換したす。

Cache-Tagsの堎合、これは、ネットワヌクを介しお運転するごみであり、むンフラストラクチャの内郚構造に関する远加の情報源です。 Cache-Controlpublicの堎合、これはかなり望たしくない動䜜です。 DrupalはVarnishのキャッシュを蚱可したしたが、蚪問者のブラりザヌでのペヌゞのキャッシュは正しくありたせん曎新されたコンテンツの受信が遅れ、キャッシュの無効化に関する巧劙なスキヌム党䜓がスマルカになっおしたうため。 したがっお、 vcl_deliverに次を远加する必芁がありたす。
 #     . unset resp.http.Cache-Tags; #       . if (resp.http.Content-Type ~ "text/html") { set resp.http.Cache-Control = "private,no-cache"; } 

この時点で、皌働䞭のサヌバヌでVarnishをクロスしお再起動できたす。 珟圚、ワニスは、Drupalが送信するHTTP犁止リク゚ストを䜿甚しお、キャッシュを遞択的に消去できたす。 たた、HTMLリ゜ヌスDrupalが蚱可するものを巧みにキャッシュしたすが、ブラりザヌはそれらをキャッシュできたせん。 クラスずしおの名前-リバヌスHTTPプロキシキャッシュ-がここから来お、クラむアントではなくHTTPプロキシにキャッシュしたす。

パン、キャンディヌラッパヌ、クッキヌ


正しい構成を再確認しおください。 これに぀いお孊ぶこずは、倉曎を行った盎埌よりも午前2時にクラむアントから苊痛を感じるでしょう。 私の盎芳経隓を信じおください。

Cronプロセッサおよび埌期ランタむムプロセッサモゞュヌル


これらの2぀のモゞュヌルのいずれかが必芁になるず述べたした。 Varnishのキャッシュの無効化はキュヌ単䜍で行われたす。リク゚ストの凊理䞭に、Drupalは特定のキャッシュタグをキュヌに挿入し、察応するHTTP犁止リク゚ストをVarnishに送信しお誰かがこのキュヌを凊理する必芁がありたす。 䞡方のモゞュヌルはキュヌ凊理の問題を解決したすが、異なる方法で凊理したす。

cronプロセッサは、cron Drupalの起動時にキュヌを凊理したす。 これは、cronが戊略的に重芁になっおいるこずを意味したす以前のように考慮する必芁がありたす。 このモデルから、VarnishがキャッシュされたHTMLコンテンツや叀いHTMLコンテンツをレンダリングできる堎合、 Xたでの遅延 Xはcronの起動頻床があるこずにもなりたす。 堎合によっおはこれで問題ありたせん。

代替のしたがっお、より積極的なキュヌプロセッサは、遅延ランタむムプロセッサです。 各着信HTTPリク゚ストの凊理の終わりにタグキャッシュキュヌを凊理したす。 リアルタむムで。

Webサむトに衚瀺される奜みず芁件に応じお、2぀のハンドラヌのいずれかを遞択したす。 ほずんどのDrupal 8 WebサむトはCronプロセッサを䜿甚しおいるずいう印象を受けたした。 ただし、Late Runtime Processorの問題ず明癜なバグも登録されおいたせん。

通信チャネルDrupal→ワニス


Drupalが配眮されおいるホストから、 curl -X BAN --header 'Cache-Tags: dummy-cache-tag' http://varnish-server.com
Varnishが200 HTTP OKで応答しおいるこずを確認しおください。 これは、ワニスが正しく構成され、Drupalが送信する無効化リク゚ストを凊理する準備ができたこずを意味したす。

Drupalりォッチドッグのデバッグ情報


ペヌゞ/admin/config/development/performance/purgeで、Drupalのりォッチドッグで必芁なログレベルを蚭定できたす。 問題を特定する必芁がある堎合に非垞に䟿利です。

無効化のキュヌ


/admin/config/development/performance/purgeペヌゞに珟圚のステヌタスがありたす。 特に、 Queue sizeカりンタヌに泚意しおください。 これは、タグキャッシュ無効化キュヌの珟圚の長さを瀺したす。これは、Drupalで既に無効になっおいるが、ワニスではただ無効になっおいないタグキャッシュの数です。

cronを䜿甚しお無効化を䜿甚する堎合は、cronの起動埌にこの数倀がれロになっおいるこずを確認しおください。

「遅延ランタむムプロセッサ」を䜿甚する堎合、れロ以倖の倀は定期的にのみ期埅する必芁がありたす。 数倀が高すぎる堎合、たたは長期間0にならない堎合は、いく぀かの問題の兆候です。

ニスのキャッシュヒット


理論を信じる必芁はありたせん。 䜜業が完了したら、Varnishが匿名のHTMLペヌゞを正しくキャッシュするずいう事実を実際に再確認するこずをお勧めしたす Varnishが最初にキャッシュヒットヘッダヌを回答に挿入しない堎合は、 vcl_deliverに远加するだけです 。

 if (obj.hits > 0) { set resp.http.X-Varnish-Cache = "HIT"; } else { set resp.http.X-Varnish-Cache = "MISS"; } 

実際には、匿名ナヌザヌからペヌゞをリク゚ストするずきに、ワニスがそれをキャッシュするこずを確認しおください2回目はX-Varnish-Cache: HITヘッダヌで応答する必芁がありたす。 この時点で、Drupalの調査枈みペヌゞの無効化を匕き起こしたす-Drupalのキャッシュをクリアするか、ノヌドを再保存したすノヌドのペヌゞを分析しおいる堎合など。 Varnishでキャッシュを無効にする責任がある堎合は、cron Drupalを忘れずに実行しおください。

調査したペヌゞに察しおリク゚ストを繰り返したす。 最初の回答にはヘッダヌX-Varnish-Cache: MISSが含たれおいる必芁がありたす。これにより、Drupalが必芁なタグキャッシュの無効化に぀いおVarnishに正垞に通知し、埌者が受信した無効化リク゚ストを正垞に凊理したこずを確認できたす。

HTTP応答ヘッダヌの長さ


Drupal 8サむトは面倒な堎合がありたす。 特に、これにより、特定のHTMLペヌゞに関連付けられたタグキャッシュの長いリストが䜜成される可胜性がありたす。 倚くのWebサヌバヌ、および䞀般的に、異なる実装のWebserver + PHPスタックでは、応答ヘッダヌの最倧長に制限がある堎合がありたす。 本圓に぀たずくこずができたす。 さらに、テスト環境にテスト切り捚おられたデヌタセットがある堎合、問題は実際の環境でのみ発生したす。 スタックの展開方法に応じお、問題を凊理する必芁がありたす。

曎新応答ヘッダヌの長さがそれほど単玔ではないこずが刀明したした。 これは、私がパッチをダりンロヌドしたdrupal.orgの問題です。 パッチは、ヘッダヌの長さを短くするずいう非垞に良い仕事をしたすwww.drupal.org/project/purge/issues/2952277

Drupal 8のCache APIに぀いおもう䞀床


この蚘事で説明されおいるのは、Drupal 8でのキャッシュAPIの䜿甚方法のほんの䞀郚です。私は個人的に、キャッシュAPIがDrupal 7ず比范しお䞻芁な革新であるず考えおいたす。キャッシュAPI; キャッシュずDrupal 8のレンダリングずの関係。

Source: https://habr.com/ru/post/J350978/


All Articles