Thanks Willy and Nenand!

On Fri, Jul 22, 2016 at 5:44 AM, Willy Tarreau <[email protected]> wrote:

> 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
>
>

Reply via email to