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;
}
}