execution of post_action each time breaks a keepalive connection to upstream

Maxim Dounin mdounin at mdounin.ru
Thu May 7 16:17:44 UTC 2015


Hello!

On Thu, May 07, 2015 at 05:37:44PM +0200, Sergey Brester wrote:

> >Hello!
> >
> >On Thu, May 07, 2015 at 12:51:33PM +0200, Sergey Brester wrote:
> >
> >>Hi all, I've found that use of "post_action @named_post" always (each
> >>time) closes a upstream connection (despite of keepalive).
> >
> >In short:
> >
> >- post_action is a dirty hack and undocumented on purpose, avoid
> >using it;
> 
> Undocumented in the long term or just still not?
> Because meanwhile it will be used from "half" world... I know at least a
> dozen companies, using that.

It was never documented, and will never be documented.  Well, may 
be we'll add something like "post_action: don't use it unless you 
understand what are you doing" to let people know that this 
directive should not be used.

> >- as long as an upstream response is complete after receiving a
> >header, upstream keepalive should work even with post_action; it
> >might be tricky to ensure this with fastcgi though.
> 
> What confuses me, that a header_only subrequest to fastcgi works fine!
> And what I mean was, it can be not "post_action" self, but possible all
> "header_only" requests via ngx_http_named_location etc. so in this case many
> things are affected (including third-party modules).

A connections to an upstream server can be only kept alive if it 
is in some consistent state and no outstanding data are expected 
in it.  On the other hand, nginx doesn't try to read anything in 
addition to what it already read during normal upstream response 
parsing.

As a result, if sending of a response is stopped once nginx got a 
header (this happens in case of post_action and in some cases with 
r->header_only), nginx will only be able to cache a connection if 
it's already in a consistent state.  This may be the case with 
HTTP if Content-Length is explicitly set to 0 in the response 
headers and in some other cases (see ngx_http_proxy_process_header() 
for details).

Quick look suggests that with FastCGI it doesn't seems to be 
possible at all, at least with current code, as nginx parses 
headers from FCGI_STDOUT records, but at least a FCGI_END_REQUEST 
record is additionally expected.  Therefore, FastCGI connections 
are always closed after a post_action request.  We event have a 
test for this:

http://hg.nginx.org/nginx-tests/file/f7bc1f74970a/fastcgi_keepalive.t#l66

If you think that a header_only subrequest works for you - well, 
you've probably missed something.  E.g., a header_only subrequest 
can work because of a configured cache.

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx-devel mailing list