【nginx】Nginx 启用 h2 Chrome 报 net::ERR_SPDY_PROTOCOL_ERROR错误

在nginx配置 h2, 当加载很多图片的时候,后面一部分图片加载不出来,在chrome 报
GET https://test.com/img/001.jpg net::ERR_SPDY_PROTOCOL_ERROR
前面十几张图片是可以加载出来的,在移动端和 edge 都是可以加载出来的
nginx 1.10.3
chrome 57.0.2987.110

查了一下原因,chrome 逐渐抛弃 SPDY,而h2 使用的是 ALPN 协议进行协商的,和SPDY没什么关系啊!为什么会出现这种错误的?

回答

nginx配置ssl_prefer_server_ciphers   on;目的是默认会优先根据客户端选择加密算法.
两种解决方案:一种是不使用http2,另一种是不设置ssl_prefer_server_ciphers,所以这里建议看网站自身是否有更严格的传输加密要求.

可以试下这个方式.

主要由于http2对一个域名只会发出一次tcp请求,如果你图片很多的话,在nginx默认的时间内,肯定是一些图片数据是没有被服务端发送过来,所以造成超时报错。nginx设置服务端向客户端传输数据的超时时间。

send_timeout  300s;#客户端传输数据的超时时间

【nginx】Nginx 启用 h2 Chrome 报 net::ERR_SPDY_PROTOCOL_ERROR错误

你好 我的情况跟你是一样的?你当时怎么解决的呢?

今天正好碰到这个问题,说一下我的解决思路,
1.在chrome中无法打开,但是firefox可以
2.关闭http2,该问题消失,开启http2该问题出现
综上断定和http2有关。
随后排查代码,(php的)
发现如下问题,代码中有很多

header('HTTP/1.1 404 Not found');

改为

header($_SERVER['SERVER_PROTOCOL'].' 404 Not found');//自动适配http 1.1和2协议

发现大部分出现该错误的页面消失,但是仍然有1个页面,依然有该问题,排查代码发现了错误之处:

header('302 Moved temporarily');

改成

header($_SERVER['SERVER_PROTOCOL'].' 302 Moved temporarily');

问题解决。

后续:
http2 对 http header 头的校验很严格,不允许不规范的header,所以改为符合规范的header即可。。

    proxy_buffer_size 64k;

proxy_buffers 4 32k;

proxy_busy_buffers_size 64k;

client_max_body_size 120m;

client_body_buffer_size 20M;

proxy_read_timeout 150;

增加以上配置就可以了

以上是 【nginx】Nginx 启用 h2 Chrome 报 net::ERR_SPDY_PROTOCOL_ERROR错误 的全部内容, 来源链接: utcz.com/a/84001.html

回到顶部