У меня есть Varnish (3.0.3), работающий как балансировщик нагрузки/статический кеш перед двумя веб-серверами. У меня есть CDN, настроенный с использованием метода Original Pull. Если я возьму URL-адрес изображения на своем сайте вручную, укажу адрес CDN, я смогу убедиться, что исходное извлечение работает, и изображение загружается в CDN и обслуживается.
Мое приложение довольно сложное, и я тестирую этот CDN, чтобы увидеть, значительно ли он ускоряет веб-приложение, поэтому я пока не хочу переписывать какой-либо из моего php-кода для использования изображений CDN.
Что я хотел бы сделать, так это настроить Varnish для перезаписи запросов, полученных для файлов изображений, и извлекать их через CDN, а не с двух серверов Apache непосредственно в моем кластере.
Я прочитал документацию Varnish и пару руководств в Интернете о том, как сделать что-то подобное, но я просто не могу заставить его работать должным образом, и мне нужна небольшая помощь здесь.
Вот несколько разных способов, которыми я пытался это сделать (отредактировано для краткости):
sub vcl_recv {
#if request is image, redirect to CDN
if (req.url ~ "\.(gif|ico|jpg|jpeg|png)$") {
set req.http.host = "cdn.domain.com/";
error 750 req.http.host + req.url;
}
}
sub vcl_error {
if (obj.status == 750) {
set obj.status = 302;
set obj.http.Location = obj.response;
return(deliver);
}
}
Это не сработало. Это привело к тому, что везде были поврежденные изображения, и все, что отображалось, использовало расширение .webp, поэтому оно не обрабатывалось по условию, указанному выше.
Итак, я попробовал это:
backend cdn {
.host = "cdn.domain.com";
.port = "80";
}
sub vcl_recv {
#if request is image, redirect to CDN
if (req.url ~ "\.(gif|ico|jpg|jpeg|png)$") {
set req.backend = cdn;
return(lookup);
}
}
Это показало некоторые изображения на странице, но при просмотре их источника они выглядели так, как будто они исходили от серверов Apache (доменное имя не было именем CDN), и отображалась только около половины изображений ... вероятно, кеш браузера.
Я хотел бы некоторые вход здесь, спасибо, ребята.
Нет ли способа использовать Varnish для такого перенаправления? Не лучше ли настроить nginx перед Varnish, чтобы переписывать запросы к cdn?
ОБНОВЛЕНИЕ. Используя оба приведенных ниже ответа, у меня работает перенаправление и установлен ACL, позволяющий CDN извлекать изображения напрямую, а не перенаправлять на себя. Однако, хотя я убедился, что ACL разрешает подключение с использованием моего собственного внешнего IP-адреса, CDN не загружает новые изображения с сервера. Он выдает ошибку 502 (нечетная‹) вместо того, чтобы загружать изображение с локального сервера в CDN и обслуживать его. Вот как сейчас выглядит блок моего vcl_recv:
acl cdn {
"ip.of.CDN";
}
sub vcl_recv {
#if request is image, redirect to CDN
if (req.url ~ "\.(gif|ico|jpg|jpeg|png)$") {
if(!client.ip ~ cdn){
error 750 "http://cdn.domain.com" + req.url;
}
}
}
sub vcl_error {
if (obj.status == 750) {
set obj.status = 302;
set obj.http.Location = obj.response;
return(deliver);
}
}