Lệnh cấm vecni được thêm vào nhưng đối tượng cũ được trả lại

Jan 08 2021

Tôi đang sử dụng véc ni ở phía trước máy chủ ô để lưu các ô bản đồ vào bộ nhớ cache. Để loại bỏ các ô cũ, tôi định sử dụng các lệnh cấm để loại bỏ một số lượng lớn các ô được lưu trong bộ nhớ cache một cách hiệu quả. Vấn đề của tôi là varnish vẫn sử dụng các đối tượng được lưu trong bộ nhớ cache (ít nhất là agetrong phản hồi chỉ ra điều này) và không liên hệ với phần phụ trợ.

Đầu tiên tôi yêu cầu http: //varnish/5/3/4.pbf, sau đó thêm lệnh cấm bằng curl -X BAN -H 'X-Purge-Regex: 5/3/4.pbf' varnishhoặc cách khác varnishadm, sau ban obj.http.url ~ 5/3/4.pbfđó yêu cầu lại http: //varnish/5/3/4.pbf.

Ban đầu, danh sách cấm của tôi trống:

Present bans:
1610117471.434488     1 C

Lệnh cấm được thêm vào thành công với curl -X BAN -H 'X-Purge-Regex: 5/3/4.pbf' varnish

<!DOCTYPE html>
<html>
  <head>
    <title>200 Ban added</title>
  </head>
  <body>
    <h1>Error 200 Ban added</h1>
    <p>Ban added</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 8</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

và hiển thị trong danh sách cấm

Present bans:
1610117369.028870     0 -  obj.http.url ~ 5/3/4.pbf
1610117307.220739     1 C  

Sau khi yêu cầu lại http: //varnish/5/3/4.pbf, danh sách cấm cho biết rằng lệnh cấm đã được sử dụng

Present bans:
1610117471.434488     1 -  obj.http.url ~ 5/3/4.pbf

nhưng tuổi của phản hồi không phải là 0, vì nó vẫn là đối tượng từ yêu cầu đầu tiên.

Sau một thời gian ngắn, lệnh cấm được gỡ bỏ:

Present bans:
1610117471.434488     1 C  

Của tôi vcl_recvtrông giống như thế này nhưng lỗi có thể ở một nơi khác vì nó cũng không hoạt động với varnishadm:

sub vcl_recv {
    unset req.http.cookie;

    # Allowing PURGE from localhost
    if (req.method == "BAN"||req.method == "PURGE") {
                if (!client.ip ~ purge) {
                        return(synth(405,"Not allowed."));
                }
                if (req.method == "BAN") {
                    ban("obj.http.url ~ " + req.http.X-Purge-Regex);

                    # Throw a synthetic page so the
                    # request won't go to the backend.
                    return(synth(200, "Ban added"));
                }
                if (req.method == "PURGE") {
                    return (purge);
                }
        }
}

Tôi cũng đã cố gắng sử dụng vcl_purgetừhttps://stackoverflow.com/a/61507014 nhưng điều này dường như không giúp ích cho các lệnh cấm (?).

Tôi đang sử dụng X-Purge-Regextiêu đề để không phải lo lắng về việc phải thoát các ký tự đặc biệt như tronghttps://stackoverflow.com/a/38526921nhưng chỉ cần một lệnh cấm như obj.http.url ~ 0không có tác dụng.

Tôi đang sử dụng vecni 6.5 với vcl 4.0.

Yêu cầu cấm

*   << Request  >> 54        
-   Begin          req 53 rxreq
-   Timestamp      Start: 1610121483.345437 0.000000 0.000000
-   Timestamp      Req: 1610121483.345437 0.000000 0.000000
-   VCL_use        boot
-   ReqStart       192.168.48.2 50882 http
-   ReqMethod      BAN
-   ReqURL         /
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: varnish-volatile
-   ReqHeader      User-Agent: curl/7.64.0
-   ReqHeader      Accept: */*
-   ReqHeader      X-Purge-Regex: 0
-   ReqHeader      X-Forwarded-For: 192.168.48.2
-   VCL_call       RECV
-   VCL_acl        MATCH purge "importer"
-   VCL_return     synth
-   VCL_call       HASH
-   VCL_return     lookup
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     Ban added
-   RespHeader     Date: Fri, 08 Jan 2021 15:58:03 GMT
-   RespHeader     Server: Varnish
-   RespHeader     X-Varnish: 54
-   VCL_call       SYNTH
-   RespHeader     Content-Type: text/html; charset=utf-8
-   RespHeader     Retry-After: 5
-   VCL_return     deliver
-   Timestamp      Process: 1610121483.347281 0.001844 0.001844
-   RespHeader     Content-Length: 246
-   Storage        malloc Transient
-   Filters        
-   RespHeader     Accept-Ranges: bytes
-   RespHeader     Connection: keep-alive
-   Timestamp      Resp: 1610121483.347557 0.002120 0.000276
-   ReqAcct        98 0 98 218 246 464
-   End            

NHẬN sau khi thêm lệnh cấm

*   << Request  >> 32806     
-   Begin          req 32805 rxreq
-   Timestamp      Start: 1610121552.733872 0.000000 0.000000
-   Timestamp      Req: 1610121552.733872 0.000000 0.000000
-   VCL_use        boot
-   ReqStart       192.168.48.1 55176 http
-   ReqMethod      GET
-   ReqURL         /public.snow_db/0/0/0.pbf
-   ReqProtocol    HTTP/1.1
-   ReqHeader      Host: localhost:8090
-   ReqHeader      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0
-   ReqHeader      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
-   ReqHeader      Accept-Language: en-US,en;q=0.5
-   ReqHeader      Accept-Encoding: gzip, deflate
-   ReqHeader      DNT: 1
-   ReqHeader      Connection: keep-alive
-   ReqHeader      Upgrade-Insecure-Requests: 1
-   ReqHeader      Pragma: no-cache
-   ReqHeader      Cache-Control: no-cache
-   ReqHeader      X-Forwarded-For: 192.168.48.1
-   VCL_call       RECV
-   ReqUnset       Host: localhost:8090
-   ReqHeader      host: localhost:8090
-   VCL_return     hash
-   ReqUnset       Accept-Encoding: gzip, deflate
-   ReqHeader      Accept-Encoding: gzip
-   VCL_call       HASH
-   VCL_return     lookup
-   Hit            28 601789.331504 10.000000 0.000000
-   VCL_call       HIT
-   VCL_return     deliver
-   RespProtocol   HTTP/1.1
-   RespStatus     200
-   RespReason     OK
-   RespHeader     content-encoding: gzip
-   RespHeader     content-type: application/x-protobuf
-   RespHeader     date: Fri, 08 Jan 2021 15:09:02 GMT
-   RespHeader     Vary: Accept-Encoding
-   RespHeader     X-Varnish: 32806 28
-   RespHeader     Age: 3010
-   RespHeader     Via: 1.1 varnish (Varnish/6.5)
-   VCL_call       DELIVER
-   VCL_return     deliver
-   Timestamp      Process: 1610121552.734070 0.000197 0.000197
-   Filters        
-   RespHeader     Accept-Ranges: bytes
-   RespHeader     Content-Length: 295
-   RespHeader     Connection: keep-alive
-   Timestamp      Resp: 1610121552.734217 0.000345 0.000147
-   ReqAcct        414 0 414 272 295 567
-   End  

Tái tạo vấn đề

Để tái tạo lỗi:

  • git clone https://github.com/Baschdl/varnish-ban-setup.git && cd varnish-ban-setup
  • docker-compose up
  • Mở http: // localhost: 8092/5/3 / 1.pbf
  • docker-compose exec varnish varnishadm ban obj.http.url ~ pbf
  • Mở lại http: // localhost: 8092/5/3 / 1.pbf và bạn sẽ nhận được đối tượng cũ

Trả lời

2 ThijsFeryn Jan 09 2021 at 00:23

Các obj.http.url ~ 5/3/4.pbflệnh cấm mà bạn đang phát hành, được phù hợp với một urltiêu đề phản ứng.

Hãy nhớ rằng: URL là một tiêu đề yêu cầu, không phải là một tiêu đề phản hồi. Không có lý do gì để hoảng sợ, những gì bạn đang làm hoàn toàn hợp lý và có liên quan đến phạm vi của cái gọi là kẻ ẩn nấp .

Ban ẩn nấp

Các lệnh cấm Lurker là một chủ đề mà không đồng bộ xử lý lệnh cấm trong danh mục cấm và phù hợp đối tượng để các lệnh cấm để loại bỏ mô hình các đối tượng từ bộ nhớ cache.

Cấm ẩn nấp không hoạt động trong phạm vi yêu cầu, mà chỉ nhận thức được phạm vi đối tượng.

Để đối sánh thành công thông tin yêu cầu, ngữ cảnh yêu cầu có thể được thêm làm tiêu đề phản hồi. Và đó là những gì bạn đang làm thông quaobj.http.url

Vậy tại sao lệnh cấm không hoạt động?

Lý do tại sao lệnh cấm của bạn không hoạt động, là do bạn không đặt obj.http.urltrong tệp VCL của mình. Do đó, cấm ẩn nấp không thể kết hợp bất kỳ đối tượng nào với nó.

Cách khắc phục sự cố

Giải pháp rất đơn giản: đặt các tiêu đề bị thiếu trong ngữ cảnh phản hồi phụ trợ, như được minh họa bên dưới:

sub vcl_backend_response {
    set beresp.http.url = bereq.url;
    set beresp.http.host = bereq.http.host;
}

Khi chương trình phụ trợ phản hồi và ngay trước khi đối tượng được lưu trữ trong bộ nhớ cache, chúng ta có thể đặt các tiêu đề bị thiếu.

Sau đó, cấm ẩn sẽ có thể khớp biểu thức cấm với đúng đối tượng và xóa chúng khỏi bộ nhớ cache.

Đừng quên các đối tượng không được khớp ngay lập tức: chúng chỉ bị loại bỏ khi chúng đạt đến ban_lurker_age, được đặt thành 1 phút theo mặc định.