在nginx中,ERR_SPDY_PROTOCOL_ERROR是什么意思?

38

我和几位同事都遇到了net::ERR_SPDY_PROTOCOL_ERROR错误。

我们使用的是1.8.0版本的ngnix。该错误不稳定(难以复制),且Nginx错误日志中没有此错误信息。

您有什么建议来捕捉和解决这个问题吗?

14个回答

20

我在寻找关于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

16

我有同样的问题,请检查您的Nginx分区/硬盘是否有足够的空间,我们增加了一些空间后,问题得到解决。


这里有同样的问题。我的负载均衡服务器上没有足够的空间。 - Pedro Casado

13

简短总结:如果您正在缓存资产,则请检查nginx服务器上的磁盘空间。

我们的情况

我不确定在哪里发布我的答案,因为在Chrome中获取ERR_SPDY_PROTOCOL_ERROR(以及Firefox中相当于“无法加载资源”的错误)可能是边缘情况。但是这篇文章帮助我缩小了罪魁祸首的范围。它不是头文件、gzip、重定向或广告拦截/ublock。

我们有2个Web应用程序从机器部署,并且两者都运行得非常好。最近,我们对其中一个应用程序进行了更改以缓存资产。完成部署后,我们立即从Chrome收到了ERR_SPDY_PROTOCOL_ERROR。有趣的是,它正在接收一个HTTP 200,如果您直接导航到该资产,则Chrome将呈现该资产。但是,在页面上加载资产会导致失败。

有趣的是,另一个Web应用程序完全正常。在Chrome上调查净内部时,我们发现服务器正在关闭连接。几个小时后,我们确定是因为我们的nginx服务器已经没有磁盘空间了。我不知道为什么这会导致在直接导航到它们时加载资产正确,但在加载页面时失败,但清空空间立即解决了问题。


6

从其他答案中可以看出,许多不同的因素都可能导致这种情况发生。对我来说,我有一个格式错误的标题,在其他浏览器中被忽略了(多了一个:)。唯一的解决方法是调试提示,检查加载损坏页面时 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 中开始工作。我建议从服务器获取原始响应,并进行非常仔细的检查,以确保没有语法错误。

4

有许多可能的原因。我今天碰到的一个问题是头行

add_header X-Frame-Options: deny;

目前的Chrome会出现问题,这与ssl + http2有关。其他X-Frame标题似乎没有问题。


5
Chrome的“net-internals”对于调试非常有帮助。 - Metagrapher
上面标题行中的问题似乎是冒号,根据nginx文档中的说明,它不应该出现在那里。我遇到了同样的问题,似乎http2解析器变得更加严格,不再忽略冒号了。(参见:https://trac.nginx.org/nginx/ticket/1409) - marv51

3
这是一个已知问题,存在于Chromium浏览器和某些杀毒软件(如AVG和Avast)之间,尤其是在使用SSL连接时。用户无法解决此问题。网站开发人员需要采取措施避免此问题的发生。
这里为web开发人员提供了文档:http://dev.chromium.org/spdy/spdy-best-practices 以下是一些有用的提示,这些提示在上述文章中没有明确提到:
  • 在使用标头和重定向(特别是301和302)时要非常小心。
  • 将所有包含文件都放在或者放在与您的域名访问相同的目录下,而不是在服务器的目录上面。杀毒软件无法在那里访问它们。为了保护您的包含文件,请在包含目录中创建一个 .htaccess 文件,并简单地写一行内容:Deny from all
  • 启用Gzip压缩。如果使用cPanel,则可以在网站优化设置中完成此操作。
  • 保持 .htaccess 文件的简洁。通过切换服务器输出来创建不同的文件扩展名和重定向用户客户端会创建不必要的冲突。
根据我的经验,在使用会话存储和传递数据时才会出现此问题。Cookie、Get和Post似乎不受影响。
希望这可以帮助您。

SSL和gzip不兼容。 - Metagrapher

3
对于我而言,问题出在Nginx的配置上,它不允许使用OPTIONS方法。我只列入了GET|PUT|POST|DELETE白名单,所以当Chrome尝试发送OPTIONS方法时,错误就会出现(原因未知)。
打开Firefox并重复请求,然后查看网络检查器以检查是否正在发送任何OPTIONS请求。
** 可能是为了检查X-Frame-Options或HSTS验证。

2
如果您在使用Nginx Content-Security-Policy时,在Chrome或Safari浏览器中遇到ERR_HTTP2_PROTOCOL_ERROR或ERR_SPDY_PROTOCOL_ERROR错误,请首先通过访问chrome隐藏界面:chrome://net-internals/#events并在HTTP/2选项卡下选择“live HTTP/2 sessions”按钮来检查此问题。
如果您在刷新后对您的域得到以下类似结果:
HTTP2_SESSION_RECV_INVALID_HEADER
--> error = “Invalid character in header name.”
则应按以下方式编写CSP标头:
add_header Content-Security-Policy "<values>";

这种方法对我很有效。

注意:CSP中不允许使用空格。仅在区分策略参数及其值时使用空格。在Chrome中重现此问题,可以使用add_header Content-Security-Policy: "<values>";,其中还有额外的:,被视为无效。


非常感谢!那正是我遇到的错误。结果发现我有一个类似的问题 - 在设置标题“charset=utf-8”时打错了字,应该是“charset: utf-8”。 - 3x071c

1
在我的情况下,我通过增加块大小来解决这个问题:
http2_chunk_size             300k;

1
请检查代理缓存路径的位置 - 确保它存在,有足够的空间,并且权限和所有者允许nginx进程写入该路径。
例如:nginx.conf(片段) proxy_cache_path /proxy_cache levels=1:2 keys_zone=danger_zone:10m inactive=60m; ...然后检查/proxy_cache路径是否属于nginx并且可写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接