0
votes

I'm trying to manage a deployment to servers running behind an nginx plus server configured as a load balancer. The app servers are sent traffic from nginx using the proxy_pass directive, and what I'd like to do is to direct traffic to one upstream by default, but a different one for testing as we deploy to spare instances; I'm trying to select this by having developers set a header in their browser, which nginx then looks for and sets a variable for the relevant proxy.

It seems all to be sensible, but it simply doesn't work - I'm not sure if I misunderstand how it works, but it does seem odd.

The upstreams are configured as

upstream site-cluster {
    zone site 64k;
    least_conn;

    server 10.0.6.100:80 route=a slow_start=30s;
    server 10.0.7.100:80 route=b slow_start=30s;

    sticky route $route_cookie $route_uri;
}

upstream site-cluster2 {
    zone site 64k;
    least_conn;

    server 10.0.6.30:80 route=a slow_start=30s;
    server 10.0.7.187:80 route=b slow_start=30s;

    sticky route $route_cookie $route_uri;
}

And then this code is in the location / block.

 map $http_x_newsite $proxyurl {
    default http://site-cluster;
    "true" http://site-cluster2;
 }

 proxy_pass $proxyurl;

What happens is it's always the default servers which get sent the traffic, irrespective of whether I set the header or not.

Any ideas?

1

1 Answers

0
votes

map directive should be in http context not location: Syntax: map string $variable { ... } Default: — Context: http

The rest looks sensible, works for me.