On Wednesday 16 November 2011, Steffen wrote:
> What I noticed, it is connecting to a port by a formerly used
> proxied connection (port 7080 instead of 81);
>
> Summary log:
>
> [proxy:debug] [pid 8680:tid 2668] proxy_util.c(2140): proxy: HTTP:
> has acquired connection for (*)
> [proxy:debug] [pid 8680:tid 2668] proxy_util.c(2193): proxy:
> connecting http://127.0.0.1:81/sysadmin to 127.0.0.1:81
> [proxy:debug] [pid 8680:tid 2668] proxy_util.c(2319): proxy:
> connected /sysadmin to 127.0.0.1:7080
After a cursory glance at the code, I have a suspicion about the
reason. It seems to me that this check in proxy_util.c
/*
* Make sure that we pick the the correct and valid worker.
* If a single keepalive connection triggers different workers,
* then we have a problem (we don't select the correct one).
* Do an expensive check in this case, where we compare the
* the hostnames associated between the two.
*
* TODO: Handle this much better...
*/
if (!conn->hostname || !worker->s->is_address_reusable ||
worker->s->disablereuse ||
(r->connection->keepalives &&
(r->proxyreq == PROXYREQ_PROXY || r->proxyreq ==
PROXYREQ_REVERSE) &&
(strcasecmp(conn->hostname, uri->hostname) != 0) ) ) {
should also compare conn->port and uri->port, i.e. the
(strcasecmp(conn->hostname, uri->hostname) != 0)
should be
(strcasecmp(conn->hostname, uri->hostname) != 0 ||
conn->port != uri->port)
Can anyone more familiar with the code verify this? Steffen, maybe you
can try the change and see if it helps?
Cheers,
Stefan