我和几位同事都遇到了net::ERR_SPDY_PROTOCOL_ERROR
错误。
我们使用的是1.8.0版本的ngnix。该错误不稳定(难以复制),且Nginx错误日志中没有此错误信息。
您有什么建议来捕捉和解决这个问题吗?
我在寻找关于Chrome上出现ERR_SPDY_PROTOCOL_ERROR
问题的帮助时,偶然发现了这个问题。认为这可能对其他人有所帮助。
我们的情况/解决方案:我们使用连接到EC2实例的AWS应用负载均衡器。我们在EC2上运行的脚本之一代理客户端浏览器的请求。最近我们更新了脚本-没有相关更改-并注意到Chrome和Safari请求代理脚本开始失败。Chrome显示ERR_SPDY_PROTOCOL_ERROR
错误,当我们深入挖掘时,发现此请求正在使用HTTP/2。Firefox请求继续正常工作。
我们的解决方案:我们关闭了ALB中的HTTP/2支持。问题立刻得到解决。
AWS CLI命令:
aws elbv2 modify-load-balancer-attributes --load-balancer-arn <your_load_balancer_arn> --attributes Key=routing.http2.enabled,Value=false
我有同样的问题,请检查您的Nginx分区/硬盘是否有足够的空间,我们增加了一些空间后,问题得到解决。
简短总结:如果您正在缓存资产,则请检查nginx服务器上的磁盘空间。
我不确定在哪里发布我的答案,因为在Chrome中获取ERR_SPDY_PROTOCOL_ERROR
(以及Firefox中相当于“无法加载资源”的错误)可能是边缘情况。但是这篇文章帮助我缩小了罪魁祸首的范围。它不是头文件、gzip、重定向或广告拦截/ublock。
我们有2个Web应用程序从机器部署,并且两者都运行得非常好。最近,我们对其中一个应用程序进行了更改以缓存资产。完成部署后,我们立即从Chrome收到了ERR_SPDY_PROTOCOL_ERROR
。有趣的是,它正在接收一个HTTP 200
,如果您直接导航到该资产,则Chrome将呈现该资产。但是,在页面上加载资产会导致失败。
有趣的是,另一个Web应用程序完全正常。在Chrome上调查净内部时,我们发现服务器正在关闭连接。几个小时后,我们确定是因为我们的nginx服务器已经没有磁盘空间了。我不知道为什么这会导致在直接导航到它们时加载资产正确,但在加载页面时失败,但清空空间立即解决了问题。
从其他答案中可以看出,许多不同的因素都可能导致这种情况发生。对我来说,我有一个格式错误的标题,在其他浏览器中被忽略了(多了一个:
)。唯一的解决方法是调试提示,检查加载损坏页面时 Chrome 的网络内部事件:chrome://net-internals/#events
对我来说,当我看到这行时,就知道它是一个标题问题
t=65422 [st=53] HTTP_TRANSACTION_READ_HEADERS [dt=4]
--> net_error = -337 (ERR_SPDY_PROTOCOL_ERROR)
:
后,HTTP/2 在 Chrome 中开始工作。我建议从服务器获取原始响应,并进行非常仔细的检查,以确保没有语法错误。有许多可能的原因。我今天碰到的一个问题是头行
add_header X-Frame-Options: deny;
目前的Chrome会出现问题,这与ssl + http2有关。其他X-Frame标题似乎没有问题。
chrome://net-internals/#events
并在HTTP/2选项卡下选择“live HTTP/2 sessions”按钮来检查此问题。add_header Content-Security-Policy "<values>";
这种方法对我很有效。
注意:CSP中不允许使用空格。仅在区分策略参数及其值时使用空格。在Chrome中重现此问题,可以使用add_header Content-Security-Policy: "<values>";
,其中还有额外的:
,被视为无效。
http2_chunk_size 300k;
nginx
进程写入该路径。proxy_cache_path /proxy_cache levels=1:2 keys_zone=danger_zone:10m inactive=60m;
...然后检查/proxy_cache
路径是否属于nginx
并且可写。