Hi Pavlos, On Fri, Jul 22, 2016 at 12:33:07AM +0200, Pavlos Parissis wrote: > On 21/07/2016 10:30 ????, Willy Tarreau wrote: > > Hi, > > > > On Thu, Jul 21, 2016 at 02:33:05PM -0400, CJ Ess wrote: > >> I think I'm overlooking something simple, could someone spot check me? > >> > >> What I want to do is to pool connections on my http backend - keep HAProxy > >> from opening a new connection to the same backend if there is an > >> established connection that is idle. > >> > >> My haproxy version is 1.5.18 > > (...) > > > >> There is more then enough traffic going through the backend that if a > >> connection is idle, there will be a request that could use it (within ms, > >> should never hit the 5s or 75s timeouts), however in every case the > >> connection just sites idle for five seconds then closes. > >> > >> Am I missing something simple to enable this behavior? > > > > Yes, you're missing the "http-reuse" directive which was introduced in > > 1.6. Be careful when doing this (read the doc carefully), as some > > servers still tend to confuse requests and connections and could do > > some funny stuff there. > > Can you elaborate a bit more on this? > Which servers? Nginx/Apache and under which conditions ?
Some application servers (or some components) tend to tie some incoming parameters to the connection instead of the request. There used to be a lot of confusion regarding this when keep-alive was brought to HTTP because it was the era where reverse proxies would not even exist so there was no doubt that a connection always comes from a client. Unfortunately some bad designs were introduced due to this. The most widely known certainly is NTLM, which violates HTTP since it assumes that all requests coming over a connection belong to the same client. HAProxy detects this by marking a connection "private" as soon as it sees a 401 or 407 on it, and will not share it with any other client. But regardless of this, you'll find dirty applications which assign a cookie only after the 2nd or 3rd request over a given connection. Some will only emit a response cookie on the first response so the next requests will never get a cookie. Other ones will only check the X-Forwarded-For header when the connection establishes and will use this value for all requests from the connection, resulting in wrong logs and/or possibly rules. Others will simply take a decision on the first request of a connection and not check the remaining ones (like haproxy used to do up to version 1.3 and can still do when forced in tunnel mode). Most often the application components which break these HTTP principles are the ones which do not support a load balancer. But sometimes some of them work when you install a load balancer working in tunnel mode in front of them (like haproxy up to 1.3 by default). A rule of thumb is that if your application only works when you have "option prefer-last-server", then your application certainly is at risk. This problem has been widely discussed inside the IETF HTTP working group and is known as "requests must work in isolation". It's been quite well documented over the years and normally all modern components are safe. But if you connect to a good old dirty thing developed in the early 2000, be careful! Similarly, when using 3rd party apache modules developed by people doing a quick and dirty thing, be prepared to discover the hard way that they never read an RFC in their life... Cheers, Willy