title: Using nginx map directive to dynamically set proxy upstream
body: <p>I'm trying to make my Nginx a bit more dry, as it's acting as a reverse proxy for nearly 20 servers.  Here's what I'm trying to do, all the hostnames and stuff are changed/examples:</p>
  
  <pre><code>map $http_host $backend {
      baz.mydomain.com       hostname1:8080;
      foo.mydomain.com       192.168.1.10:8081;
      bar.mydomain.com       hostname2:1234;
      ham.mydomain.com       hostname2:5678;
  }
  
  server {
      listen                      443 ssl http2;
      server_name                 .mydomain.com;
  
      ssl_certificate             /usr/share/nginx/certs/mydomain.com.pem;
      ssl_certificate_key         /usr/share/nginx/certs/mydomain.com.key;
  
      location / {
          proxy_redirect          http:// https://;
          proxy_pass              http://$backend;
      }
  }
  </code></pre>
  
  <p>The problem is that no matter what, this will always give a bad gateway error.  I've tried a few variations and moving things around, with and without the wildcard server_name, with $host instead of $http_host but so far I can't get it working.  Am I even going about this the right way?  I'd really prefer not to have almost 20 separate virtual server entries in my config.</p>
  
  <p>There isn't a whole lot of help in the nginx documentation about using map like this, and not a lot online except for one really old post that briefly mentioned something similar here: <a href="https://serverfault.com/questions/342309/how-to-write-a-dry-modular-nginx-conf-reverse-proxy-with-named-locations">https://serverfault.com/questions/342309/how-to-write-a-dry-modular-nginx-conf-reverse-proxy-with-named-locations</a></p>