4

次のコードを使用して、サイトのホームページをパージしています。

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com:8080/");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PURGE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);

$r = curl_exec($ch);

echo "<PRE>$r</PRE>";

curl_close($ch);

ワニスからの応答は予想どおりです。

HTTP/1.1 200 Purged.
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 382
Accept-Ranges: bytes
Date: Fri, 10 Aug 2012 10:50:56 GMT
X-Varnish: 617777456
Age: 0
Via: 1.1 varnish
Connection: close
X-Cache: MISS

これで、パージされたと思いますが、ページをさらに呼び出してヘッダーを確認すると、パージされていないことがわかります。との両方が設定されているため、ページがまだキャッシュされており、15秒経過していることを示していますAge: 15X-Cache: HIT

TTLは120です。

私は何かが足りないのですか?

ありがとうジェイク

4

4 に答える 4

5

他のすべてのphp/curlの問題を排除するために、私は最も基本的な低レベルのチェックから始めます。

これは私のために働きます:

netcat -C varnish_hostname 80 <<EOF
PURGE /the/url
Host: hostname

EOF
  • varnish_hostnameを実際のニスのホスト名に置き換えます。
  • 80を、ワニスがリッスンする実際のポートに置き換えます。
  • / the / urlをURLのパス部分に置き換えて、パージします
  • ホスト名を、パージするURLのホスト名部分に置き換えます。

これを機能させると、VCLルールとACLは問題ではないことがわかり、curl/phpレベルに進むことができます。

2つのメモを編集します。

  1. 最近の多くのhttpスタックでは、ハーフオープンDoS攻撃を防ぐために、接続の確立とHTTPリクエストの間に長い遅延が許可されていないため、接続が途中で閉じるのを防ぐために、上記をすばやく入力する必要があります。これを実現するには、事前に入力全体を準備し、それを貼り付けバッファーにコピーして、マウスを1回クリックするだけで宣伝文句全体を貼り付けます。
  2. 上記のように、HTTPリクエストヘッダーは2行の改行で終了する必要があります。netcat -CHTTPプロトコルごとに改行をCRLF文字ペアに変換するオプションがあります。
于 2013-01-30T22:10:55.643 に答える
2

default.vclでパージをチェックしなかったと思います。default.vclには次のようなものが含まれている必要があります。

acl purge {
        "localhost";
        "192.168.55.0"/24;
}

sub vcl_recv {
        # allow PURGE from localhost and 192.168.55...

        if (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                return (lookup);
        }
}

sub vcl_hit {
        if (req.request == "PURGE") {
                purge;
                error 200 "Purged.";
        }
}

sub vcl_miss {
        if (req.request == "PURGE") {
                error 200 "OK but nothing to purge - URL was not in cache";
        }
}
于 2012-08-21T15:15:31.990 に答える
1

default.vclファイルを投稿する必要があるとコメントしたかったのですが、私の評判は低すぎます。

PURGEはvclファイルに実装されており(または、少なくともそれが機能することを期待している場合はそうする必要があります)、PURGEが実行することと実行しないことはコードにあります。接続先のIPアドレスに基づいてPURGEをブロックしているか、実装されていない可能性があります。

于 2012-08-18T05:31:54.557 に答える
1

知っておくと、PURGEはbeReqで動作します。

req.urlを変更する(つまり、URIにプレフィックスまたはサフィックスを追加する)場合は、purgeを呼び出すvcl_recvでも同じことを行う必要があります。または、 URL操作後に、メインのvcl_recv内にパージ条件を書き込む必要があります。

于 2015-11-28T13:53:39.167 に答える