Nginx: Nicht aufgelöster Hostname (HTTPS)

Nginx: Nicht aufgelöster Hostname (HTTPS)

Ich versuche, eine minimale Nginx-Konfiguration für eine API einzurichten, aber ich bekomme SSL/HTTPS nicht zum Laufen.

Kurz gesagt: Der /healthcheckEndpunkt funktioniert wie vorgesehen, sonst jedoch nicht.


Ich habe eine API-Anwendung, die in einem Docker-Container auf einer GCE-Instanz neben nginx läuft.

           Internet
               +
               |
               |
               v
+--------------+----------------+
|             GCP               |
|                               |
|    +--------------------+     |
|    |Google Load Balancer|     |
|    +---------+----------+     |
|              |                |
|              |                |
|              |                |
|              v                |
|   +----------+------------+   |
|   | Google Compute Engine |   |
|   |                       |   |
|   | +-------------------+ |   |
|   | |  Server instance  | |   |
|   | |                   | |   |
|   | | +------+  +-----+ | |   |
|   | | |Docker|  |nginx| | |   |
|   | | |      |  +-----+ | |   |
|   | | | API  |          | |   |
|   | | +------+          | |   |
|   | +-------------------+ |   |
|   +-----------------------+   |
|  ---------------------------  |
+-------------------------------+

Der gesamte HTTP-Verkehr durchläuft den Load Balancer und erreicht nginx. Wenn der Endpunkt nginx ist, /healthcheckgeht er direkt an die API (die zurückgibt 200 OK), während alles andere als HTTPS über den Load Balancer zurückgeleitet werden sollte.

Der gesamte HTTPS-Verkehr sollte direkt an die API gehen.

Ich habe zwei serverBlöcke in meiner Konfiguration.
Erster Block:

server {
    listen 80;
    server_name  my-domain.com;

    location /healthcheck {
        proxy_pass http://API_IP:8080/healthcheck;
    }

    location / {
        return 301 https://$server_name$request_uri;
    }
}

Zweiter Block:

server {
    listen 443 ssl;
    server_name my-domain.com;

    location / {
        proxy_pass http://API_IP:8080$request_uri;
    }
}

Mit demInsomnia REST-Client:
Wenn ich /healthcheckentweder HTTP oder HTTPS eingebe, funktioniert es, aber /userses /reviewswird nur die Fehlermeldung angezeigt Error: Couldn't resolve host name. Kein Statuscode, nur diese Fehlermeldung.


Für jede Hilfe wäre ich sehr dankbar.


Aktualisieren

Ausgabe vonwget -S my-domain.com/users
(Tatsächliche Domäne und IP wurden geändert)

$ wget -S my-domain.com/users
--2018-08-30 14:09:08--  http://my-domain.com/users
Resolving my-domain.com (my-domain.com)... *IP REDACTED*
Connecting to my-domain.com (my-domain.com)|*IP REDACTED*|:80... connected.
HTTP request sent, awaiting response...
  HTTP/1.1 301 Moved Permanently
  Server: nginx/1.10.3 (Ubuntu)
  Date: Thu, 30 Aug 2018 12:09:09 GMT
  Content-Type: text/html
  Content-Length: 194
  Location: https://my-domain.com/users
  Via: 1.1 google
Location: https://my-domain.com/users [following]
--2018-08-30 14:09:09--  https://my-domain.com/users
Resolving my-domain.com (my-domain.com)... failed: Name or service not known.
wget: unable to resolve host address ‘dev.api.godlypatruljen.no’

Antwort1

Rechts.

Von einem Kollegen habe ich einen Tipp bekommen, der mich auf den richtigen Weg gebracht hat. Es ist vielleicht nicht die schönste Lösung, aber sie funktioniert.

Ich habe die beiden alten serverBlöcke ersetzt durcheinsneu:

server {
    listen 80;
    listen [::]:80;
    server_name my-domain.com;

    set $redirect_to_https 0;

    if ($http_x_forwarded_proto != 'https') {
        set $redirect_to_https 1;
    }

    if ($request_uri = '/healthcheck') {
        set $redirect_to_https 0;
    }

    if ($redirect_to_https = 1) {
        return 301 https://$host$request_uri;
    }

    location / {
        proxy_pass http://$api_ip:$api_port;
    }
}

Ich habe auch ein paar zusätzliche locations und ifs (zusätzlich zu dem, was hier gezeigt wird) aufgrund einiger Randfälle, die ich behandeln muss (statische Standorte auf dem Server, aber nicht innerhalb des Containers usw.), aber dieses Beispiel sollte die Lösung recht gut veranschaulichen.

verwandte Informationen