Make nginx to pass hostname of the upstream when reverseproxying
I'm running several docker containers with hostnames
web1.local web2.local web3.local
Routing to these done based on hostname by nginx. I have a proxy on a different machine connected to the internet which i define as upstream
    upstream main {
      server web1.local:80;
      server web2.local:80;
      server web3.local:80;
    }
And actual virtual host description.
    server {
      listen 80;
      server_name example.com;
      location / {
        proxy_pass http://main;
      }
    }
Now, because containers receive hostname "main" instead of "web1.local", they do not respond properly to the request.
How can i tell nginx to use the name of the upstream server instead of the name of the upstream group of servers when submitting a proxy request?
You can do this via proxysetheader
For more details look here: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header or see an example use-case here: https://stackoverflow.com/questions/12847771/configure-nginx-with-proxy-pass
I've included the dynamic approach to your configuration posted above
server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}
Here's an example with a static hostname
server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            www.example.com;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}