Hi folks. I'm in the process of migrating to from v3 to v5, and have
finally got the config compiling at least. Now I'm having some problems
with the backends that I can't seem to work out. Apologies, this is a bit
of a wordy one...
Let's say I have two backends, web01 and web02, and these are put into a
director called admin_director for load-balancing. This is all in
"backends.vcl":
import directors;
probe healthcheck {
.request =
"GET / HTTP/1.1"
"Host: www.mydomain.co.uk"
"Connection: close";
.timeout = 30s;
.interval = 15s;
.window = 10;
.threshold = 8;
.expected_response = 302;
}
backend web01 { .host = "192.168.1.11"; .port = "80"; .first_byte_timeout =
600s; .probe = healthcheck; }
backend web02 { .host = "192.168.1.12"; .port = "80"; .first_byte_timeout =
600s; .probe = healthcheck; }
sub vcl_init {
new admin_director = directors.shard();
admin_director.add_backend(web01);
admin_director.add_backend(web02);
}
I've now removed all my main VCL for clarification, so my vcl_recv.vcl file
contains just:
import std;
sub vcl_recv {
set req.backend_hint = admin_director.backend();
std.log("Backend hint: " + req.backend_hint);
}
I then have my main "default.vcl":
vcl 4.0;
include "backends.vcl";
include "vcl_recv.vcl";
Now to the problem. If I try to access a URL, I always get a "FetchError:
No backend"
* << BeReq >> 3
- Begin bereq 2 fetch
- Timestamp Start: 1490802880.486355 0.000000 0.000000
- BereqMethod GET
- BereqURL /Common/Images/NewLoginImages/training.png
- BereqProtocol HTTP/1.1
- BereqHeader Host: www.mydomain.com
- BereqHeader User-Agent: curl/7.35.0
- BereqHeader Accept: */*
- BereqHeader X-Forwarded-Proto: https
- BereqHeader X-Real-Ip: 1.2.3.4
- BereqHeader Accept-Encoding: gzip
- BereqHeader X-Forwarded-For: 1.2.3.4, 192.168.1.23
- BereqHeader X-Varnish: 3
- VCL_call BACKEND_FETCH
- VCL_return fetch
- FetchError No backend
- Timestamp Beresp: 1490802880.486447 0.000092 0.000092
- Timestamp Error: 1490802880.486452 0.000098 0.000006
- BerespProtocol HTTP/1.1
- BerespStatus 503
- BerespReason Service Unavailable
- BerespReason Backend fetch failed
- BerespHeader Date: Wed, 29 Mar 2017 15:54:40 GMT
- BerespHeader Server: Varnish
- VCL_call BACKEND_ERROR
- BerespHeader Content-Type: text/html; charset=utf-8
- BerespHeader Retry-After: 5
- VCL_return deliver
- Storage malloc Transient
- ObjProtocol HTTP/1.1
- ObjStatus 503
- ObjReason Backend fetch failed
- ObjHeader Date: Wed, 29 Mar 2017 15:54:40 GMT
- ObjHeader Server: Varnish
- ObjHeader Content-Type: text/html; charset=utf-8
- ObjHeader Retry-After: 5
- Length 278
- BereqAcct 0 0 0 0 0 0
- End
* << Request >> 32770
- Begin req 32769 rxreq
- Timestamp Start: 1490803780.494500 0.000000 0.000000
- Timestamp Req: 1490803780.494500 0.000000 0.000000
- ReqStart 192.168.1.23 36896
- ReqMethod GET
- ReqURL /Common/Images/NewLoginImages/training.png
- ReqProtocol HTTP/1.1
- ReqHeader Host: www.mydomain.com
- ReqHeader User-Agent: curl/7.35.0
- ReqHeader Accept: */*
- ReqHeader X-Forwarded-For: 1.2.3.4
- ReqHeader X-Forwarded-Proto: https
- ReqHeader X-Real-Ip: 1.2.3.4
- ReqHeader Accept-Encoding: gzip
- ReqUnset X-Forwarded-For: 1.2.3.4
- ReqHeader X-Forwarded-For: 1.2.3.4, 192.168.1.23
- VCL_call RECV
- Error shard admin_director: no backends
- VCL_Log Backend hint:
- VCL_return hash
- VCL_call HASH
- VCL_return lookup
- VCL_call MISS
- VCL_return fetch
- Link bereq 32771 fetch
- Timestamp Fetch: 1490803780.495705 0.001204 0.001204
- RespProtocol HTTP/1.1
- RespStatus 503
- RespReason Backend fetch failed
- RespHeader Date: Wed, 29 Mar 2017 16:09:40 GMT
- RespHeader Server: Varnish
- RespHeader Content-Type: text/html; charset=utf-8
- RespHeader Retry-After: 5
- RespHeader X-Varnish: 32770
- RespHeader Age: 0
- RespHeader Via: 1.1 varnish (Varnish/5.1)
- VCL_call DELIVER
- VCL_return deliver
- Timestamp Process: 1490803780.495723 0.001223 0.000019
- RespHeader Content-Length: 282
- Debug "RES_MODE 2"
- RespHeader Connection: keep-alive
- Timestamp Resp: 1490803780.495806 0.001305 0.000082
- ReqAcct 238 0 238 250 282 532
- End
But my backend.list seems to always be healthy:
boot.web01 probe Healthy 10/10
Wed, 29 Mar 2017 15:54:18 GMT
boot.web02 probe Healthy 10/10
Wed, 29 Mar 2017 15:54:18 GMT
From the varnish server, I can reach the backends successfully manually:
curl --resolve www.mydomain.com:192.168.1.11
http://www.mydomain.com/Common/Images/NewLoginImages/training.png
Not sure what it all means.
finally got the config compiling at least. Now I'm having some problems
with the backends that I can't seem to work out. Apologies, this is a bit
of a wordy one...
Let's say I have two backends, web01 and web02, and these are put into a
director called admin_director for load-balancing. This is all in
"backends.vcl":
import directors;
probe healthcheck {
.request =
"GET / HTTP/1.1"
"Host: www.mydomain.co.uk"
"Connection: close";
.timeout = 30s;
.interval = 15s;
.window = 10;
.threshold = 8;
.expected_response = 302;
}
backend web01 { .host = "192.168.1.11"; .port = "80"; .first_byte_timeout =
600s; .probe = healthcheck; }
backend web02 { .host = "192.168.1.12"; .port = "80"; .first_byte_timeout =
600s; .probe = healthcheck; }
sub vcl_init {
new admin_director = directors.shard();
admin_director.add_backend(web01);
admin_director.add_backend(web02);
}
I've now removed all my main VCL for clarification, so my vcl_recv.vcl file
contains just:
import std;
sub vcl_recv {
set req.backend_hint = admin_director.backend();
std.log("Backend hint: " + req.backend_hint);
}
I then have my main "default.vcl":
vcl 4.0;
include "backends.vcl";
include "vcl_recv.vcl";
Now to the problem. If I try to access a URL, I always get a "FetchError:
No backend"
* << BeReq >> 3
- Begin bereq 2 fetch
- Timestamp Start: 1490802880.486355 0.000000 0.000000
- BereqMethod GET
- BereqURL /Common/Images/NewLoginImages/training.png
- BereqProtocol HTTP/1.1
- BereqHeader Host: www.mydomain.com
- BereqHeader User-Agent: curl/7.35.0
- BereqHeader Accept: */*
- BereqHeader X-Forwarded-Proto: https
- BereqHeader X-Real-Ip: 1.2.3.4
- BereqHeader Accept-Encoding: gzip
- BereqHeader X-Forwarded-For: 1.2.3.4, 192.168.1.23
- BereqHeader X-Varnish: 3
- VCL_call BACKEND_FETCH
- VCL_return fetch
- FetchError No backend
- Timestamp Beresp: 1490802880.486447 0.000092 0.000092
- Timestamp Error: 1490802880.486452 0.000098 0.000006
- BerespProtocol HTTP/1.1
- BerespStatus 503
- BerespReason Service Unavailable
- BerespReason Backend fetch failed
- BerespHeader Date: Wed, 29 Mar 2017 15:54:40 GMT
- BerespHeader Server: Varnish
- VCL_call BACKEND_ERROR
- BerespHeader Content-Type: text/html; charset=utf-8
- BerespHeader Retry-After: 5
- VCL_return deliver
- Storage malloc Transient
- ObjProtocol HTTP/1.1
- ObjStatus 503
- ObjReason Backend fetch failed
- ObjHeader Date: Wed, 29 Mar 2017 15:54:40 GMT
- ObjHeader Server: Varnish
- ObjHeader Content-Type: text/html; charset=utf-8
- ObjHeader Retry-After: 5
- Length 278
- BereqAcct 0 0 0 0 0 0
- End
* << Request >> 32770
- Begin req 32769 rxreq
- Timestamp Start: 1490803780.494500 0.000000 0.000000
- Timestamp Req: 1490803780.494500 0.000000 0.000000
- ReqStart 192.168.1.23 36896
- ReqMethod GET
- ReqURL /Common/Images/NewLoginImages/training.png
- ReqProtocol HTTP/1.1
- ReqHeader Host: www.mydomain.com
- ReqHeader User-Agent: curl/7.35.0
- ReqHeader Accept: */*
- ReqHeader X-Forwarded-For: 1.2.3.4
- ReqHeader X-Forwarded-Proto: https
- ReqHeader X-Real-Ip: 1.2.3.4
- ReqHeader Accept-Encoding: gzip
- ReqUnset X-Forwarded-For: 1.2.3.4
- ReqHeader X-Forwarded-For: 1.2.3.4, 192.168.1.23
- VCL_call RECV
- Error shard admin_director: no backends
- VCL_Log Backend hint:
- VCL_return hash
- VCL_call HASH
- VCL_return lookup
- VCL_call MISS
- VCL_return fetch
- Link bereq 32771 fetch
- Timestamp Fetch: 1490803780.495705 0.001204 0.001204
- RespProtocol HTTP/1.1
- RespStatus 503
- RespReason Backend fetch failed
- RespHeader Date: Wed, 29 Mar 2017 16:09:40 GMT
- RespHeader Server: Varnish
- RespHeader Content-Type: text/html; charset=utf-8
- RespHeader Retry-After: 5
- RespHeader X-Varnish: 32770
- RespHeader Age: 0
- RespHeader Via: 1.1 varnish (Varnish/5.1)
- VCL_call DELIVER
- VCL_return deliver
- Timestamp Process: 1490803780.495723 0.001223 0.000019
- RespHeader Content-Length: 282
- Debug "RES_MODE 2"
- RespHeader Connection: keep-alive
- Timestamp Resp: 1490803780.495806 0.001305 0.000082
- ReqAcct 238 0 238 250 282 532
- End
But my backend.list seems to always be healthy:
boot.web01 probe Healthy 10/10
Wed, 29 Mar 2017 15:54:18 GMT
boot.web02 probe Healthy 10/10
Wed, 29 Mar 2017 15:54:18 GMT
From the varnish server, I can reach the backends successfully manually:
curl --resolve www.mydomain.com:192.168.1.11
http://www.mydomain.com/Common/Images/NewLoginImages/training.png
Not sure what it all means.