Nginx als Reverse Proxy für Docker VHosts

Lesezeit: 4 Minuten

Ich versuche gerade, meinen eigenen Webserver / Dienst zu bauen und wollte Dinge wie diese einrichten:

  • WordPress für den Haupt-“Blog”
  • Gitlab für meine Git-Repositories
  • Owncloud für meinen Datenspeicher

Ich habe Docker verwendet, um ein nettes kleines Gitlab zum Laufen zu bringen, das einwandfrei funktioniert und Port :81 auf meinem Webserver mit meiner Domain zuordnet.

Was mich etwas nervt, ist, dass Docker-Images immer an eine bestimmte Portnummer gebunden sind und sich daher nicht wirklich leicht merken lassen, also würde ich gerne so etwas machen:

git.mydomain.com for gitlab
mydomain.com (no subdomain) for my blog
owncloud.mydomain.com for owncloud

Soweit ich verstanden habe, brauche ich dafür einen Reverse-Proxy, für den ich mich für nginx entschieden habe. Also habe ich die Dinge so eingerichtet:

http {
include       mime.types;
default_type  application/octet-stream;

sendfile        on;

keepalive_timeout  65;

server {
    listen       80;
    server_name  mydomain.com;
    location / {
            proxy_pass http://localhost:84;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
server {
    listen 80;
    server_name git.mydomain.com;

    location / {
        proxy_pass http://localhost:81;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Auf diese Weise habe ich git.mydomain.com fehlerfrei am Laufen, aber meine WordPress zeigt mir nur eine leere Webseite. Mein DNS ist wie folgt eingerichtet:

Host   Type   MX Destination
*      A      IP
@      A      IP
www    CNAME   @

Bin ich einfach zu blöd oder was ist hier los?

  • Führen Sie jeden Dienst in einem eigenen Container aus? In welchem ​​Can-Container läuft Nginx? Denken Sie daran, dass der lokale Host innerhalb des Containers nicht mit dem lokalen Host außerhalb des Containers identisch ist. Verknüpfen Sie entweder die Container und verwenden Sie die env, um IPs zu finden, oder verwenden Sie die öffentliche IP des Hosts.

    – Usman Ismail

    9. November 2014 um 0:05 Uhr

  • Dies ist, wenn jwilder/nginx-proxy Ihre geistige Gesundheit rettet und Ihnen alles gibt, was Sie brauchen. Der Proxy-Container hört auf den Docker-Daemon und konfiguriert sich jedes Mal neu, wenn ein anderer Web-App-Container auf demselben Host gestartet wird.

    – Devvyn

    26. Mai 2015 um 19:03 Uhr

  • mögliches Duplikat von Assigning vhosts to Docker ports

    – Devvyn

    26. Mai 2015 um 19:10 Uhr

Ich weiß, dass sich Ihre Frage speziell auf Ihre Nginx-Proxy-Konfiguration bezieht, aber ich dachte, es wäre nützlich, sie Ihnen zu geben dieser Link Hier erfahren Sie, wie Sie einen Nginx-Docker-Container einrichten, der automatisch Konfigurationen für das Reverse-Proxying dieser Docker-Container bereitstellt. Mit anderen Worten, Sie führen den Reverse-Proxy und dann Ihre anderen Container aus, und der Nginx-Container leitet den Datenverkehr basierend auf dem Hostnamen an die anderen weiter.

Grundsätzlich ziehen Sie den Proxy-Container und führen ihn mit einigen Parametern aus, die in der festgelegt sind docker run Befehl, und rufen Sie dann die anderen Container auf, die Sie als Proxy verwenden möchten. Sobald Sie Docker installiert und das nginx-proxy-Image gezogen haben, die spezifischen Befehle, die ich zum Starten des Proxys verwende:

docker run -d --name="nginx-proxy" --restart="always" -p 80:80 \
-v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

Und jetzt läuft der Proxy. Sie können dies überprüfen, indem Sie einen Browser auf Ihre Adresse richten, die einen Nginx 502- oder 503-Fehler zurückgeben sollte. Sie erhalten die Fehler, weil noch nichts zuhört. Um andere Container zu starten, ist es super einfach, wie folgt:

docker run -d --name="example.com" --restart="always" \
-e "VIRTUAL_HOST=example.com" w3b1x/mywebcontainer

Dass -e "VIRTUAL_HOST=example.com" ist alles, was Sie brauchen, um Ihren Nginx-Proxy-Routing-Traffic zu dem Container zu bringen, den Sie starten.

Ich verwende diese spezielle Methode, seit ich mit Docker angefangen habe, und sie ist wirklich praktisch für genau diese Art von Situation. Der von mir verlinkte Artikel enthält Schritt-für-Schritt-Anleitungen und alle Informationen, die Sie benötigen. Wenn Sie weitere Informationen benötigen (insbesondere zur Implementierung von SSL in diesem Setup), können Sie dies überprüfen das Git-Repository für diese Software.

  • Das kann ich bestätigen. Ich benutze es seit einigen Monaten in der Produktion und es hat mir buchstäblich eine bessere Lebensqualität gegeben, da es einfach ist, im Gegensatz zur manuellen Neukonfiguration des Proxys für jede App-Bereitstellung.

    – Devvyn

    26. Mai 2015 um 19:05 Uhr


Ihre nginx-Konfiguration sieht vernünftig aus, aber Sie treffen localhost:xx, was falsch ist. Es sollte beides sein gatewayip:xx oder besser target_private_ip:80.

Eine einfache Möglichkeit, damit umzugehen, besteht darin, Ihre Container mit zu starten --link und um die ip über ein Shell-Skript zu “injizieren”: haben Sie dann die “ursprüngliche” nginx-Konfiguration mit einem Platzhalter anstelle der ip sed -i mit dem Wert aus der Umwelt.

1390500cookie-checkNginx als Reverse Proxy für Docker VHosts

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy