nginx 仅在非 SSL 请求时返回奇怪的二进制响应(nginx/1.14.2)

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 上输出。

答案1

Nginx不支持HTTP 升级机制HTTP/1.1,允许在和之间共享相同的未加密端口HTTP/2。加密连接仅支持 ALPN(参见这个答案)。

HTTP/1.1和之间的选择HTTP/2是根据 IP 地址-端口对进行的。因此,如果任何在指令中80指定虚拟服务器的端口,http2listen全部他们将使用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,那么所有端口都会尝试启用。

相关内容