# If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the # scheme used to connect to this server map $http_x_forwarded_proto $proxy_x_forwarded_proto { default $http_x_forwarded_proto; '' $scheme; } # If we receive Upgrade, set Connection to "upgrade"; otherwise, delete any # Connection header that may have been passed to this server map $http_upgrade $proxy_connection { default upgrade; '' ''; } # HTTP 1.1 support proxy_http_version 1.1; proxy_buffering off; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $proxy_connection; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; server { listen 80 default_server; server_name _; # This is just an invalid value which will never trigger on a real hostname. error_log /proc/self/fd/2; access_log /proc/self/fd/1; return 503; } {{ range $host, $containers := groupByMulti $ "Env.VIRTUAL_HOST" "," }} upstream {{ $host }} { {{ range $index, $container := $containers }} {{ $addrLen := len $container.Addresses }} {{/* If only 1 port exposed, use that */}} {{ if eq $addrLen 1 }} {{ with $address := index $container.Addresses 0 }} # {{$container.Name}} server {{ $address.IP }}:{{ $address.Port }}; {{ end }} {{/* If more than one port exposed, use the one matching VIRTUAL_PORT env var */}} {{ else if $container.Env.VIRTUAL_PORT }} {{ range $index, $address := $container.Addresses }} {{ if eq $address.Port $container.Env.VIRTUAL_PORT }} # {{$container.Name}} server {{ $address.IP }}:{{ $address.Port }}; {{ end }} {{ end }} {{/* Else default to standard web port 80 */}} {{ else }} {{ range $index, $address := $container.Addresses }} {{ if eq $address.Port "80" }} # {{$container.Name}} server {{ $address.IP }}:{{ $address.Port }}; {{ end }} {{ end }} {{ end }} {{ end }} } server { gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name {{ $host }}; error_log /proc/self/fd/2; access_log /proc/self/fd/1; location / { proxy_pass http://{{ $host }}; } } {{ end }}