Serwer proxy (nginx) pokazuje błąd Bad gateway

18

Mam usługę (rejestr dokera), która działa port 5000, zainstalowałem nginx, aby przekierować żądanie HTTP od 8080do 5000. Jeśli zrobię zwijanie, localhost:5000to zadziała, ale kiedy zrobię zwijanie localhost:8080, pojawia się błąd Bad gateway .

Plik konfiguracyjny nginx:

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;
 }

}

W /var/log/nginx/error.logmam:

[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"

Dowolny pomysł?

hellb0y77
źródło
W moim przypadku moja służba, którą zastępowałem, umarła (i nie zdawałem sobie z tego sprawy) pośrodku mnie, korzystając z niej. W jednej chwili miałem do niego dostęp, w następnej dostałem złą bramę. Musiałem ponownie uruchomić usługę.
Michael Plautz

Odpowiedzi:

57

Zakładam, że jest to Linux, więc najprawdopodobniej SELinux uniemożliwia połączenie, ponieważ nie ma polityki zezwalającej na połączenie.

Powinieneś być w stanie po prostu biec

# setsebool -P httpd_can_network_connect true

a następnie uruchom ponownie nginx.

Królikarnia
źródło
Selinux jest wyłączony, również usługa firewalld
hellb0y77
2
Właśnie rozwiązałeś mój problem, nawet jeśli nie naprawiłeś hellb0y77. SE_LINUX uderza ponownie!
Wesley Burr
1
To też działało dla mnie. Czy ktoś ma jakieś dodatkowe informacje na temat tego, co faktycznie robi? Nienawidzę nie wiedzieć!
martinedwards
Głosowałem i pracowałem nad centOs 7, czy mogę zapytać, jakie problemy bezpieczeństwa mogą się otworzyć. Generalnie uruchamiam zestaw reguł iptables, które zezwalają na ruch lokalny. Zastanawiasz się, co to powoduje.
edencorbin,
1
@edencorbin pozwala modułom httpd na łączenie się z siecią.
Warren
5

Na podstawie komunikatu o błędzie zastanawiam się, czy localhost: 5000 jest rozpoznawany jako adres IPv6, czego możesz nie chcieć. Możesz spróbować zmienić to na 127.0.0.1:5000

EDYCJA: W linii proxy_pass możliwe, że brakuje części URL? Spróbuj dodać $ request_uri, aby mogło to być:

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

lub prawdopodobnie:

proxy_pass http://docker-registry$request_uri;

Nie jestem pewien, który z nich jest najbardziej poprawny.

Kolejna rzecz do rozważenia. Twoja konfiguracja wskazuje:

server_name registry.mydomain.com;

Zatem localhost: 8080 może nie być dopasowany. Do testowania możesz zmienić to na:

server_name registry.mydomain.com localhost;

Wtedy dopasowany byłby localhost: 8080, podobnie jak twoja domena. Zakładam, że register.mydomain.com jest tylko przykładem i umieściłbyś tam swoją prawdziwą nazwę FQDN serwera.

Gregor
źródło
Nie działa, ustaw 127.0.0.1:5000i próbowałem tylko z ( server_name localhosti server_name registry.mydomain.compróbuję z innego serwera w tej samej sieci z nazwą hosta registry.mydomain.comw / etc / hosts), i oba, ale nic ... ten sam błąd
hellb0y77 18.04.15
Whit [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"[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"
register.mydomain.com