Yusuke Nojima
February 19, 2016 11:22AM
# HG changeset patch
# User Yusuke Nojima <nojima@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
Subject Author Views Posted

[PATCH] Upstream: Add "before_send" option to the 'proxy_next_upstream'.

Yusuke Nojima 1288 February 19, 2016 11:22AM

Re: [PATCH] Upstream: Add "before_send" option to the 'proxy_next_upstream'.

Tolga Ceylan 521 February 22, 2016 06:36PM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 218
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready