Можно ли настроить лак, чтобы попробовать второй сервер для некоторого ресурса, если он получает 404 от основного сервера?
-
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);
}
}