[PATCH 0 of 1] Upstream: add propagate_connection_close directive

Maxim Dounin mdounin at mdounin.ru
Mon Jan 5 03:47:44 UTC 2015


On Fri, Jan 02, 2015 at 04:03:58PM -0800, Shawn J. Goff wrote:

> This patch adds a new directive to the upstream module:
> propagate_connection_close. It puts a "Connection: close" header in
> the downstream response if the upstream server sent one. This is
> useful when Nginx is used as HTTP/HTTPS endpoints with load blancers
> in front of them. It allows the upstream server to close connections
> in order to shed load.

You may try to better elaborate on the problem you are trying to 
solve and why existing mechanisms do not work for you.

As of now, nginx can:

- Disable keepalive completely ("keepalive_timeout 0") on a 
  per-location basis (http://nginx.org/r/keepalive_timeout).

- Disable keepalive based on a number of requests served in a 
  connection (http://nginx.org/r/keepalive_requests).

- Disable keepalive in some specific conditions 

- Disable chunked transfer encoding on a per-location basis 

I think this addresses most, if not all, problems in the links you 
provided.  In particular, low enough keepalive_requests can be 
used to distribute load if needed.

> I can submit a documentation patch if this patch is accepted.

The approach taken in the patch looks wrong, for multiple reasons, 
in particular:

- The upstream module isn't expected to contain it's own 
  directives, expect ones used to define upstream{} blocks.  
  Instead, there should be directives in modules implementing 
  protocols, like "proxy_foo_bar...".

- The "Connection: close" header is a hop-by-hop http header, and 
  "propogating" it looks like a bad idea.  It mixes control of the 
  nginx-to-backend connection with control of the client-to-nginx 
  connection.  Instead, there should be a way to control these 
  connections separately.  It may be an option to add X-Accel-... 
  header instead, similart to X-Accel-Limit-Rate.  Though this 
  approach has it's own problems too, see below.

- It is not possible to control connections that aren't proxied 
  to backends but are handled locally - e.g., when using embedded 
  perl or even just serving static files.

If there is a need to allow dynamic control of keepalive, I think 
that proper way would be to extend the "keepalive_disable" 
directive with variables support.

Maxim Dounin

More information about the nginx-devel mailing list