atom feed21 messages in ru.sysoev.nginxRe: Switching backends based on a cookie
FromSent OnAttachments
saltyfloridaJan 28, 2010 3:42 pm 
Marcus ClyneJan 28, 2010 4:03 pm 
merlin coreyJan 28, 2010 4:23 pm 
merlin coreyJan 28, 2010 4:25 pm 
Marcus ClyneJan 28, 2010 4:48 pm 
saltyfloridaJan 28, 2010 5:50 pm 
saltyfloridaJan 28, 2010 6:00 pm 
Piotr SikoraJan 28, 2010 6:06 pm 
Piotr SikoraJan 28, 2010 6:14 pm 
saltyfloridaJan 28, 2010 6:18 pm 
saltyfloridaJan 28, 2010 6:19 pm 
Marcus ClyneJan 28, 2010 6:49 pm 
saltyfloridaJan 28, 2010 11:04 pm 
saltyfloridaJan 28, 2010 11:13 pm 
Marcus ClyneJan 29, 2010 2:54 am 
merlin coreyJan 29, 2010 9:38 am 
Laurence RoweJan 29, 2010 11:19 am 
Marcus ClyneJan 29, 2010 3:01 pm 
Laurence RoweJan 30, 2010 10:46 am 
Marcus ClyneJan 30, 2010 4:00 pm 
saltyfloridaFeb 2, 2010 9:30 pm 
Subject:Re: Switching backends based on a cookie
From:saltyflorida (ngin@nginx.us)
Date:Jan 28, 2010 5:50:45 pm
List:ru.sysoev.nginx

Eugaia Wrote:

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

Hi,

saltyflorida wrote:

Is it possible to switch backend clusters of servers based on a cookie?

I would like to set a cookie named "env" and do something like this:

if ($http_cookie ~* "env=testing(;|$)") { proxy_pass http://backend_testing; } if ($http_cookie ~* "env=staging(;|$)") { proxy_pass http://backend_staging; } if ($http_cookie ~* "env=production(;|$)") { proxy_pass http://backend_production; }

However the "proxy_pass" directive is not

allowed inside an "if". Is there another way I can approach this?

Take a look at the map module :

http://wiki.nginx.org/NginxHttpMapModule

One possibility would be :

http {

map $cookie_env $backend {

testing http://backend_testing; staging http://backend_staging; production http://backend_production; }

server { ... proxy_pass $backend;

Marcus, thank you for your response. The map module is very useful. I implemented your suggestion and am now able to switch backend servers using the cookie.

Now I have another problem: the cache is storing pages generated by the 3 different backend clusters. Is there a way I can bypass the cache if the cookie is set to either "testing" or "staging"?

Here is my simplified config: 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 $mybackend { default http://backend_production; testing http://backend_testing; staging http://backend_staging; production http://backend_production; }

server { location / { proxy_pass $mybackend; 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 $mybackend; proxy_read_timeout 300; } } }

Thanks, Eliot

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