CloudFlare + nginx、または「コーヒーメーカー」の助けを借りて保存(upd2:超短ダイナミクスキャッシュ!)







聖金曜日、親愛なるユーザー名%、インターネット上の正義のための熱心な読者と戦闘機!



私たちは皆覚えています(Googleは確かに覚えています!)そのような記事CloudFlare + nginx =無料プランですべてをキャッシュしました 。 ここでは、最大512 MBのファイルのCloudFlare側での雑多なキャッシュを通じて、関税とサーバーの節約の基本原則が考慮されました。



この記事では、サーバーの応答コードを使用して、さらに節約します。 ジグラットを構築するための金 「企業プラン」に切り替えないでください。「企業プラン」では、「オファー」で同様の結果が得られます。



無料レートでは、TTLは2時間です。 これが彼らが無料関税計画に書いたものです。 さらに深く掘り下げると、次のようになります。





より詳細:リダイレクトは20分間キャッシュされ、認証エラーは1分間、従来の404は5分間キャッシュされます。 他のコードはキャッシュされません。



これは、たとえば、一部の操作などにAPIを提供するクールな動的サイトがある場合を意味します。 など そして、これはファイルと画像の両方と大量のトラフィックを生成し、ダイナミクスが傷つくため、CFを介してラップされます...あなたの答えがどのように生成されるかを誰かが理解している場合)、その後、彼(照明のない部屋の暗い側の人)は、他のユーザーを偽の答え、つまり-404で欺くことができます。



例:





そこに1336枚の写真があるとします。 これは、1番目、2..1336番目が200番目の回答を提供し、cloudflare側にキャッシュされることを意味します。



解決策 2、418 コードの松葉杖なしこのコメントの結果)。



解決策1、418「i'm teapot」コードを使用して松葉杖。





エミュレーション(nginx)は次のとおりです。



 location ~* "^/api/image/exif/(.*?)\.txt$" { default_type text/plain; set $testimageid $1; ##backend if ($testimageid ~ 1337){ return 404 "Image $testimageid not found"; } ##backend return 200 "EXIF for $testimageid image"; }
      
      









など...







ID 1337の写真に到達するまで、これはまだサーバー上にありません 。 ダイナミクスは何をしますか? 彼女がエラーとコード404についてのテキストを提供するのは論理的です。





次にキャッシュされます。 そして、このURLへの後続のすべてのリクエストは、次の5分間 、CFキャッシュから応答を返します。



これは重要ですか? はい、いいえ。 それは、何人のユーザーを悲惨にし、何百万ドルをCDNに節約するか(私に感謝します)に依存します。



どうする? 公式の資料を見て、コードを変更する必要があることを理解しています... 404の場合はサーバー応答コード。



しかし、それほど単純ではありません。 just_take_take_and_change_response_code.jpgを使用することはできません。各コードには何らかの解釈の負荷がかかるため、解釈されるか、単にそれに負けてしまいます。



そのため、セマンティックロードを持たないコードが発明されました 。これはrfc2324で説明されているコード418 です



エミュレーションのコードを変更します(CFパネルでこのリンクのキャッシュをクリアします):



 location ~* "^/api/image/exif/(.*?)\.txt$" { default_type text/plain; set $testimageid $1; ##backend if ($testimageid ~ 1337){ return 418 "Image $testimageid not found"; } ##backend return 200 "EXIF for $testimageid image"; }
      
      





そして、次の図を取得します。







これは、画像がなくなるまでCFがサーバーからの応答をキャッシュせず、エラー418 [サーバーから]を持つ新しい応答をクライアントに渡すという事実によって特徴付けられます 。 次に、サーバーに画像が表示され、ダイナミクスで200の回答が得られると、CFはこの回答を2時間キャッシュします。



コード418は、コードの4xxグループに属します。 また、エンドユーザーがブラウザ(または自己記述型ソフトウェア)にこのコードの定義を持っていなくても、この記事のスクリーンショット(firefox、赤い四角)にあるように、少なくとも4xxのチェックが必要です。



これは、エラー(4xx)を単純に報告し、ポリシーである場合、すべてキャッシュするときに、この応答をキャッシュしないようにcloudflareに依頼する方法です。 これにより、公開に誰かが将来の資料を要求したときにサーバーからの誤った404応答から保護されます。



upd2:解決策2、418コードの松葉杖なし。 このコメントの結果。



最初に、ブラウザキャッシュの有効期限の条件を設定します。





次に、このページルールを作成します。







ハイライト: ブラウザキャッシュTTLの欠如とキャッシュレベルの可用性:すべてをキャッシュ



次に、有効な回答のTTLが315360000である場合、追加する必要があります

 add_header Cache-Control "public, max-age=315360000";
      
      





場所に、サーバーに追加せずに!

例えば

 location / { add_header Cache-Control "public, max-age=315360000"; }
      
      







ダイナミクスのある場所は次のとおりです。

 location ~* "^/api/image/jexif/(.*?)\.txt$" { ##backend proxy_pass http://localhost:8080/headerstest/headerstest.jsp?imgid=$1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##backend }
      
      





以下は、ダイナミクスがそのようなヘッダーを持つコード404でエラーを発生させます(JSPを例として使用)

 response.setHeader("Cache-Control", "private, max-age=0");
      
      





その結果、Cloudflareは上記の設定でエラーをキャッシュしませんが、それだけではありません!



ダイナミクスの200応答に対して頻繁にキャッシュを更新する必要がある場合は、指定する必要があります(JSPの例でも)

 response.setHeader("Cache-Control", "public, max-age=20");
      
      





したがって、ダイナミクスの答えの20 秒のキャッシュを取得できます! エンタープライズレートより低いのは何ですか!



実際、これは機能しますが、cloudflare上のサイトを完全に削除し、IPサーバーを非表示にできます(A / AAAA / CNAME / TXT以外のエントリが異なる IPにある場合)。



力があなたと共に来るように!



ZY、 set $testimageid $1;



これは、nginxがif式で$ 1を比較できないために使用されます(ただし、構成またはコンテンツで$ 1を操作できます)。このため、変数を入力する必要がありますが、 YourChief より美しいソリューションを示しました .. 2番目のソリューションでは、削除する必要があります

サーバーのadd_header



を配置し、最初のサーバーがnginxを2番目のサーバーに「貼り付けない」ようにします(これは、「public、max-age = 20、public、max-age = 315360000」という回答の奇跡です)。

欠けた ボイラー 写真は整列され、png- 8に圧縮されます。ダイアルアップの完璧主義者は笑顔になれます!



All Articles