Я перенес свой 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, все они пытаются им быть.