.png)
Я настроил nginx как фронтенд-балансировщик нагрузки на трех узлах веб-приложения, которое я создал. nginx постоянно возвращает ошибки 400/bad request - invalid hostname независимо от значений, которые я использую в upstream.server и server.server_name. Я пробовал localhost и 127.0.0.1 для обоих этих значений и отправлял запросы с использованием соответствующих запросов cURL/Postman, но безрезультатно.
Я также пробовал задать значение для server.server_name, включая номер порта, чтобы лучше соответствовать входящему заголовку HTTP HOST, но безрезультатно.
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
Я получил ту же ошибку, но яявляюсьиспользуя nginx перед IIS. Но это было прерывисто. Каждый второй запрос терпел неудачу, что было странно.
Оказалось, что я привязал свое имя хоста IIS к определенному IP-адресу (а не ко всем IP-адресам), и IIS выполнял балансировку нагрузки, но не мог разрешить другой IP-адрес.
Решил проблему, указав IIS привязаться ко всем IP. Потребовалось всего пару часов, чтобы разобраться.