Zum Hauptinhalt springen

PDMC | Blog

Nginx hinter Traefik

Heute habe ich das Blog auf eine neue VM umgezogen und stand dabei vor dem Problem, dass ich statischen Content bereitstellen muss aber nur einen Traefik installiert hatte. Da Traefik aber ein reiner ReverseProxy ist, der keinen Content ausliefern kann, musste also mit nginx ein klassischer Webserver her. Im konkreten Fall habe ich mich für das offizielle Docker-Image von nginx entschieden und das dann per Docker Compose eingebunden. Das Compose-File ist recht einfach gehalten:

services:
  webserver:
    image: nginx:stable
    restart: unless-stopped
    volumes:
      - /srv/docker/data/nginx/config:/etc/nginx/templates
      - /srv/docker/data/nginx/data:/var/www
    networks:
      - frontend
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=frontend"
      - "traefik.http.routers.nginx-websecure.rule=Host(`www.pdmc.net`) || Host(`blog.pdmc.net`)"
      - "traefik.http.routers.nginx-websecure.entrypoints=websecure"
      - "traefik.http.routers.nginx-websecure.tls=true"
      - "traefik.http.routers.nginx-websecure.tls.certresolver=leresolver"

networks:
  frontend:
    external: true

Es werden zwei Volumes definiert; im ersten liegen die Configs für die virtuellen Hosts und im zweiten dann die passenden Daten dazu, sprich der Content den man ausliefern möchte. In den Labels finden sich die notwenigen Infos für Traefik, sprich für welche Hosts/Domains nginx als Backend genutzt werden soll, dass (nach außen) TLS gesprochen wird und woher die notwendigen Zertifikate zu holen sind. Es finden sich keine Ports in dem Compose-File, weil sich Traefik um die Anbindung an die Außenwelt kümmern soll.

Die Konfiguration der vHosts wird dann nicht, wie sonst unter Debian/Ubuntu üblich, unter /etc/nginx/site-available abgelegt und nach /etc/nginx/site-enabled verlinkt, sondern unter /etc/nginx/templates (bzw. /srv/docker/data/nginx/config ) abgelegt. Bei Startup des Containers werden dann alle Dateien, die auf .template enden, von /etc/nginx/templates nach /etc/nginx/conf.d kopiert. Die Templates sind ganz normale nginx-Configs:

server {
  listen 80;
  server_name blog.pdmc.net;

  location / {
    root /var/www/blog;
  }
}

Jetzt noch die passenden Daten unter /var/www/blog, was auf dem Server dann /srv/docker/data/nginx/data/blog entspricht, ablegen und fertig.