Я новичок в настройке лака. Я пытаюсь скопировать настройку лака, которую я сделал на AWS, на другой сервер. Вот сценарий:
У меня есть 2 сервера, обслуживающих веб-контент (Web1 и Web2), которые представляют собой пару с балансировкой нагрузки. У нас Web1 работает и настроен правильно, и прямо сейчас у меня просто Web2 указывает на Web1 через Varnish.
Вот содержимое / etc / sysconfig / varnish:
NFILES=131072
MEMLOCK=82000
RELOAD_VCL=1
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-u varnish -g varnish \
-S /etc/varnish/secret \
-s file,/var/lib/varnish/varnish_storage.bin,1G"
А вот содержимое моего /etc/varnish/default.vcl (обратите внимание, что я подставил здесь IP-адрес хоста). В настоящее время у меня голый VCL, и этот работает:
backend default {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
sub vcl_recv {
}
Теперь, если я начну добавлять настройку «периода отсрочки» в vcl_recv, например, так, лак откажется запускаться:
backend default {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
sub vcl_recv {
set req.grace = 24h;
}
Если я попытаюсь добавить vcl_fetch, он тоже откажется работать:
backend default {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
sub vcl_recv {
}
sub vcl_fetch {
}
Я не уверен, что мне не хватает. Это может быть что-то очевидное, но у меня пока нет достаточного опыта, чтобы осознать это.
У меня на сервере AWS работает что-то более сложное, что-то в этом роде, и оно работает:
sub vcl_recv {
set req.grace = 24h;
if (!req.backend.healthy) {
unset req.http.Cookie;
}
if (req.url ~ "(?i)\.(svg|png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$") {
unset req.http.Cookie;
}
set req.http.Cache-Control = "public; max-age=31557600";
if (req.http.Accept-Encoding) {
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
}
else if (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
}
else {
unset req.http.Accept-Encoding;
}
}
}
sub vcl_fetch {
set beresp.grace = 24h;
unset beresp.http.pragma;
set beresp.http.Max-Age = 31557600;
set beresp.http.Cache-Control = "public, max-age=31557600";
unset beresp.http.Set-Cookie;
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
}
else {
set resp.http.X-Cache = "MISS";
}
}
Поэтому я не понимаю, почему такая же конфигурация не будет работать на этом другом сервере.
Обновить:
Выполняя предложение Карлоса Абальде о запуске в режиме отладки, я теперь вижу следующую ошибку:
Message from VCC-compiler:
VCL sub's named 'vcl*' are reserved names.
('input' Line 28 Pos 5)
sub vcl_fetch {
----#########--
Valid vcl_* methods are:
none
vcl_recv
vcl_pipe
vcl_pass
vcl_hash
vcl_purge
vcl_miss
vcl_hit
vcl_deliver
vcl_synth
vcl_backend_fetch
vcl_backend_response
vcl_backend_error
vcl_init
vcl_fini
Running VCC-compiler failed, exited with 2
VCL compilation failed
Я не понимаю, как не распознается vcl_fetch. Вот информация о моей версии Varnish:
varnishd (varnish-4.0.2 revision bfe7cd1)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2014 Varnish Software AS
Я немного покопался, и информация о версии дала мне некоторые подсказки. Я нашел здесь похожую проблему:
https://stackoverflow.com/questions/23284764/varnish-wont-recognize-req-grace-variable
В основном я использую конфигурацию Varnish версии 3 при установке Varnish 4. Похоже, мне придется переписать свой VCL.
Если Varnish не запускается, вы можете попробовать запустить его вручную на переднем плане, а затем проверить наличие ошибок в stdout: sudo varnishd -F -f /path/to/your.vcl
.