Ich versuche, eine minimale Nginx-Konfiguration für eine API einzurichten, aber ich bekomme SSL/HTTPS nicht zum Laufen.
Kurz gesagt: Der /healthcheck
Endpunkt 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, /healthcheck
geht 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 server
Blö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 /healthcheck
entweder HTTP oder HTTPS eingebe, funktioniert es, aber /users
es /reviews
wird 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 server
Blö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 location
s und if
s (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.