2016-08-11 3 views
3

Я ищу способ очистить кеш для всех доменов и всех URL-адресов в лаке.Как очистить кеш в лаке?

В настоящее время, я должен был бы выдавать отдельные команды для каждого URL-адреса, например:

curl -X PURGE http://example.com/url1 
curl -X PURGE http://example.com/url1 
curl -X PURGE http://subdomain.example.com/ 
curl -X PURGE http://subdomain.example.com/url1 
// etc. 

В то время как я искал способ, чтобы сделать что-то вроде

curl -X PURGE http://example.com/* 

И что бы очистить все URL-адреса в example.com, но также и все URL-адреса в поддоменах example.com, в основном все URL-адреса, которыми управляет Varnish.

Любая идея, как достичь этого?

Это мой текущий файл VCL:

vcl 4.0; 

backend default { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
} 

sub vcl_recv { 
    # Command to clear the cache 
    # curl -X PURGE http://example.com 
    if (req.method == "PURGE") { 
     return (purge); 
    } 
} 
+0

Вы пытались использовать запрет? Это может быть именно то, что вы хотите. http://book.varnish-software.com/4.0/chapters/Cache_Invalidation.html#banning –

ответ

3

олифой 4.0 Я кончался его реализации с ban команды:

sub vcl_recv { 
    # ... 

    # Command to clear complete cache for all URLs and all sub-domains 
    # curl -X XCGFULLBAN http://example.com 
    if (req.method == "XCGFULLBAN") { 
     ban("req.http.host ~ .*"); 
     return (synth(200, "Full cache cleared")); 
    } 

    # ... 
} 
1

Предполагая, что никаких изменений в URL или внутреннего ключа кэша, для полного флеша самый простой подход будет перезапустить лак, так как он поддерживает свой кэш в памяти.

Если выполнение быстрого перезапуска неприемлемо, BAN, предложенный Растиславом, - отличный подход. Он должен будет оставаться активным дольше, чем ваш самый длинный TTL, поэтому, если вам часто нужен полный флеш, список BAN будет довольно постоянным, так как запрет lurker (который размахивает для BAN, который больше не имеет значения) может всегда думать, что ваш BAN полезно

так что в вашем случае, ваш VCL будет:

# Highly recommend that you set up an ACL for IPs that are allowed 
# to make the BAN call 
acl acl_ban { 
    "localhost"; 
    "1.2.3.4"/32; 
} 

sub vcl_recv { 
    if (client.ip ~ acl_ban && req.method == "BAN") { 
     ban("req.http.host == " + req.http.host); 
     # Throw a synthetic page so the request won't go to the backend. 
     return(synth(200, "Ban added")); 
    } 
} 

Однако, как отметил Карлос в комментариях, это будет на самом деле создать ленивый недействительности (и поэтому удаляются только во время запроса) , Если вы хотите, чтобы объекты на самом деле очиститься от background ban lurker каждый так часто, вы можете вместо этого сделать:

# Highly recommend that you set up an ACL for IPs that are allowed 
# to make the BAN call 
acl acl_ban { 
    "localhost"; 
    "1.2.3.4"/32; 
} 

sub vcl_recv { 
    if (client.ip ~ acl_ban && req.method == "BAN") { 
     # see below for why this is obj. rather than req. 
     ban("obj.http.host == " + req.http.host); 
     # Throw a synthetic page so the request won't go to the backend. 
     return(synth(200, "Ban added")); 
    } 
} 

sub vcl_backend_response { 
    # add any portions of the request that would want to be able 
    # to BAN on. Doing it in vcl_backend_response means that it 
    # will make it into the storage object 
    set beresp.http.host = bereq.http.host; 
} 

sub vcl_deliver { 
    # Unless you want the header to actually show in the response, 
    # clear them here. So they will be part of the stored object 
    # but otherwise invisible 
    unset beresp.http.host; 
} 

Затем сделать флеш:

curl -X BAN http://example.com; 
+1

Правильно, но будьте осторожны, что запрет, который вы создаете в '' vcl_recv'', не дружит с lurker. Он будет проигнорирован запретом lurker. В некоторых случаях это не критично, но если ваши запреты будут соответствовать множеству объектов в хранилище, вы должны избегать ленивых недействительных действий и разрешить запретить lurker очищать объекты. Создание дружественных запретов lurker требует еще нескольких строк VCL. Подробнее см. Https://www.varnish-cache.org/docs/trunk/users-guide/purging.html#bans. –

+0

Это замечательная записка! Я изменю ответ с учетом этого. –

0

Ну, я предлагаю просто перезапустить лак. Он очистит все файлы, потому что лак сохраняет кеш в памяти.

Пробег: sudo /etc/init.d/varnish restart