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