Nginx-Reverseproxy zum HTTPS-Upstream erhält 502 Bad Gateway?

Nginx-Reverseproxy zum HTTPS-Upstream erhält 502 Bad Gateway?

Mein Ziel ist es, Jasmine-Tests (ein JavaScript-BDD-Testframework) zu schreiben, die eine von einem separaten Team erstellte Back-End-API testen.

Ich habe einen Jasmine-Server, der auf Port 9000 läuft. Dieser Code gibt AJAX-Anfragen mit einem relativen Pfad aus, der mit /web/ beginnt. Ich möchte, dass diese Anfragen an das Backend weitergeleitet werden.

Bisher habe ich einen Reverse-Proxy zu einem Upstream-Block wie folgt:

upstream backend {
  server api-dev.example.com;
}

server {
  ...

  location / {
    proxy_pass http://localhost:9000;
    ...
  }

  location /web/ {
    proxy_pass https://backend/web/;
    ...
  }
}

Der Verkehr zu '/' funktioniert einwandfrei, aber die AJAX-Anfragen (zum Beispiel an

http://localhost:50000/web/internal?action=network-statistics

) sind 502-Fehler. Ich glaube, es erreicht den richtigen Endpunkt, aber es liegt ein SSL-Fehler vor. Das Fehlerprotokoll von Nginx scheint meinen Verdacht zu bestätigen:

2013/12/13 16:55:28 [error] 1885#0: *257 SSL_do_handshake() failed (SSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol) while SSL handshaking to upstream, client: 127.0.0.1, server: localhost, request: "GET /web/internal/stats?action=network-statistics&request=null HTTP/1.1", upstream: "https://50.18.192.173:80/web/internal/stats?action=network-statistics", host: "localhost:50000", referrer: "http://localhost:50000/"

Wenn ich den Upstream-Block jedoch wie folgt ändere:

upstream backend {
  server api-dev.example.com:443;
}

…dann bekomme ich 404-Fehler. Ich könnte schwören, dass ich ähnliche Konfigurationen schon einmal bei Server Fault gesehen habe. Zum Beispiel:Dasist eine sehr ähnliche Frage. Was übersehe ich? Was könnte schief laufen? Entschuldigen Sie, wenn das vage ist, ich werde gerne mehr Details hinzufügen.

Antwort1

Versuchen Sie, /web/ zu entfernen. Ich glaube, Sie erhalten 404, weil versucht wurde, auf /web/web zuzugreifen, das nicht existiert. Sie sollten in der Lage sein, weitere Hinweise in den Nginx-Protokollen zu finden.

upstream backend {
        server api-dev.example.com:443;
}

server {
        ...

    location / {
        proxy_pass http://localhost:9000;
        ...
    }

    location /web/ {
        proxy_pass https://backend;
        ...
    }
}

verwandte Informationen