问题 ERR_SPDY_PROTOCOL_ERROR在nginx中的含义是什么?


我和我的一些同事得到了 net::ERR_SPDY_PROTOCOL_ERROR 错误。

我们使用ngnix版本1.8.0。错误不稳定(难以复制),并且Ngnix错误日志没有此错误。

您如何建议我们抓住并解决这个问题?


8556
2017-11-23 09:00


起源



答案:


我有同样的问题,检查你是否有足够的空间在Nginx分区/硬盘驱动器,我们添加一些,它对我们有用。


3
2017-10-26 16:11





TL; DR:如果您正在缓存资产,请检查nginx服务器上的驱动器空间。

我们的情景

我不知道在哪里发布我的答案,因为它可能是一个边缘情况下获得 ERR_SPDY_PROTOCOL_ERROR 在Chrome中(以及Firefox中等效的“无法加载资源”错误)。但这篇文章帮助我缩小了罪魁祸首。它不是标头,gzip,重定向或adblock / ublock。

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

足够的,其他Web应用程序非常好。调查Chrome上的网络内部,我们发现服务器正在关闭连接。几个小时后,我们确定这是因为我们的nginx服务器耗尽了驱动器空间。我不知道为什么这会导致资产在您直接导航时正确加载,但在加载页面时失败,但清除空间会立即修复问题。


3
2018-06-03 19:47





似乎有很多潜在的原因。我今天打的就是标题线

add_header X-Frame-Options:deny;

出于某种原因,当前的chrome会使用ssl + http2对其进行barf。其他X-Frame标头似乎不是问题。


2
2017-08-10 19:51



还有chrome:// net-internals在调试方面非常有用 - Metagrapher
上面标题行中的问题似乎是冒号,根据它不应该存在 nginx文档。我有同样的问题,似乎http2解析器在某种程度上更严格,不再忽略冒号。 (也可以看看: trac.nginx.org/nginx/ticket/1409) - marv51


答案:


我有同样的问题,检查你是否有足够的空间在Nginx分区/硬盘驱动器,我们添加一些,它对我们有用。


3
2017-10-26 16:11





TL; DR:如果您正在缓存资产,请检查nginx服务器上的驱动器空间。

我们的情景

我不知道在哪里发布我的答案,因为它可能是一个边缘情况下获得 ERR_SPDY_PROTOCOL_ERROR 在Chrome中(以及Firefox中等效的“无法加载资源”错误)。但这篇文章帮助我缩小了罪魁祸首。它不是标头,gzip,重定向或adblock / ublock。

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

足够的,其他Web应用程序非常好。调查Chrome上的网络内部,我们发现服务器正在关闭连接。几个小时后,我们确定这是因为我们的nginx服务器耗尽了驱动器空间。我不知道为什么这会导致资产在您直接导航时正确加载,但在加载页面时失败,但清除空间会立即修复问题。


3
2018-06-03 19:47





似乎有很多潜在的原因。我今天打的就是标题线

add_header X-Frame-Options:deny;

出于某种原因,当前的chrome会使用ssl + http2对其进行barf。其他X-Frame标头似乎不是问题。


2
2017-08-10 19:51



还有chrome:// net-internals在调试方面非常有用 - Metagrapher
上面标题行中的问题似乎是冒号,根据它不应该存在 nginx文档。我有同样的问题,似乎http2解析器在某种程度上更严格,不再忽略冒号。 (也可以看看: trac.nginx.org/nginx/ticket/1409) - marv51


我试图找到我面临的问题的帮助时遇到了这个问题 ERR_SPDY_PROTOCOL_ERROR 在Chrome上。认为这可能会让其他人受益

我们的情况/解决方案:我们使用 AWS Application Load Balancer 连接到 EC2 实例。我们在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

2
2017-08-28 09:30



这解决了我的问题,非常感谢 - luliandro


从其他答案可以看出,很多不同的东西都可能导致这种情况。对我来说,我有一个格式错误的标题,其他浏览器只是忽略了(额外的 :)。唯一的答案是调试提示,在加载破碎的页面时检查Chrome的网内内容事件:chrome:// net-internals /#events

对我来说,当我看到这条线时,我知道这是一个标题问题

t=65422 [st=53]      HTTP_TRANSACTION_READ_HEADERS  [dt=4]
                 --> net_error = -337 (ERR_SPDY_PROTOCOL_ERROR) 

1
2018-06-14 02:44





这是Chromium浏览器与某些防病毒程序(如AVG和Avast)之间存在的已知问题,尤其是在使用SSL连接时。它无法在用户端解决。网站开发人员可以防止此问题发生。

Web开发人员的文档在这里: http://dev.chromium.org/spdy/spdy-best-practices

以下是针对该文章中没有特别提及的开发人员的一些有用提示:

  • 使用标题和重定向时要特别小心,尤其是301和302
  • 将所有包含保留在与域名访问相同的目录中或下,而不是在服务器中的目录之上。防病毒无法在那里访问它们。要保护包含文件,请在includes目录中创建一个.htaccess文件,然后只写一行:拒绝所有文件
  • 启用Gzip压缩。如果您使用cPanel,可以在您的网站优化设置中完成。
  • 保持.htaccess文件简单。切换服务器输出以创建不同的文件扩展名并重定向用户客户端将产生不必要的冲突。

根据我的经验,只有在使用Sessions存储和传递数据时才会出现此问题。 Cookies,Get和Post似乎不受影响。

希望这可以帮助。


0
2018-03-09 01:46



SSL和gzip不兼容。 - Metagrapher


我有一个网站这样做,结果是有人忘记在index.php的第一行的PHP重定向中放置“Location:”,使标头无效。显然只有Chrome关注,其余的浏览器仍然可以很好地加载它。


0
2017-08-08 14:15



我理解Chrome对于格式错误的标题非常挑剔...... - Metagrapher


与OP一样,这对我来说是一个间歇性的问题,只发生在大小为2mb的AJAX请求上。

在我们从AWS经典ELB转移到ALB之后,问题就开始了。

我通过卸载Chrome解决了这个问题,删除了我的用户个人资料(在Mac上删除了内容 ~/Library/Application Support/Google/Chrome),然后重新安装。


0
2017-12-13 19:53





我最近在服务器升级后看到了这个错误。

我在Chrome中为所有用户看到了它,但只是断断续续地。

通过让他们使用Chrome的网站“空缓存和硬重新加载”刷新功能,我能够为所有用户解决这个问题。 (对于Chrome工具,F12,右键单击刷新按钮)

我怀疑这与正在使用的SSL证书缓存的内容有关。


0
2018-02-28 02:54





对我来说,Nginx配置不允许OPTIONS方法。我只将GET | PUT | POST | DELETE列入白名单,所以当Chrome尝试发送OPTIONS方法时,因为上帝知道为什么**,错误被重现了。

打开Firefox并重复请求,然后查看网络检查器以检查是否正在发送任何OPTIONS请求。

**可能要检查X-Frame-Options或HSTS验证。


0
2018-04-04 10:48





检查代理缓存路径的位置 - 检查它是否存在,是否有空间,以及权限和所有者是否允许 nginx 写入路径的过程。

例如 nginx.conf(片段)

proxy_cache_path /proxy_cache levels=1:2 keys_zone=danger_zone:10m inactive=60m;

...然后检查 /proxy_cache路径是拥有和可写的 nginx


0
2017-09-11 00:38