Understanding "proxy_ignore_client_abort" functionality

Maxim Dounin mdounin at mdounin.ru
Tue Sep 2 19:42:48 UTC 2014


On Tue, Sep 02, 2014 at 12:57:15PM -0400, shmulik wrote:

> Hi,
> I'm trying to understand how "proxy_ignore_client_abort" should affect
> connection to upstream server once client closes the connection, since it
> seems to behave different than i'm expecting.


> 3. And the part that surprised me - in "ngx_http_upstream_process_request",
> if "downstream_error" flag is set, we also close the connection to upstream,
> regardless of the "proxy_ignore_client_abort" config:
> //-------------------------------------------------------------------------------------------------
>     if (p->downstream_error) {
>         ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
>                        "http upstream downstream error");
>         if (!u->cacheable && !u->store && u->peer.connection) {
>             ngx_http_upstream_finalize_request(r, u, NGX_ERROR);
>         }
>     }
> //-------------------------------------------------------------------------------------------------
> I'd expect the "proxy_ignore_client_abort" flag to be checked in the "if" in
> #3 as well (=don't close upstream connection if the flag is true).
> My first thought was that if the file should not be stored or cached - there
> is no reason to continue the connection to upstream, so that this is by
> design. However if that's the case then proxy_ignore_client_abort is
> redundant.

The proxy_ignore_client_abort flag specifies whether nginx will 
monitor possible connection close while waiting for an upstream 
server response.  If an error occurs while sending a response, the 
connection will be closed regardless of the flag, much like if 
there where no nginx at all.

Switching proxy_ignore_client_abort to on may be needed in the 
following cases I'm aware of:

- you need to maintain compatibility with clients that half-close 
  connections after sending a request;

- your backend doesn't check if a connection is closed while 
  generating a response (and hence closing the connection by nginx 
  will not abort the request processing on the backend), and at the 
  same time you want nginx to maintain limit_conn numbers mostly 
  matching actual resources used on the backend;

- your backend does check if a connection is closed, but you don't 
  want this to happen as you code can't really cope with it.

Maxim Dounin

More information about the nginx mailing list