Keep Alive piles up

Maxim Dounin mdounin at mdounin.ru
Thu Jul 16 20:20:29 MSD 2009


Hello!

On Thu, Jul 16, 2009 at 11:55:38AM +0200, Toni Mueller wrote:

> 
> Hello!
> 
> On Tue, 30.06.2009 at 00:18:57 +0400, Maxim Dounin <mdounin at mdounin.ru> wrote:
> > Looks like you assume that wiki == documentation.  It's simply not 
> > true.
> 
> it seems that for those of us who can't read russian, it simply has to
> be true because we don't have much of a choice.

It's probably a good idea to maintain translation of 
documentation somewhere, may be just change wiki policy for 
generic pages.  For now, feel free to use google translate or 
yahoo babelfish.

> > Yes, nested locations have drawbacks due to some inheritance bugs 
> > (and hence they still aren't documented in official docs).  But 
> > if's are in fact nested locations under the hood - and they have 
> 
> I have trouble understanding how if()s can be locations under the hood,
> or how I could use variable testing (like eg. in geo-ip) without if()s.

Looks like statements for me, not questions.  Anyway, here is some 
explanations:

1. Directive if() used inside location creates another location 
configuration object via ngx_http_add_location() (and then it's 
used in case if() condition passes), see 
src/http/modules/ngx_http_rewrite_module.c:ngx_http_rewrite_if() 
for details.

2. In some cases you can avoid using if()'s.  In some you can't.  
If you can - in most cases it's better choice to avoid.  If you 
can't - it's somethimes better to avoid the whole case then to use 
if().

Normally if's will work.  But somethimes they produce unexpected 
results or even coredumps.  The bad thing is that previously good 
configuration that uses if's may be rendered invalid just by 
adding some minor unrelated directives (or vice versa, good 
configuration without if's may be rendered invalid by adding 
unrelated if's).  Here are some examples:

1.

Good, try_files working as expected:

        location /try-files {
             try_files  /file  @fallback;
        }

Bad, try_files not working at all:

        location /if-try-files {
             try_files  /file  @fallback;

             set $true 1;

             if ($true) {
                 # nothing
             }
        }

2.

Good, works as expected:

        location /no-crash {

            set $true 1;

            if ($true) {
                # fastcgi_pass here
                fastcgi_pass  127.0.0.1:9000;
            }
        }

Bad, crashes:

        location /crash {

            set $true 1;

            if ($true) {
                # fastcgi_pass here
                fastcgi_pass  127.0.0.1:9000;
            }

            if ($true) {
                # no handler here
            }
        }

The other bad thing - it's not clear how to fix this without 
breaking compatibility.

Note that if() used inside server{} block and if() used inside 
location block are quite a different beasts.  While the former is 
limited to safe things and mostly harmless - latter is evil.  On 
the other hand, using server-scope if's is just inefficient if you 
need them only for some specific location.

Maxim Dounin





More information about the nginx mailing list