Proxy (nginx) zeigt einen fehlerhaften Gateway-Fehler an

18

Ich habe einen Dienst (Docker-Registrierung), der ausgeführt port 5000wird. Ich habe nginx installiert, um die http-Anforderung von 8080nach umzuleiten 5000. Wenn ich eine Locke mache, localhost:5000funktioniert es, aber wenn ich eine Locke mache, localhost:8080bekomme ich einen Bad Gateway- Fehler.

Nginx-Konfigurationsdatei:

upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name registry.mydomain.com;

 proxy_set_header Host       $http_host; 
 proxy_set_header X-Real-IP  $remote_addr; 
 client_max_body_size 0; 
 chunked_transfer_encoding on;

 location / {

     proxy_pass http://docker-registry;
 }
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
 location /v1/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }

}

In /var/log/nginx/error.logich habe:

[crit] 15595#0: *1 connect() to [::1]:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain.com, request: "GET / HTTP/1.1", upstream: "http://[::1]:5000/", host: "localhost:8080"

Irgendeine Idee?

hellb0y77
quelle
In meinem Fall starb mein Dienst, den ich vertrat (und ich merkte es nicht), während ich ihn benutzte. In einer Sekunde habe ich darauf zugegriffen, in der nächsten Sekunde bekam ich ein schlechtes Gateway. Ich musste den Dienst neu starten.
Michael Plautz

Antworten:

57

Ich gehe davon aus, dass es sich um eine Linux-Box handelt, daher verhindert SELinux höchstwahrscheinlich die Verbindung, da es keine Richtlinie gibt, die die Verbindung zulässt.

Du solltest einfach laufen können

# setsebool -P httpd_can_network_connect true

und starten Sie dann nginx neu.

Labyrinth
quelle
Selinux ist deaktiviert, auch die Service-Firewall
hellb0y77
2
Sie haben gerade mein Problem behoben , auch wenn Sie das Problem mit hellb0y77 nicht behoben haben. SE_LINUX schlägt wieder zu!
Wesley Burr
1
Das hat auch bei mir funktioniert. Hat jemand weitere Informationen darüber, was es tatsächlich tut? Ich hasse es nicht zu wissen!
Martinedwards
Kann ich fragen, welche Sicherheitsprobleme hierdurch entstehen könnten? Ich führe im Allgemeinen eine Reihe von iptables-Regeln aus, die lokalen Datenverkehr zulassen. Ich frage mich, was dies bewirkt.
Edencorbin
1
@edencorbin ermöglicht es httpd-Modulen, sich mit dem Netzwerk zu verbinden.
Warren
5

Anhand der Fehlermeldung frage ich mich, ob localhost: 5000 als IPv6-Adresse aufgelöst wird, was Sie möglicherweise nicht möchten. Sie könnten versuchen, dies in 127.0.0.1:5000 zu ändern

BEARBEITEN : Ist es möglich, dass in Ihrer proxy_pass-Zeile ein Teil der URL fehlt? Versuchen Sie, $ request_uri hinzuzufügen, damit es so aussieht:

proxy_pass http://docker-registry/$request_uri;

oder wahrscheinlich:

proxy_pass http://docker-registry$request_uri;

Ich bin mir nicht sicher, welches am richtigsten ist.

Noch etwas zu beachten. Ihre Konfiguration zeigt an:

server_name registry.mydomain.com;

Also, localhost: 8080 kann möglicherweise nicht übereinstimmen. Zum Testen können Sie Folgendes ändern:

server_name registry.mydomain.com localhost;

Dann würde der localhost: 8080 genauso wie Ihre Domain passen. Ich nehme an, registry.mydomain.com ist nur ein Beispiel und Sie würden dort Ihren echten Server-FQDN eintragen.

Gregor
quelle
Nicht funktionieren, setzen 127.0.0.1:5000und ich habe versucht, nur mit server_name localhostund server_name registry.mydomain.com(versuchen von einem anderen Server im gleichen LAN mit Hostnamen registry.mydomain.comin / etc / hosts), und beides, aber nichts ... der gleiche Fehler
hellb0y77
Whit registry.mydomain.com [crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain,com request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080", mit localhost:[crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080"
hellb0y77