Можно ли настроить лак, чтобы попробовать второй сервер для некоторого ресурса, если он получает 404 от основного сервера?

StackOverflow https://stackoverflow.com/questions/4327874

  •  29-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Это вполне возможно в лаке. Убедитесь, что в 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;
   }
}

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

Другие советы

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

# 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);
   }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top