# HG changeset patch # User Yusuke Nojima <noj...@ynojima.com> # Date 1455896920 0 # Fri Feb 19 15:48:40 2016 +0000 # Node ID 88bbee2e18f6d475ea7ed8ab61b0cb8142c535dc # Parent 5dfc63c1d9ca5ff5a21a2b0238a2b2782549f62c Upstream: Add "before_send" option to the 'proxy_next_upstream'.
"error" and "timeout" options are sometimes dangerous because non-idempotent requests (e.g. typical POST requests) are sent to more than one upstream server. When "before_send" option is specified, a request is passed to the next upstream if an error or a timeout has occurred before sending the first byte of the request. With this option, one can avoid the issue mentioned above without losing the ability to deal with the upstream host failures and daemon failures. diff -r 5dfc63c1d9ca -r 88bbee2e18f6 src/http/modules/ngx_http_proxy_module.c --- a/src/http/modules/ngx_http_proxy_module.c Thu Feb 18 15:49:11 2016 +0300 +++ b/src/http/modules/ngx_http_proxy_module.c Fri Feb 19 15:48:40 2016 +0000 @@ -220,6 +220,7 @@ { ngx_string("http_403"), NGX_HTTP_UPSTREAM_FT_HTTP_403 }, { ngx_string("http_404"), NGX_HTTP_UPSTREAM_FT_HTTP_404 }, { ngx_string("updating"), NGX_HTTP_UPSTREAM_FT_UPDATING }, + { ngx_string("before_send"), NGX_HTTP_UPSTREAM_FT_BEFORE_SEND }, { ngx_string("off"), NGX_HTTP_UPSTREAM_FT_OFF }, { ngx_null_string, 0 } }; diff -r 5dfc63c1d9ca -r 88bbee2e18f6 src/http/ngx_http_upstream.c --- a/src/http/ngx_http_upstream.c Thu Feb 18 15:49:11 2016 +0300 +++ b/src/http/ngx_http_upstream.c Fri Feb 19 15:48:40 2016 +0000 @@ -3872,11 +3872,15 @@ } if (status) { + int matches_next_condition = u->conf->next_upstream & ft_type; + if (u->conf->next_upstream & NGX_HTTP_UPSTREAM_FT_BEFORE_SEND) + matches_next_condition |= !u->request_sent; + u->state->status = status; timeout = u->conf->next_upstream_timeout; if (u->peer.tries == 0 - || !(u->conf->next_upstream & ft_type) + || !matches_next_condition || (u->request_sent && r->request_body_no_buffering) || (timeout && ngx_current_msec - u->peer.start_time >= timeout)) { diff -r 5dfc63c1d9ca -r 88bbee2e18f6 src/http/ngx_http_upstream.h --- a/src/http/ngx_http_upstream.h Thu Feb 18 15:49:11 2016 +0300 +++ b/src/http/ngx_http_upstream.h Fri Feb 19 15:48:40 2016 +0000 @@ -29,6 +29,7 @@ #define NGX_HTTP_UPSTREAM_FT_UPDATING 0x00000400 #define NGX_HTTP_UPSTREAM_FT_BUSY_LOCK 0x00000800 #define NGX_HTTP_UPSTREAM_FT_MAX_WAITING 0x00001000 +#define NGX_HTTP_UPSTREAM_FT_BEFORE_SEND 0x00002000 #define NGX_HTTP_UPSTREAM_FT_NOLIVE 0x40000000 #define NGX_HTTP_UPSTREAM_FT_OFF 0x80000000 _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel