Nginx: nombre de host no resuelto (HTTPS)

Nginx: nombre de host no resuelto (HTTPS)

Estoy intentando establecer una configuración mínima de nginx para una API, pero no consigo que SSL/HTTPS funcione.

En pocas palabras: el /healthcheckpunto final funciona según lo previsto, pero nada más.


Tengo una aplicación API ejecutándose en un contenedor Docker en una instancia de GCE junto con nginx.

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

Todo el tráfico HTTP pasa por el equilibrador de carga y llega a nginx. Si el punto final es, /healthcheckva directamente a la API (que devuelve 200 OK), mientras que todo lo demás debe enrutarse a través del balanceador de carga como HTTPS.

Todo el tráfico HTTPS debería ir directamente a la API.

Tengo dos serverbloques en mi configuración.
Primer bloque:

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

Segundo bloque:

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

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

Con elCliente REST de insomnio:
Cuando presiono /healthcheckHTTP o HTTPS, funciona, pero /userssolo /reviewsaparece el mensaje de error Error: Couldn't resolve host name. Sin código de estado, solo este mensaje de error.


Cualquier ayuda sería muy apreciada.


Actualizar

Salida dewget -S my-domain.com/users
(Se cambia el dominio real y la IP)

$ 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’

Respuesta1

Bien.

Recibí un consejo de un colega que me llevó por el camino correcto. Puede que no sea la solución más bonita, pero funciona.

Reemplacé ambos serverbloques viejos conunonuevo:

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

También tengo algunos locationsys adicionales if(además de lo que se muestra aquí) debido a algunos casos extremos que necesito manejar (ubicaciones estáticas en el servidor, pero no dentro del contenedor, etc.), pero este ejemplo debería ilustrar la solución bastante bien.

información relacionada