A problem with the keepalive module and the direcitve proxy_next_upstream

Maxim Dounin mdounin at mdounin.ru
Mon Jan 14 10:51:24 UTC 2013


Hello!

On Mon, Jan 14, 2013 at 04:11:20PM +0800, 姚伟斌 wrote:

> Hi, folks,
> 
> We have found a bug with the keepalive module. When we used the keepalive
> module, the directive proxy_next_upstream seems disabled.
> 
> We use Nginx as reverse server. Our backend servers simply close connection
> when read some abnormal packets. Nginx will call the function
> ngx_http_upstream_next() and try to use the next server. The ft_type
> is NGX_HTTP_UPSTREAM_FT_ERROR. We want to turn off the try mechanism with
> such packets. Otherwise, it will try all the servers every time. We use
> directive proxy_next_upstream off. If it's not keepalive connection,
> everything is fine. If it's keepalive connection, it will run such code:
> 
> 2858     if (u->peer.cached && ft_type == NGX_HTTP_UPSTREAM_FT_ERROR) {
> 2859         status = 0;
> 2860
> 2861         /* TODO: inform balancer instead */
> 2862
> 2863         u->peer.tries++;
> 2864
> 
> The status is cleared to be 0. The below code will never be touched:
> 
> 2896     if (status) {
> 2897         u->state->status = status;
> 2898
> 2899         if (u->peer.tries == 0 || !(u->conf->next_upstream & ft_type))
> {
> 
> The variable of tries and u->conf->next_upstream become useless.
> 
> I don't know why the cached connection should clear the status, Can we just
> remove the code from line 2858 to 2864? Is there any side effect?

Cached connection might be (legitimately) closed by an upstream 
server at any time, so the code always retries if sending request 
failed.


-- 
Maxim Dounin
http://nginx.com/support.html



More information about the nginx mailing list