nginx 400 不正なリクエスト (無効なホスト名)

nginx 400 不正なリクエスト (無効なホスト名)

構築した Web アプリケーションの 3 つのノードにわたって、フロントエンド ロード バランサーとして nginx を設定しました。upstream.server と server.server_name で使用した値に関係なく、nginx は継続的に 400/bad request - invalid hostname エラーを返します。両方の値に localhost と 127.0.0.1 を試し、一致する cURL/Postman リクエストを使用してリクエストを発行しましたが、効果はありませんでした。

また、受信 HTTP HOST ヘッダーとより一致するようにポート番号を含む server.server_name の値を設定することも試みましたが、効果はありませんでした。

nginx.conf

events {
  worker_connections  1024; 
}

http { 
  upstream myapp {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
  }

  server {
    listen 8000;
    server_name 127.0.0.1;
    location / {
      proxy_pass http://myapp;
    }
  }
}

cURL リクエストの結果は次のようになります (localhost と 127.0.0.1 の使用に違いはありません)。

C:\>curl -v http://127.0.0.1:8000/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8000
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 400 Bad Request
< Server: nginx/1.17.1
< Date: Mon, 22 Jul 2019 14:29:22 GMT
< Content-Type: text/html; charset=us-ascii
< Content-Length: 334
< Connection: keep-alive
<
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
</BODY></HTML>
* Connection #0 to host 127.0.0.1 left intact

答え1

次の構成を試してください:

events {
  worker_connections  1024; 
}

http { 
  upstream myapp {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    server 127.0.0.1:8003;
  }

  server {
    listen 8000;
    server_name 127.0.0.1;
    location / {
      proxy_pass http://myapp;
      proxy_set_header Host $host;
    }
  }
}

答え2

私も同じエラーを受け取りましたが、午前IIS の前で nginx を使用しました。しかし、断続的でした。リクエストが 1 つおきに失敗したのは奇妙でした。

結局、IIS ホスト名を特定の IP (すべての IP ではなく) にバインドしていたため、IIS は負荷分散を行っていたものの、他の IP を解決できなかったことがわかりました。

IIS にすべての IP をバインドするように指示すると、問題は解決しました。解決までに数時間しかかかりませんでした。

関連情報