nginx docker-container: 502 bad gateway Antwort
Habe ich einen Dienst hören auf port 8080. Dieser ist nicht auf einen container.
Dann habe ich einen nginx-container mit Hilfe oficial Bild:
docker run --name nginx -d -v /root/nginx/conf:/etc/nginx/conf.d -p 443:443 -p 80:80 nginx
Immerhin:
# netstat -tupln | grep 443
tcp6 0 0 :::443 :::* LISTEN 3482/docker-proxy
# netstat -tupln | grep 80
tcp6 0 0 :::80 :::* LISTEN 3489/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 1009/java
Nginx-Konfiguration ist:
upstream eighty {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name eighty.domain.com;
location /{
proxy_pass http://eighty;
}
}
Habe ich überprüft, ich bin in der Lage, eine Verbindung mit diesem server mit # curl http://127.0.0.1:8080
<html><head><meta http-equiv='refresh'
content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body
style='background-color:white; color:white;'>
...
Scheint es gut läuft, aber wenn ich versuche den Zugriff über den browser, nginx erzählt, bt 502 bad gateway Antwort.
Ich bin herauszufinden, kann es ein problem im Zusammenhang mit der Sichtbarkeit zwischen einem öffnen durch eine nicht-Container-Prozess und einem container. Kann ich den container stärket Verbindung zu einem port offen ist, von anderen nicht-container-Prozess?
BEARBEITEN
Logs, wo upstream { server 127.0.0.1:8080; }
:
2016/07/13 09:06:53 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 62.57.217.25, server: eighty.domain.com, request: "GET /HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "eighty.domain.com"
62.57.217.25 - - [13/Jul/2016:09:06:53 +0000] "GET /HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-"
Logs, wo upstream { server 0.0.0.0:8080; }
:
62.57.217.25 - - [13/Jul/2016:09:00:30 +0000] "GET /HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" 2016/07/13 09:00:30 [error] 5#5: *1 connect() failed (111: Connection refused) while connecting to upstream, client:
62.57.217.25, server: eighty.domain.com, request: "GET /HTTP/1.1", upstream: "http://0.0.0.0:8080/", host: "eighty.domain.com" 2016/07/13 09:00:32 [error] 5#5: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 62.57.217.25, server: eighty.domain.com, request: "GET /HTTP/1.1", upstream: "http://0.0.0.0:8080/", host: "eighty.domain.com"
62.57.217.25 - - [13/Jul/2016:09:00:32 +0000] "GET /HTTP/1.1" 502 173 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0" "-"
Irgendwelche Ideen?
- Nur eine schnelle Vermutung, könnte es sein, aufgrund der server-Adresse? Können Sie versuchen und ändern von 127.0.0.1 auf 0.0.0.0? Wenn es nicht der Fall ist, dann einige andere applicative Fehler Auftritt, überprüfen Sie die Protokolle oder postet Sie und ich werde versuchen zu sehen, was Los ist, fügen Sie auch den port (8080) zu
http://eighty
amproxy_pass
Linie. - Ich habe gerade Hinzugefügt haben anmeldet jetzt nach rechts.
- Haben Sie versucht, die änderung der
proxy_pass
wie gut? - Ja, ich habe
proxy_pass
zuhttp://0.0.0.0:8080
. Das gleiche problem... - Ich sehe, die logs zeigen Sie IPv6 verwenden, können Sie versuchen, und ändern Sie es auf IPv4?
- Standardmäßig mit IPv6. Ich habe absolut keine Ahnung, wie es zu ändern. Was muss ich ändern? Andockfenster Verhalten oder OS Verhalten? Allerdings habe ich durchgeführt, ein
curl http:127.0.0.1:8080
und es antwortet mir auch... - Lassen Sie uns weiter, diese Diskussion im chat.
- Für mich ist das Update wurde auf add a trailing slash an die proxy_pass Direktive, nach stackoverflow.com/a/31357655
- waren Sie mit docker, die auf linux oder windows?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem
Localhost ist ein bisschen schwierig, wenn es um Container. Innerhalb eines docker-container, localhost Punkte auf der container selbst.
Dies bedeutet, mit einem vorgeschalteten so:
oder
sagen Sie nginx übergeben Ihre Anfrage an den lokalen host.
Aber im Kontext eines docker-container "localhost" (und die entsprechenden ip-Adressen) auf den container selbst:
durch die Auseinandersetzung 127.0.0.1, werden Sie nie erreichen Sie Ihre host-Maschine, wenn Ihr container nicht auf dem host-Netzwerk.
Lösungen
Host Networking
Können Sie wählen, ob der nginx auf dem gleichen Netzwerk wie Ihr Gastgeber:
Beachten Sie, dass Sie nicht bereitstellen müssen keine ports in diesem Fall.
Diese funktioniert aber verlieren Sie den nutzen von docker Vernetzung. Wenn Sie mehrere Container, sollte die Kommunikation durch das docker Netzwerk ist, kann dieser Ansatz zu einem problem werden. Wenn Sie wollen einfach nur zum bereitstellen von nginx mit docker und nicht möchten, verwenden Sie erweiterte Andockfenster-Netzwerk-Funktionen, ist dieser Ansatz in Ordnung.
Zugriff auf die hosts remote-IP-Adresse
Andere Herangehensweise ist, um eine Neukonfiguration des nginx upstream-Richtlinie, um direkt eine Verbindung zu Ihrem host-Maschine durch hinzufügen von remote-IP-Adresse:
Container wird nun über das Netzwerk-stack und lösen Ihre Gastgeber richtig:
Können Sie auch mit Ihrem DNS-Namen, wenn Sie eine haben. Stellen Sie sicher, dass docker weiß über Ihre DNS-server.
Mir geholfen, diese Linie des Codes
proxy_set_header Host $http_host;
nginx.sh
nginx.conf
Es funktioniert für mich
Was Sie tun können, ist zu konfigurieren
proxy_pass
dass auscontainer
Perspektive die Adresse wird auf Ihre realen host.Bekommen
host
Adresse von container-Perspektive, die Sie tun können wie folgt unter Windows mit docker18.03
(oder Aktueller):Ausführen von bash auf die Behälter von der host, auf dem Bild-name
nginx
(funktioniert aufAlpine Linux distribution
):Führen Sie dann in container
192.168.65.2
ist die IP des Hosts nicht die bridge-IP wie inspinus
akzeptierte Antwort.Ich bin hier host.Andockfenster.interne:
Dann können Sie ändern
nginx
config:proxy_pass http://192.168.65.2:{your_app_port};
und es sollte funktionieren.
Erinnern, um die gleichen
port
als Ihre lokale Anwendung läuft mit.bin/ash
gibt Sie, Sie können darüber Lesen Sie zum Beispiel hier: unix.stackexchange.com/questions/44912/... Dies ist kein Tippfehlerbash
odersh
.Hatte ich dieses Problem und es stellte sich heraus, dass ein Problem mit dem docker-container nicht starten, da ein Problem mit Berechtigungen.
In meinem Fall läuft
zeigte, dass der container nicht angefangen hatte und beendet mit dem status 1. Stellt sich heraus, die Berechtigungen verloren gegangen bei der Migration auf eine neue Maschine. Anpassen der Berechtigungen zu einer Mitarbeiter-Benutzer auf das übergeordnete Verzeichnis, fixed das problem für mich und ich war dann in der Lage zu starten docker-service, wo, wie zuvor, ich war immer