diff --git a/nginx.tmpl b/nginx.tmpl index 70c8ba0..92a203c 100644 --- a/nginx.tmpl +++ b/nginx.tmpl @@ -1,3 +1,20 @@ +{{ define "upstream" }} + {{ if .Address }} + {{/* If we got the containers from swarm and this container's port is published to host, use host IP:PORT */}} + {{ if and .Container.Node.ID .Address.HostPort }} + # {{ .Container.Node.Name }}/{{ .Container.Name }} + server {{ .Container.Node.Address.IP }}:{{ .Address.HostPort }}; + {{/* If there is no swarm node or the port is not published on host, use container's IP:PORT */}} + {{ else }} + # {{ .Container.Name }} + server {{ .Address.IP }}:{{ .Address.Port }}; + {{ end }} + {{ else }} + # {{ .Container.Name }} + server {{ .Container.IP }} down; + {{ end }} +{{ end }} + # 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 { @@ -44,28 +61,13 @@ upstream {{ $host }} { {{ $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 $address := .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 */}} + {{ $address := index $container.Addresses 0 }} + {{ template "upstream" (dict "Container" $container "Address" $address) }} + {{/* If more than one port exposed, use the one matching VIRTUAL_PORT env var, falling back to standard web port 80 */}} {{ else }} - {{ $address := where $container.Addresses "Port" "80" | first }} - {{ if $address }} - # {{$container.Name}} - server {{ $address.IP }}:80; - {{ else }} - # {{$container.Name}} - server {{ $container.IP }} down; - {{ end }} + {{ $port := coalesce $container.Env.VIRTUAL_PORT "80" }} + {{ $address := where $container.Addresses "Port" $port | first }} + {{ template "upstream" (dict "Container" $container "Address" $address) }} {{ end }} {{ end }} }