【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;#客户端传输数据的超时时间
你好 我的情况跟你是一样的?你当时怎么解决的呢?
今天正好碰到这个问题,说一下我的解决思路,
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