使用HTTP2.0 + Nginx在Chrome中出现net::ERR_CONNECTION_CLOSED错误

4
如何解决Google Chrome(v.51.0)中的net :: ERR_CONNECTION_CLOSED错误,当我尝试通过https将图像POST到服务器时(使用jQuery或Dropzone.js)。

Firefox在http和https上工作得很好。Chrome只能在http上使用。在Chrome + HTTPS上,除了文件上传之外的所有内容都可以正常工作。在php超时结束后,我遇到了这个错误:

dropzone.min.js:1 POST https://{example.com}/images/upload net::ERR_CONNECTION_CLOSED

没有其他的消息。在PHP和Nginx日志中没有什么记录。
我的服务器:PHP 7.0.9 + Nginx 1.10 + Ubuntu Server 16.04 + HTTP2.0,使用Comodo提供的SSL证书。
更新:
我找到了问题和解决方法。请参考此处

抱歉,没有代码很难提供帮助......你试过使用 withCredentials: true 吗? - Hackerman
3个回答

2

这只是一个解决问题的临时方法,而不是解决问题的根本办法。当我在使用启用了http2的nginx时,我在chrome中遇到了这个错误。

我成功地在nginx中禁用了http2(或者说只是删除了启用它的选项)。

我进行了以下更改:

  server {
      listen 443 http2 ssl;
      listen [::]:443 http2 ssl;

to:

  server {
      listen 443 ssl;
      listen [::]:443 ssl;

之后,chrome与nginx的配合工作正常。

我遇到的问题特别奇怪的是它只在传递大于约500字节的头文件时才会出现。在其他所有情况下,chrome / nginx表现良好。在此期间,curl也一直正常地访问我的端点。此外,当我绕过nginx直接访问端点时,chrome和其他所有测试的浏览器都可以正常工作。

从我所见的事情来看,我怀疑这是一个ALPN的问题。也许是因为我的openssl版本过时了。不过,降级到http 1.1比探究这种可能性更容易。


我这里也遇到了完全相同的问题。当启用HTTP2时,Chrome在上传大文件时会出现问题。是否有“正确”的解决方案? - spice
@spice 我并不知道有其他解决方法。我花了很长时间搜索,这是我能够找到的最好的解决方案或在网络上找到的。回想一下,由于所有其他主要浏览器似乎都可以正常工作,所以这可能是Chrome的错误。因此,唯一真正的解决方案就是修复Chrome/Chromium。 - Jack Davidson
它似乎只与Chrome和HTTP/2有关。我刚刚在下面发布了对我有效的解决方案。虽然它不完全是针对您特定情况的答案,但我在尝试解决此问题时发现了您的问题,因此希望其他人也会发现它有用。 - spice

0

虽然这不是针对特定问题的答案,但由于我在遇到非常相似的问题时遇到了这个问题,所以我会在这里发布它,以防有人需要。

我遇到的问题与OP几乎相同(任何大于128mb的上传都会在Chrome中失败),但我在我的UB 16.04服务器上使用Plesk(nginx代理HTTP / 2),因此任何直接更改nginx设置的尝试都会失败,因为Plesk会覆盖它们。

默认情况下,Plesk面板将client_max_body_size 128m;应用于每个nginx conf文件,尽管默认的nginx设置为1mb。这会导致问题,因为无论您使用PHP设置什么,nginx都会在上传超过约25mb的任何内容时崩溃。我不确定为什么这个数字很重要,也许那是nginx读取下一个数据块的标头的时间?它看到传入的文件超过128mb,然后崩溃并在Chrome中抛出ERR_CONNECTION_CLOSED错误。我不太确定,我只知道这是一团糟。

在Plesk中有一个选项可以添加nginx指令,据说可以允许您覆盖此设置,但如果您尝试添加任何内容,则会引发“重复条目”错误:

Invalid nginx configuration: nginx: [emerg] "client_max_body_size" directive is duplicate in /var/www/vhosts/system/example.com/conf/vhost_nginx.conf:1 nginx: configuration file /etc/nginx/nginx.conf test failed

我花了很长时间寻找解决方法,最终在 Plesk 支持论坛上找到了this article ,这篇文章完美地解决了问题。

只需通过终端执行几个简单的步骤(所有详细信息都在文章中列出),即可使其正常工作,但以防万一它会消失...

使用ssh连接到服务器。

运行以下命令,以添加“client_max_body_size 128m;”到nginx配置中:

echo 'client_max_body_size 128m;' > /etc/nginx/conf.d/aa_client_max_body.conf

因此,128m将成为全局'server_max_body_size'指令的默认值。可以在此处设置任何其他值。

将以下行添加到/usr/local/psa/admin/conf/panel.ini中:

[webserver]
nginxClientMaxBodySize = 

如果 panel.ini 文件不存在,则使用示例文件创建它:
cp /usr/local/psa/admin/conf/panel.ini.sample /usr/local/psa/admin/conf/panel.ini

请确保 /usr/local/psa/admin/conf/panel.ini 文件的权限设置正确,否则解决方案将无法生效:

ls -la /usr/local/psa/admin/conf/panel.ini
-rw-r--r-- 1 root root 1857 Nov 26 11:03 /usr/local/psa/admin/conf/panel.ini

重新生成所有虚拟主机的NGINX\Apache配置文件,以应用/usr/local/psa/admin/conf/panel.ini中的更改:

plesk sbin httpdmng --reconfigure-all

因此,在虚拟主机配置文件中将不会定义“client_max_body_size”指令。

重新启动NGINX:

service nginx restart

现在可以在域名 > example.com > Apache & Nginx 设置 > 每个域名的附加nginx指令 中指定自定义的client_max_body_size值,例如:

client_max_body_size 512m;

这个方案百分之百有效。完全归功于Bulat Tsydenov(该解决方案的作者)。

救了我的一命 :)


0

由于这是使用HTTP2的Nginx,必须配置允许更长的标头/ URL。在我的情况下,我需要为Web应用程序添加长查询参数,因此我添加了32k。

server {
  # ...
  http2_max_field_size 32k;
}

曾在nginx v1.18.0 (Ubuntu)上工作过。


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