Hi,

Le 02/02/2016 23:32, Nick Ramirez a écrit :
Greetings,

I am trying to figure out why, in roundrobin mode, with http-keep-alive
set (which should be the deafult anyway), the connection doesn't seem to
be kept open to the backend server.

Here is my HAproxy config where I've set the keep-alive timeout to 5
seconds:

defaults
   timeout connect 5s
   timeout client 120s
   timeout server 120s
   timeout http-request 5s
   timeout http-keep-alive 5s
   option http-keep-alive

frontend http
   mode http
   bind *:80
   default_backend servers1

backend servers1
   mode http
   balance roundrobin
   server web1 web1:80 check
   server web2 web2:80 check
   server web3 web3:80 check


Using Wireshark, it looks like, from the client perspective, the client
is reusing the same socket connection to HAProxy's frontend until the
timeout expires. At least, I think so. Source port reports as "port 80"
and destination port reports as some high numbered port, say 58000. And
over subsequent refreshes during the timeout period, it keeps using
those same ports.

So the keep-alive appears to be working between client and frontend.

However, I added an image to the Web page to see which backend server
would serve it (my little test to make sure the connection to the server
on the backend was being kept the same), and to see if it would be a
different server than the one that served the HTML...and it was
different. In roundrobin mode, two different backend servers served up
content to the same client, even though I had keep-alive enabled. I
changed the timeout period to be 25 seconds and, same behavior.

As you don't use any persistance (cookie, stick tables, source balancing, ...), it is a valid scenario : the connection is reused only if the roundrobin algorithm choose the same server for the next request (which can randomly happen depending on the traffic). But, there is an option to tell haproxy should try to reuse the previous server connection : option prefer-last-server

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#option%20prefer-last-server


This all seems to me like keep-alive is not working between frontend and
backend. Like, it keeps the connection between client and frontend, but
not between frontend and backend. This is the behavior I would expect if
I had set option http-server-close, but not when using option http-keep-
alive which should keep the connection to the server open.


--
Cyril Bonté

Reply via email to