[squid-users] Cache peer selection with duplicate host names
Amos Jeffries
squid3 at treenet.co.nz
Mon Apr 24 02:57:45 UTC 2017
On 24/04/17 14:12, squid-users wrote:
> Hi Squid users,
>
> I'm having some trouble understanding Squid's peer selection algorithms, in
> a configuration where multiple cache_peer lines reference the same host.
>
> The background to this is that we wish to present cache service using
> multiple accounts at an upstream provider, with account selection taking
> place based on the local TCP port (8080, 8181, 8282) the request arrived on.
>
> First we define the cache peers:
>
> cache_peer proxy.myisp.net parent 8080 0 login=staffuser:abc123 no-query
> no-digest no-netdb-exchange connect-timeout=1 connect-fail-limit=2
> name=Staff
> cache_peer proxy.myisp.net parent 8080 0 login=guestuser:abc123 no-query
> no-digest no-netdb-exchange connect-timeout=1 connect-fail-limit=2
> name=Guest
> cache_peer proxy.myisp.net parent 8080 0 login=PASS no-query no-digest
> no-netdb-exchange connect-timeout=1 connect-fail-limit=2 name=Student
>
> Then lock access down:
>
> acl localport_Staff localport 8282
> acl localport_Guest localport 8181
> acl localport_Student localport 8080
localport is taken from the TCP connection arriving into Squid. It may
be different to the Squid listening port.
So what are your http(s)_port lines ?
> cache_peer_access Staff allow localport_Staff !localport_Guest
> !localport_Student
> cache_peer_access Guest allow localport_Guest !localport_Staff
> !localport_Student
> cache_peer_access Student allow localport_Student !localport_Guest
> !localport_Staff
You do not need these !blah pieces. No single TCP connection can have
multiple destination ports. So when one of your ACLs matches the others
cannot be matches.
> To reproduce the error, first a connection is made with wget to tcp port
> 8282:
>
> http_proxy=http://10.159.192.24:8282/ wget www.monash.edu --delete-after
>
> Squid selects the Staff profile as expected:
>
> 1492999376.993 811 10.159.192.26 TCP_MISS/200 780195 GET
> http://www.monash.edu/ - FIRSTUP_PARENT/Staff text/html "EDU%20%20%20en"
> "Wget/1.12 (linux-gnu)"
>
> Then another connection is made, this time to port 8080:
>
> http_proxy=http://10.159.192.24:8080/ wget www.monash.edu --delete-after
>
> But instead of the desired Student profile being selected, the Staff profile
> is still used instead:
>
> 1492999405.953 338 10.159.192.26 TCP_MISS/200 780195 GET
> http://www.monash.edu/ - FIRSTUP_PARENT/Staff text/html "EDU%20%20%20en"
> "Wget/1.12 (linux-gnu)"
>
> I had a look in the cache.log with debug_options 44,6 enabled. None of the
> messages reference the contents of the name= parameter in the cache_peer
> lines; only hostnames and IP addresses are mentioned. I suspect that the
> peer selection algorithms have changed since Squid 3.1, whereby peers are
> now selected based on hostname (or IP address) rather than the name defined
> in the cache_peer line. Is this correct?
No the peer selection still works based on the name. But that name now
gets translated to a list of IP:port destinations that can be tried by
the forwarding logic.
I think what you are seeing is the side effect of the peers all having
the same IP:port details versus HTTP persistent connections. When the
forwarding logic looks for an open persistent connection for the Student
IP:port it might get handed the existing Staff connection - since they
both have the same IP:port they are the same server as far as HTTP is
concerned.
You could try turning persistence to servers off
<http://www.squid-cache.org/Doc/config/server_persistent_connections/>
... or using a different port for each of the cache_peer lines and
NAPT'ing them on the outgoing TCP connections back to what the upstream
peer actually uses.
Amos
More information about the squid-users
mailing list