Understanding "proxy_ignore_client_abort" functionality

shmulik nginx-forum at nginx.us
Tue Sep 2 16:57:15 UTC 2014


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.

I'm using the proxy module, with buffering on and proxy_ignore_client_abort
on as well (proxy_store off).
For boring and not related reasons, once i start a connection to the
upstream server i don't want to abort it, even if the client aborted the
connection.

However, even with "proxy_ignore_client_abort" on, once the client closes
the connection i still see that the upstream connection is closed by nginx.

I've run the scenario with a debugger and i see why this happens. This is
the flow:

1. At first, in "ngx_http_upstream_init_request", if
"proxy_ignore_client_abort" is on, nginx will not check for FIN/RST from
client:

//-------------------------------------------------------------------------------------------------
    if (!u->store && !r->post_action && !u->conf->ignore_client_abort) {
        r->read_event_handler =
ngx_http_upstream_rd_check_broken_connection;
        r->write_event_handler =
ngx_http_upstream_wr_check_broken_connection;
    }
//-------------------------------------------------------------------------------------------------

2. Later on, when reading the body from upstream and writing to downstream,
if client closed the connection the flag "p->downstream_error" is set to 1.

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.

Can you please shed some light on this? is this a bug? is it the desired
behavior? (if so, please explain the reason behind it).

I'm using Nginx ver 1.4.1 (though if i didn't miss anything it should be the
same in the latest version).

My location config (simplified) is:

        location ~ "^/fetch/(.*)" {
            proxy_pass http://$1;
            proxy_buffering on;
            proxy_buffers 10 1024k;
            proxy_ignore_client_abort on;    
            proxy_max_temp_file_size 0;
            proxy_http_version 1.1;    
        }

Thanks in advance,
Shmulik B

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,253026,253026#msg-253026



More information about the nginx mailing list