ðòïåëôù 


  áòèé÷ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  óôáôøé 


  ðåòóïîáìøîïå 


  ðòïçòáííù 



ðéûéôå
ðéóøíá












     áòèé÷ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

recursive_error_pages limited to a chain of 11?


  • To: nginx-ru@xxxxxxxxx
  • Subject: recursive_error_pages limited to a chain of 11?
  • From: "o456092@xxxxxxxxx" <nginx-forum@xxxxxxxx>
  • Date: Tue, 25 Sep 2012 09:41:57 -0400
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tigger.jlkhosting.com; s=x; h=Date:Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=hVsTYHkPczjBMHIoR6FS3HX41Gh/2sd7XWiY1ex29OY=; b=VQKvWF59BtZXT7svra01Ohw2AXAjs5+7uY8zaHMJYdOucM2HK06VNTPRQRw8uziM1wUgkql8+AnlHrv3xDyWmhOa/+kZzKFtNA8OEdECF2D3U8yoU6IU+949dPSsTvV2;

Hi,

I have configured NGINX as an HTTP Asset locator, where the assets might
found through a series of recursive errors by sequentially a series of
different webservers. The problem that "I think" I have ran into, is that
NGINX's recursive_error_pages is limited to a depth 11 servers, thus 11
errors 404 or 500 errors- is this a fact? Interesting enough I get a 500
internal server error when I hit this 11th member in the chain.

I have tested various scenarios and I always seem to be blocked at the 11th
cascading call with a 500 error - I move different servers around in fear
that one of them (upstream servers) had a problem, but it was not specific
to a server, regardless which asset I was going after
http:<mynginx>/srv<n>/file<n> - once it hit 11 in depth.

Anyone has any ideas of this limitation - or is there something that could
be done?

--------------------------------------------------------------

nginx.conf
========

#user  nobody;
worker_processes  5;

pid        /var/run/nginx.origin.pid;


events {
    worker_connections  10000;
}

http {
    include       /etc/nginx.origin/mime.types;
    default_type  application/octet-stream;

        log_format main '-->$upstream_cache_status<-- | '
        '$remote_addr - $remote_user [$time_local]  "$request" '
        '| Upstream_Address "$upstream_addr" '
        '| upstream_response_time $upstream_response_time '
        '| msec $msec request_time $request_time '
        '| OriginServer $upstream_addr';
        
        log_format cache '***$time_local '
        '-->$upstream_cache_status<-- '
        'Cache-Control: $upstream_http_cache_control '
        'Expires: $upstream_http_expires '
        '"$request" ($status) '
        '"$http_user_agent" ';
                
        access_log  /var/log/nginx/origin.nas.access.log  main;

   sendfile        on;
   keepalive_timeout  65;
   server_tokens off;
        
        add_header Upstream-Host        $upstream_addr;
        add_header Cache-Status         $upstream_cache_status;
        
        client_body_buffer_size  512k;
        proxy_connect_timeout    5;
        proxy_read_timeout       60;
        proxy_send_timeout       5;
        proxy_buffer_size        16k;
        proxy_buffers            4 64k;
        proxy_busy_buffers_size 128k;
        proxy_temp_file_write_size 128k;
         
        upstream setA {
                server 10.10.30.9:10666;
        }

        upstream setB {
                server 10.10.31.79:10666;
        }
        upstream setC {
                server 10.10.72.109:10666;
        }
        upstream setD {
                server 10.10.72.110:10666;
        }
        upstream setE {
                server 10.10.72.201:10666;
        }
        upstream setF {
                server 10.10.72.127:10666;
        }
        upstream setG {
                server 10.10.72.128:10666;
        }
        upstream setH {
                server 10.10.72.137:10666;
        }
        upstream setI {
                server 10.10.31.238:10666;
        }
        upstream setJ {
                server 10.10.72.134:10666;
        }
        upstream setK {
                server 10.10.72.139:10666;
        }
        upstream setL {
                server 10.10.76.110:10666;
        }
        upstream setM {
                server 10.10.72.141:10666;
        }
        upstream setN {
                server 10.10.72.126:10666;
        }
        upstream setO {
                server 10.10.76.103:10666;
        }
        upstream setY {
                server 10.10.73.90:10666;
                server 10.10.73.91:10666;
        }
        upstream setZ {
                server 10.10.38.88:10666;
                server 10.10.38.89:10666;
        }
        
    server {
        listen       haproxy-local:10777;
        server_name  localhost;
        
        recursive_error_pages           on; 
                proxy_cache nginx_cache;
                proxy_cache_valid  200 304 12h;
                expires      1d; 
                
                #SetAHandler
                location /
                {
                        access_log  
/var/log/nginx/origin.handler.a.proxy_access.log  main;
                        
                        # THIS IS IMPORTANT! Turn this on so the error_page 
handlers will follow
a chain.
                        # This should ONLY be under "location /". If it's under 
http{} or
server{}, the scope 
                        # is too large and we may get an infinite loop.
            #
****************************************************************************************
            # THE STATEMENT ABOVE FAILS TO NOTE THAT:
            # when included under 'location' the chain only allows up to 2
server after the first one
                        #
                        error_page 404 502 503 504 500 = @SetBHandler;
                        proxy_intercept_errors on;

                        #If there is only one server in "server_set_X",
                        # make sure it's not the same server this nginx is 
deployed on.
Otherwise, you'll get a possible infinite loop. 
                        #You'll see the error log complain about 'max 
descriptors'.
                        proxy_pass http://setA; 
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        #This is different from how long it takes to READ it. 
For that, use
proxy_read_timeout
                        proxy_connect_timeout 60s; 
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                        
                #       break;
                }

                location @SetBHandler
                {
                        access_log  
/var/log/nginx/origin.handler.b.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetCHandler;
                        proxy_pass http://setB;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                
                location @SetCHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetDHandler;
                        proxy_pass http://setC;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                
                location @SetDHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetEHandler;
                        proxy_pass http://setD;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                        
                }
                
                location @SetEHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetFHandler;
                        proxy_pass http://setE;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                        
                }
                
                location @SetFHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetGHandler;
                        proxy_pass http://setF;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                        
                }
                
                location @SetGHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetHHandler;
                        proxy_pass http://setG;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                
                location @SetHHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetIHandler;
                        proxy_pass http://setH;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                
                location @SetIHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetJHandler;
                        proxy_pass http://setI;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                
                location @SetJHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetKHandler;
                        proxy_pass http://setJ;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                
                location @SetKHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetLHandler;
                        proxy_pass http://setK;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                
                location @SetLHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetMHandler;
                        proxy_pass http://setL;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                location @SetMHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetNHandler;
                        proxy_pass http://setM;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                location @SetNHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetOHandler;
                        proxy_pass http://setN;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                location @SetOHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetYHandler;
                        proxy_pass http://setO;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                location @SetYHandler
                {
                        access_log  
/var/log/nginx/origin.handler.c.proxy_access.log  main;
                        proxy_intercept_errors on;
                        
                        #If 404, check next server set. If last, it should go 
to error page.
                        error_page 404 502 503 504 500 = @SetZHandler;
                        proxy_pass http://setY;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        
                }
                                
                location @SetZHandler
                {
                        access_log  
/var/log/nginx/origin.handler.f.proxy_access.log  main;
                        #If 404, check next server set. If last, it should go 
to error page.
                        #error_page 404 502 503 504 /404.html;
                        #error_page 404 /404.html;
                        proxy_pass http://setZ;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For 
$proxy_add_x_forwarded_for;
                        proxy_connect_timeout 60s;
                        proxy_next_upstream error timeout http_500 http_502 
http_503 http_504
http_404;
                        #Last proxy, return whatever it gives
                        proxy_intercept_errors off;
                        
                }
                
                # redirect server error pages to the static page /50x.html
                #
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                        root   html;
                }
          
                location = /404.html {
                        root            html;
                }
                
                location = /crossdomain.xml {
                        access_log  
/var/log/nginx/origin.handler.crossdomain.proxy_access.log 
main;
                        root            html;
                }
    }

}

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,231038,231038#msg-231038

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.