diff --git a/.gitignore b/.gitignore index 5daab4f..7378fa7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **/__pycache__/ **/.cache/ .idea/ +conf.d \ No newline at end of file diff --git a/docker-compose-separate-containers.yml b/docker-compose-separate-containers.yml deleted file mode 100644 index a4edb94..0000000 --- a/docker-compose-separate-containers.yml +++ /dev/null @@ -1,23 +0,0 @@ -version: '2' -services: - nginx: - image: nginx - container_name: nginx - ports: - - "80:80" - volumes: - - /etc/nginx/conf.d - - dockergen: - image: jwilder/docker-gen - command: -notify-sighup nginx -watch /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf - volumes_from: - - nginx - volumes: - - /var/run/docker.sock:/tmp/docker.sock:ro - - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl - - whoami: - image: jwilder/whoami - environment: - - VIRTUAL_HOST=whoami.local diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..6ea0632 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,6 @@ +version: '2' +services: + nginx: + build: . + volumes: + - ./conf.d:/etc/nginx/conf.d diff --git a/docker-compose.yml b/docker-compose.yml index b76f0c0..89e26f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,13 +2,16 @@ version: '2' services: nginx-proxy: image: jwilder/nginx-proxy + build: . container_name: nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro + - ./conf.d:/etc/nginx/conf.d whoami: image: jwilder/whoami environment: - VIRTUAL_HOST=whoami.local + - VIRTUAL_PORT=8000 diff --git a/nginx.tmpl b/nginx.tmpl index a9fc479..858d044 100644 --- a/nginx.tmpl +++ b/nginx.tmpl @@ -1,27 +1,5 @@ {{ $CurrentContainer := where $ "ID" .Docker.CurrentContainerID | first }} -{{ 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 if .Network }} - # {{ .Container.Name }} - server {{ .Network.IP }}:{{ .Address.Port }}; - {{ end }} - {{ else if .Network }} - # {{ .Container.Name }} - {{ if .Network.IP }} - server {{ .Network.IP }} down; - {{ else }} - server 127.0.0.1 down; - {{ end }} - {{ 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 { @@ -119,37 +97,7 @@ server { {{ $host := trim $host }} {{ $is_regexp := hasPrefix "~" $host }} -{{ $upstream_name := when $is_regexp (sha1 $host) $host }} -# {{ $host }} -upstream {{ $upstream_name }} { - -{{ range $container := $containers }} - {{ $addrLen := len $container.Addresses }} - - {{ range $knownNetwork := $CurrentContainer.Networks }} - {{ range $containerNetwork := $container.Networks }} - {{ if (and (ne $containerNetwork.Name "ingress") (or (eq $knownNetwork.Name $containerNetwork.Name) (eq $knownNetwork.Name "host"))) }} - ## Can be connected with "{{ $containerNetwork.Name }}" network - - {{/* If only 1 port exposed, use that */}} - {{ if eq $addrLen 1 }} - {{ $address := index $container.Addresses 0 }} - {{ template "upstream" (dict "Container" $container "Address" $address "Network" $containerNetwork) }} - {{/* If more than one port exposed, use the one matching VIRTUAL_PORT env var, falling back to standard web port 80 */}} - {{ else }} - {{ $port := coalesce $container.Env.VIRTUAL_PORT "80" }} - {{ $address := where $container.Addresses "Port" $port | first }} - {{ template "upstream" (dict "Container" $container "Address" $address "Network" $containerNetwork) }} - {{ end }} - {{ else }} - # Cannot connect to network of this container - server 127.0.0.1 down; - {{ end }} - {{ end }} - {{ end }} -{{ end }} -} {{ $default_host := or ($.Env.DEFAULT_HOST) "" }} {{ $default_server := index (dict $host "" $default_host "default_server") $host }} @@ -157,6 +105,8 @@ upstream {{ $upstream_name }} { {{/* Get the VIRTUAL_PROTO defined by containers w/ the same vhost, falling back to "http" */}} {{ $proto := trim (or (first (groupByKeys $containers "Env.VIRTUAL_PROTO")) "http") }} +{{ $container_pass := (printf "%v:%v" (first (groupByKeys $containers "Name")) (trim (or (first (groupByKeys $containers "Env.VIRTUAL_PORT")) "80"))) }} + {{/* Get the NETWORK_ACCESS defined by containers w/ the same vhost, falling back to "external" */}} {{ $network_tag := or (first (groupByKeys $containers "Env.NETWORK_ACCESS")) "external" }} @@ -273,15 +223,16 @@ server { {{ end }} location / { + set $target {{ trim $container_pass }}; {{ if eq $proto "uwsgi" }} include uwsgi_params; - uwsgi_pass {{ trim $proto }}://{{ trim $upstream_name }}; + uwsgi_pass {{ trim $proto }}://$target; {{ else if eq $proto "fastcgi" }} root {{ trim $vhost_root }}; include fastcgi.conf; - fastcgi_pass {{ trim $upstream_name }}; + fastcgi_pass $target; {{ else }} - proxy_pass {{ trim $proto }}://{{ trim $upstream_name }}; + proxy_pass {{ trim $proto }}://$target; {{ end }} {{ if (exists (printf "/etc/nginx/htpasswd/%s" $host)) }} @@ -320,15 +271,16 @@ server { {{ end }} location / { + set $target {{ trim $container_pass }}; {{ if eq $proto "uwsgi" }} include uwsgi_params; - uwsgi_pass {{ trim $proto }}://{{ trim $upstream_name }}; + uwsgi_pass {{ trim $proto }}://$target; {{ else if eq $proto "fastcgi" }} root {{ trim $vhost_root }}; include fastcgi.conf; - fastcgi_pass {{ trim $upstream_name }}; + fastcgi_pass $target; {{ else }} - proxy_pass {{ trim $proto }}://{{ trim $upstream_name }}; + proxy_pass {{ trim $proto }}://$target; {{ end }} {{ if (exists (printf "/etc/nginx/htpasswd/%s" $host)) }} auth_basic "Restricted {{ $host }}";