Heim  >  Artikel  >  Backend-Entwicklung  >  Erstellen Sie einen Nginx-Reverse-Proxy mit Docker

Erstellen Sie einen Nginx-Reverse-Proxy mit Docker

大家讲道理
大家讲道理Original
2017-05-28 09:32:542410Durchsuche

Ein Reverse-Proxy-Server ist ein Server, der sich normalerweise vor dem Webserver befindet und Anhangsfunktionen bereitstellen kann, über die der Webserver selbst nicht verfügt.

Zum Beispiel kann ein Reverse-Proxy SSL-Terminierung, Lastausgleich, Anforderungs-Routing, Caching, Komprimierung und sogar A/B bereitstellen Testen.

Beim Ausführen von Webdiensten mit Docker-Containern kann die Ausführung eines Reverse-Proxys die Bereitstellung vereinfachen.

**

Warum Reverse-Proxy für Docker verwenden?

**
Docker-Containern werden zufällige IPs und Ports zugewiesen, was das Auffinden dieser Container aus Client-Perspektive schwierig macht. Standardmäßig sind diese IPs und Ports privat und können von außen nicht aufgerufen werden, es sei denn, sie sind an den Host gebunden.

Durch die Bindung des Containers an den Host wird verhindert, dass Container auf demselben Port ausgeführt werden. Beispielsweise kann jeweils nur ein Docker an Port 80 gebunden sein. Darüber hinaus erschwert dies die Bereitstellung neuer Containerversionen. Denn die neue Version kann den Dienst erst starten, nachdem die alte Version den Dienst beendet hat.

Reverse Proxy kann die oben genannten Probleme lösen und gleichzeitig die Zuverlässigkeit verbessern, indem es keine Ausfallzeiten bietet.

**

Reverse-Proxy-Konfiguration generieren

**

Legen Sie den Reverse-Proxy fest, wenn der Container gestartet und gestoppt wird. Konfiguration ist eine verantwortungsvolle Angelegenheit. Oft müssen Konfigurationen manuell aktualisiert werden, was viel Zeit in Anspruch nimmt und fehleranfällig ist.

Glücklicherweise bietet Docker eine Remote-Aufruf-API , die leicht beobachtet werden kann und auf die IP und den Port des Containers sowie bereits konfigurierte Metadaten zugreift. Darüber hinaus bietet Docker auch eine Echtzeit-EreignisAPI, mit der Benachrichtigungen gesendet werden können, wenn der Container startet und stoppt. Diese APIs können verwendet werden, um Reverse-Proxy-Konfigurationen automatisch zu generieren.

docker-gen ist eine kleine Anwendung. Es verwendet die Docker-API, um die Metadaten des Containers in die Vorlage zu importieren. Nachdem Sie die Vorlage generiert haben, können Sie diese zum Neustarten des Dienstes verwenden.

Mit Docker-Gen können Sie automatisch eine Nginx-Konfiguration generieren und Nginx neu laden, wenn sich die Konfiguration ändert. Die gleiche Methode kann für die Docker-Protokollverwaltung verwendet werden.

**

Nginx Reverse Proxy für Docker

**
Das folgende Nginx-Vorlagenbeispiel kann zum Generieren von Docker-Containern Reverse Proxy verwendet werden Konfiguration. Diese Vorlage verwendet golang. Die Groupby-Vorlage -Funktion wird verwendet, um den laufenden Container in Gruppen zu gruppieren. Die Gruppierung basiert auf der VIRTUAL_HOST-Umgebungsvariable . Diese Methode vereinfacht das Durchlaufen von Containern, um ein Backend mit Lastausgleich zu generieren, und unterstützt außerdem die Bereitstellung ohne Ausfallzeiten.

{{

Bereich

Container := groupBy

„Env.VIRTUAL_HOST“ }} Upstream {{

Host }} {

{{ Bereich

Wert :=

Container }} {{ mit

address := index

value.Addresses 0 }} Server {{

address.IP }}:{{ $address.Port }}; {{
end }} {{ end }}

}

server {

#ssl_cert
ificate /etc/nginx/certs/demo.pem; #ssl_certificate_key
/etc/nginx/certs/demo.key;

}
gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}
{{ end }}


Diese Vorlage verwendet den folgenden Befehl Führen Sie Folgendes aus:

docker-gen -only-exposed -watch -notify „/etc/init.d/nginx reload“ templates/nginx.tmpl /etc/nginx/sites-enabled/default


Das Folgende ist eine Vorlage, die mit zwei Containern demo1 und demo2 konfiguriert ist
-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.

upstream demo1.localhost {

Server 172.17.0.4:5000;

Server 172.17.0.3:5000;
}

server {

#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;



}

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}
upstream demo2.localhost {

Server 172.17.0.5:5000;

}


server {
#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;


}

**
gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}

Probieren Sie es aus

**Sie können den von mir erstellten Build ausprobieren.

https://

index.docker.io/u/jwilder/nginx-proxy/

Führen Sie den Nginx-Proxy-Container aus:



docker run -e VIRTUAL_HOST=foo.bar.com -t …

Wenn Sie HTTPS verwenden und andere Container ausführen möchten, können Sie einen Blick auf
werfen Weitere Informationen finden Sie im Projekt git

auf dem Hub.

**

Fazit

** Das Generieren der Nginx-Reverse-Proxy-Konfiguration für den Docker-Container kann mithilfe der Docker-API automatisch erfolgen. Dieser Ansatz vereinfacht die Bereitstellung und verbessert die Verfügbarkeit.

Diese Lösung ist sehr praktisch für Container, die auf einem einzelnen Host ausgeführt werden. Bietet die Erkennung von Konfigurationsabhängigkeitsdiensten für verteilte Hosts. Sie können einen Blick auf die Entdeckungen des Docker-Dienstes werfen und eine Lösung finden.


Übersetzung. Siehe den Originaltext: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

Ein Reverse-Proxy-Server befindet sich normalerweise vor dem Webserver Server, der Anhangsfunktionen bereitstellen kann, über die der Webserver selbst nicht verfügt.

Ein Reverse-Proxy kann beispielsweise SSL-Terminierung, Lastausgleich, Anforderungsrouting, Caching, Komprimierung und sogar A/B-Tests bereitstellen.

Beim Ausführen von Webdiensten mit Docker-Containern kann die Ausführung eines Reverse-Proxys die Bereitstellung vereinfachen.

**

Warum Reverse-Proxy für Docker verwenden?

** Docker-Containern werden zufällige IPs und Ports zugewiesen, was das Auffinden dieser Container aus Client-Perspektive schwierig macht. Standardmäßig sind diese IPs und Ports privat und können von außen nicht aufgerufen werden, es sei denn, sie sind an den Host gebunden.

Durch die Bindung des Containers an den Host wird verhindert, dass Container auf demselben Port ausgeführt werden. Beispielsweise kann jeweils nur ein Docker an Port 80 gebunden sein. Darüber hinaus erschwert dies die Bereitstellung neuer Containerversionen. Denn die neue Version kann den Dienst erst starten, nachdem die alte Version den Dienst beendet hat.


Reverse Proxy kann die oben genannten Probleme lösen und gleichzeitig die Zuverlässigkeit verbessern, indem es keine Ausfallzeiten bietet.

**

Reverse-Proxy-Konfiguration generieren

**Legen Sie den Reverse-Proxy fest, wenn der Container gestartet und gestoppt wird. Konfiguration ist eine verantwortungsvolle Angelegenheit. Oft müssen Konfigurationen manuell aktualisiert werden, was viel Zeit in Anspruch nimmt und fehleranfällig ist.

Glücklicherweise bietet Docker eine Remote-Aufruf-API, die die IP und den Port des Containers sowie bereits konfigurierte Metadaten einfach beobachten und darauf zugreifen kann. Darüber hinaus bietet Docker auch eine Echtzeit-Ereignis-API, mit der Benachrichtigungen gesendet werden können, wenn der Container startet und stoppt. Diese APIs können verwendet werden, um Reverse-Proxy-Konfigurationen automatisch zu generieren.

docker-gen ist eine kleine Anwendung. Es verwendet die Docker-API, um die Metadaten des Containers in die Vorlage zu importieren. Nachdem Sie die Vorlage generiert haben, können Sie diese zum Neustarten des Dienstes verwenden.

Mit Docker-Gen können Sie automatisch eine Nginx-Konfiguration generieren und Nginx neu laden, wenn sich die Konfiguration ändert. Die gleiche Methode kann für die Docker-Protokollverwaltung verwendet werden.

**

Nginx Reverse Proxy für Docker

** Das folgende Nginx-Vorlagenbeispiel kann zum Generieren von Docker-Containern Reverse Proxy verwendet werden Konfiguration. Diese Vorlage verwendet Golang. Die Groupby-Vorlagenfunktion wird zum Gruppieren laufender Container verwendet. Die Gruppierung basiert auf der Umgebungsvariablen VIRTUAL_HOST. Diese Methode vereinfacht das Durchlaufen von Containern, um ein Backend mit Lastausgleich zu generieren, und unterstützt außerdem die Bereitstellung ohne Ausfallzeiten.

{{ range


container := groupBy

„Env.VIRTUAL_HOST“ }} upstream {{

Host }} {

{{ Bereich

Wert := Container }} 
 {{ mit

Adresse := Index value.Addresses 0 }}
server {{

address.IP }}:{{ $address .Port }};
{{ end }}
{{ end }}

}

server {
#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name {{ $host }};

location / {
    proxy_pass http://{{ $host }};
    include /etc/nginx/proxy_params;
}
}

{{ end }}

Diese Vorlage wird mit dem folgenden Befehl ausgeführt:

docker - gen -only-exposed -watch -notify „/etc/init.d/nginx reload“ templates/nginx.tmpl /etc/nginx/sites-enabled/default

-only-exposed - 仅使用暴露出端口的容器.
-watch - 运行后,观察容器的事件,并重新生成模板.
-notify "/etc/init.d/nginx reload" - 重新加载nginx.
templates/nginx.tmpl - nginx模板.
/etc/nginx/sites-enabled/default - 目标文件.
Im Folgenden sind zwei Konfigurationen aufgeführt Vorlagen für Container demo1 und demo2

upstream demo1.localhost {

Server 172.17.0.4:5000;
Server 172.17.0.3:5000;
}

server {

#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;

}
gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo1.localhost;

location / {
    proxy_pass http://demo.localhost;
    include /etc/nginx/proxy_params;
}

upstream demo2.localhost {

Server 172.17.0.5:5000;

}

server {

#ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key;



}

gzip_types text/plain text/css application/json application/x-javascript
           text/xml application/xml application/xml+rss text/javascript;

server_name demo2.localhost;

location / {
    proxy_pass http://demo2.localhost;
    include /etc/nginx/proxy_params;
}
**

Probieren Sie es aus

**

Sie können den von mir erstellten Build ausprobieren. https://index.docker.io/u/jwilder/nginx-proxy/

Führen Sie den Nginx-Proxy-Container aus:



docker run -e VIRTUAL_HOST=foo.bar.com -t …
Wenn Sie HTTPS verwenden und andere Container ausführen möchten, können Sie sich das Projekt auf Github ansehen, um weitere Informationen zu erhalten.

**

Fazit

** Das Generieren der Nginx-Reverse-Proxy-Konfiguration für den Docker-Container kann mithilfe der Docker-API automatisch erfolgen. Dieser Ansatz vereinfacht die Bereitstellung und verbessert die Verfügbarkeit.

Diese Lösung ist sehr praktisch für Container, die auf einem einzelnen Host ausgeführt werden. Bietet die Erkennung von Konfigurationsabhängigkeitsdiensten für verteilte Hosts. Sie können einen Blick auf die Entdeckungen des Docker-Dienstes werfen und eine Lösung finden.

Das obige ist der detaillierte Inhalt vonErstellen Sie einen Nginx-Reverse-Proxy mit Docker. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Docker Nginx Reverse ProxyNächster Artikel:Docker Nginx Reverse Proxy