Switching backends based on a cookie

saltyflorida nginx-forum at nginx.us
Fri Jan 29 10:05:05 MSK 2010


Eugaia Wrote:
-------------------------------------------------------
> saltyflorida wrote:
> > I forgot to mention that I am using caching with
> the HTTP Proxy module and that I only want to
> cache responses from the production servers. When
> I have the cookie set to "testing" or "staging",
> I'd like to bypass the cache and talk directly to
> the backend. Does this sound feasible?
> >   
> Sure.  Do a rewrite using your $backend variable
> under the 'location /' 
> block to one of three other blocks, which have the
> different definitions 
> of your proxy_pass, proxy_cache_valid...
> 
> e.g.
> 
> map $cookie_  $backend {
> 
>     default   production;
>     test      test;
>     ...
> }
> 
> location   / {
>     rewrite   ^(.*)$   /$backend/$1;
> }
> 
> location   /production/ {
>     proxy_pass           
> http://backend_production;
>     proxy_cache_valid   ...
> }
> 
> location   /test/ {
>     proxy_pass
>     # no proxy_cache_valid
>     ...
> }
> 
> Note, you'll need some way to catch the case of no
> cookie variable, so 
> it's unwise to put $cookie_ directly in the
> rewrite result (you'll 
> get an infinite loop on such results).
> 
> Marcus.
> 
> _______________________________________________
> nginx mailing list
> nginx at nginx.org
> http://nginx.org/mailman/listinfo/nginx

Marcus,
Thank you for your help. I had wondered if I could use a rewrite, but I don't 
understand how this works. I tried to implement your suggestion, but I am
being redirected to /testing/ or /production/. These show up as part of the 
URL in the browser. Also, trying to visit pages other than the root return a
404 error. Here is my configuration. Can you point out what I'm doing wrong?

http {
    upstream backend_testing {
            ip_hash;
        server ...
    }
    upstream backend_staging {
            ip_hash;
        server ...
    }
    upstream backend_production {
            ip_hash;
        server ...
    }
    proxy_cache_path /mnt/nginx_cache levels=1:2
                     keys_zone=one:100m
                     inactive=7d max_size=10g;
    proxy_temp_path /var/www/nginx_temp;

    map $cookie_uslnn_env $backend {
        default      http://backend_production;
        testing      http://backend_testing;
        staging      http://backend_staging;
        production   http://backend_production;
    }

    server {
        location / {
            rewrite ^(.*)$ /$backend/$1;
        }
        location /testing/ {
            proxy_pass http://backend_testing;
        }
        location /staging/ {
            proxy_pass http://backend_staging;
        }
        location /production/ {
            proxy_pass http://backend_production;
            proxy_cache one;
            proxy_cache_key $my_cache_key;
            proxy_cache_valid  200 302 304 10m;
            proxy_cache_valid  301 1h;
            proxy_cache_valid  any 1m;
            proxy_cache_use_stale updating error timeout invalid_header http_500 http_502 http_503 http_504;
        }
        location /wp-admin {
            proxy_pass http://backend_production;
            proxy_read_timeout 300;
        }
    }
}

Thanks,
Eliot

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,46979,47092#msg-47092




More information about the nginx mailing list