Я работаю над этим некоторое время и не могу найти никакого решения.
У меня лак сидит перед моим сервером nginx, а перед ним - CloudFlare.
Когда я запускаю узел curl -X PURGE, CloudFlare забирает его и, конечно же, отклоняет его с ошибкой 503. Если я использую direct.host для обхода CloudFlare, он попадает на сервер Varnish и принимает запрос, но ничего не делает, поскольку direct.host не используется, поэтому для этого URL-адреса в кеше ничего нет.
Я использую WordPress, и есть плагин WordPress Varnish Purge, он говорит, что нужно добавить следующую строку в wp-config.php
:
define('VHP_VARNISH_IP','127.0.0.1')
Это специально предназначено для работы с прокси-серверами и / или CloudFlare, чтобы убедиться, что запрос поступает на сервер Varnish, а не на CloudFlare, но это, похоже, не помогает.
Кто-нибудь видел это раньше и есть идеи?
Ваша проблема в том, что запрос на очистку обрабатывается ClodFlare вместо Varnish.
Имейте в виду, что:
purge;
вместо того set obj.ttl = 0s;
Varnish разрешит объект с помощью vcl_hash
. В Varnish 3 это означает по умолчанию [1], что req.url будет использоваться вместе с HTTP-заголовком «Host» или, если он отсутствует, IP-адресом сервера:
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (hash);
}
vcl_hash
чтобы соответствовать вашим потребностямПожалуйста, взгляните на документацию [2] и информацию из Varnish Book [3] по Bans & Purges
На мой взгляд у вас есть варианты:
curl -H "Host: _host_wich_has_the_url_to_purge" -X PURGE http://_varnish_ip_:_varnish_port/_url_to_purge_
acl purge
(не рекомендуется) и проинструктируйте CloudFlare передать такие запросы Varnish.[1] https://www.varnish-cache.org/docs/3.0/reference/vcl.html#examples
[2] https://www.varnish-cache.org/docs/3.0/tutorial/purging.html
[3] https://www.varnish-software.com/static/book/Cache_invalidation.html#removing-a-single-object
Cloudflare, когда вы передадите им свой DNS, настроит direct.yourdomain.com. Вы должны иметь возможность отправить PURGE прямо на этот адрес, который обойдет Cloudflare и напрямую попадет на ваш сервер Varnish. Однако убедитесь, что все имеющиеся у вас блоки ACL разрешают адрес, с которого вы отправляете PURGE.
FWIW плагин говорит, что нужно ввести IP-адрес вашего сервера Varnish (в http://wordpress.org/plugins/varnish-http-purge/faq/ ). "Ваш IP-адрес Varnish должен быть одним из IP-адресов, которые прослушивает Varnish. Если вы используете несколько IP-адресов или настроили свои списки контроля доступа, вам нужно выбрать такой, который не конфликтует с другими вашими настройками. Например , если у вас есть Varnish, прослушивающий общедоступный и частный IP-адрес, вы захотите выбрать частный. С другой стороны, если вы укажете Varnish прослушивать 0.0.0.0 (т.е. "прослушивать каждый интерфейс, который вы можете"), вы бы необходимо проверить, какой IP-адрес разрешен для вашего ACL очистки (обычно 127.0.0.1, он же localhost), и использовать его (например, 127.0.0.1) ».
Когда вы запускаете команду очистки вручную, то есть через CURL, что вы добавляете, чтобы она работала?