Nginx: 解決されていないホスト名 (HTTPS)

Nginx: 解決されていないホスト名 (HTTPS)

API 用に最小限の nginx 構成をセットアップしようとしていますが、SSL/HTTPS が機能しません。

簡単に言うと、/healthcheckエンドポイントは意図したとおりに機能しますが、それ以外は機能しません。


私は、nginx と並行して GCE インスタンス上の Docker コンテナで API アプリケーションを実行しています。

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

すべての HTTP トラフィックはロード バランサを通過し、nginx に到達します。エンドポイントが の場合、トラフィック/healthcheckは直接 API に送られ ( が返されます200 OK)、その他はすべて HTTPS としてロード バランサを経由してルーティングされます。

すべての HTTPS トラフィックは API に直接送信される必要があります。

server私の設定には2 つのブロックがあります。
最初のブロック:

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

2番目のブロック:

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

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

とともに不眠症RESTクライアント: HTTP または HTTPS のいずれか
を押すと動作しますが、エラー メッセージのみが表示されます。ステータス コードはなく、このエラー メッセージのみが表示されます。/healthcheck/users/reviewsError: Couldn't resolve host name


どのような助けでも大歓迎です。


アップデート

出力からwget -S my-domain.com/users
(実際のドメインと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’

答え1

右。

同僚からヒントを得て、正しい方向に進みました。 あまり良い解決策ではないかもしれませんが、効果はあります。

私は古いserverブロックを両方とも1つ新しい:

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

location処理する必要のあるいくつかのエッジケース (サーバー上の静的な場所だがコンテナー内ではないなど) のため、いくつかの追加の と も (ここで示されているものに加えて)ありますifが、この例ではソリューションが非常によく示されているはずです。

関連情報