Назад | Перейти на главную страницу

nginx возвращает странный двоичный ответ только на запросы без SSL (nginx / 1.14.2)

Я перенес свой nginx.conf на новое устройство, и он отлично работает, за исключением того, что ответы по обычному HTTP возвращают следующее.

$ curl http://127.0.0.1 -vv --output -;
* Expire in 0 ms for 6 (transfer 0x5628a912ba30)
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5628a912ba30)
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1
> User-Agent: curl/7.64.0
> Accept: */*
> 
* Closing connection 0
���

Чего нельзя сказать о HTTPS, который отлично работает.

$ ^curl https://127.0.0.1 --insecure --output -;
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

Это происходит независимо от того, установлен сертификат или нет. Это происходит независимо от того, использую я HTTP2 или нет. Он никогда не касается FPM. Установка nginx по умолчанию, по какой-либо причине, извергает двоичный файл на простой HTTP и только на простой HTTP.

Nginx не поддерживает Механизм обновления HTTP, что позволяет использовать один и тот же незашифрованный порт между HTTP/1.1 и HTTP/2. Для зашифрованных соединений поддерживается только ALPN (см. этот ответ).

Выбор между HTTP/1.1 и HTTP/2 выполняется для каждой пары IP-адрес-порт. Поэтому если любой вашего порта 80 виртуальные серверы указать http2 в listen директива все из них будут использовать HTTP/2. Возможно предупреждение должны быть отправлены в файл журнала, что не так.

поскольку HTTP/2 это двоичный протокол, вы получаете HTTP/2 эквивалент 400 Bad Request если вы не проинструктируете завиток использовать HTTP/2 напрямую (нет HTTP/1.1 -> HTTP/2 Обновить):

curl --http2-prior-knowledge http://127.0.0.1

В моем случае у меня было http2 на :80 и :8080 порт. Если вы столкнулись с этой проблемой, убедитесь, что все порты без поддержки SSL не имеют http2 опция, затем выполните полный перезапуск службы. Я считаю, что если какой-либо порт без SSL является http2, все они пытаются им быть.