Возникла проблема с Varnish, возвращающим неправильный сервер. У меня есть несколько бэкэндов, прослушивающих порты с 8080 по 8095 на vhosts в Apache. Я настроил свои бэкенды Varnish так:
acl purge {
"localhost";
"192.168.0.1";
}
backend default {
.host = "192.168.0.1";
.port = "8094";
.connect_timeout = 20s; #600s;
.first_byte_timeout = 20s; #600s;
.between_bytes_timeout = 20s; #600s;
}
backend default_mobile {
.host = "192.168.0.1";
.port = "8093";
.connect_timeout = 20s; #600s;
.first_byte_timeout = 20s; #600s;
.between_bytes_timeout = 20s; #600s;
}
backend secondary {
.host = "192.168.0.1";
.port = "8082";
.connect_timeout = 20s; #600s;
.first_byte_timeout = 20s; #600s;
.between_bytes_timeout = 20s; #600s;
}
backend secondary_mobile {
.host = "192.168.0.1";
.port = "8083";
.connect_timeout = 20s; #600s;
.first_byte_timeout = 20s; #600s;
.between_bytes_timeout = 20s; #600s;
}
В большинстве случаев это работает хорошо, но через некоторое время (несколько часов) мы будем получать отчеты о том, что пользователи видят неправильный сайт по неправильному URL-адресу. Например, они перейдут на www.example.com и получат страницу из бэкэнда secondary_mobile. Это всегда один и тот же бэкэнд, который возвращается неправильно, и URL-адрес в браузере показывает предполагаемый сайт (www.example.com). У нас нет никаких перенаправлений в Apache, поэтому я не уверен, как это запутать. Вот пример того, как я настраиваю бэкенды:
....
if ( req.http.host ~ "example.com$" ) {
set req.backend = default;
set req.http.host = "www.example.com";
} else if ( req.http.host ~ "^(www.)?example2.com$" ) {
set req.backend = secondary;
set req.http.host = "www.example2.com";
} else if ( req.http.host ~ "^(m.)?example2.com$" ) {
set req.backend = secondary_mobile;
set req.http.host = "m.example2.com";
....
Я думал, что вручную указать хост было достаточно, но, видимо, нет. В документации Varnish тоже немного по этой теме.