我已经将我的 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 上输出。
答案1
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
答案2
在我的例子中,我http2
在:80
和:8080
端口上都有。如果您遇到此问题,请确保所有未启用 SSL 的端口也没有http2
启用该选项,然后对服务进行硬重启。我相信如果任何非 SSL 端口是 http2,那么所有端口都会尝试启用。