Может ли Varnish быть настроен на использование второго сервера для какого-либо ресурса, если он получает 404 от основного сервера? - PullRequest
5 голосов
/ 01 декабря 2010

Это было бы идеальным решением для меня, так как мне нужно предоставлять некоторый сгенерированный контент для веб-браузеров.Мой план состоит в том, чтобы сгенерировать контент по требованию и сохранить его в следующий раз.Я не хочу, чтобы браузеры каждый раз вызывали мой сервис (который генерирует контент).Я хочу, чтобы они обращались непосредственно к «кэшированному» ресурсу, если он доступен, и вызывали сервис, только если это не так.Поэтому я бы поставил Varinsh перед сервером A, на котором работает служба, и сервером B, в котором хранятся ранее сгенерированные версии контента.Если он получит запрос на ресурс, который не был кэширован, он попробует сервер B. После получения ответа 404 он запросит тот же ресурс у сервера A.

Может ли Varnish быть настроен таким образомкстати с VCL?Если нет, то есть ли такое решение, о котором вы знаете?

PS Я не хочу отправлять 302 перенаправления в браузер, плюс у меня нет контроля над сервером B, чтобы он отправлял такие перенаправления вместо 404-х.

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

Это вполне возможно в лаке.Убедитесь, что в vcl_fetch (и, возможно, в vcl_error) вы проверяете код состояния возврата (например, проверьте статус> 400), делаете перезапуск, если он не удался, и в vcl_recv выбираете другой сервер, если req.restarts> 0. Например:

backend serverA {
   .host="192.168.0.1";
   .port = "80";
}

backend serverB {
   .host = "192.168.0.2";
   .port = "80";
}

sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverB;
   } else {
       set req.backend = serverA;
   }
}

sub vcl_fetch {
    if (obj.status >= 400 && req.restarts == 0) {
        restart;
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       restart;
   }
}

Но, как говорится, кажется, что вы заново изобретаете концепцию сервера кеша.И Varnish - отличный кеш-сервер.Почему бы не иметь один внутренний сервер (serverA) и иметь кэш Varnish для ваших сгенерированных объектов?Вы можете установить сложные правила, и вы получите срок действия (из кэша), управление очисткой и производительность бесплатно!:)

0 голосов
/ 20 января 2015

В этом примере, попытка поиска лака на 6 серверах, если не найдена, показывает последнее сообщение.

# cat /etc/varnish/default.vcl 
backend serverA {
   .host="10.42.4.104";
   .port = "80";
}

backend serverB {
   .host = "10.42.4.102";
   .port = "80";
}

backend serverC {
   .host = "10.42.4.103";
   .port = "80";
}

backend serverD {
   .host = "10.42.4.101";
   .port = "80";
}

backend serverE {
   .host = "10.42.4.105";
   .port = "80";
}

backend serverF {
   .host = "10.42.4.106";
   .port = "80";
}




sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverA;
   } elseif (req.restarts == 1){
       set req.backend = serverB;
   } elseif (req.restarts == 2){
       set req.backend = serverC;
   } elseif (req.restarts == 3){
       set req.backend = serverD;
   } elseif (req.restarts == 4){
       set req.backend = serverE;
   } else {
       set req.backend = serverF;
   }
}


sub vcl_fetch {
    if (beresp.status >= 400 && req.restarts == 0) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 1) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 2) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 3) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 4) {
        return(restart);
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       return(restart);
   }
   if (req.restarts == 1) {
       return(restart);
   }
   if (req.restarts == 2) {
       return(restart);
   }
   if (req.restarts == 3) {
       return(restart);
   }
   if (req.restarts == 4) {
       return(restart);
   }

}
...