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

时间:2016-08-03 20:06:14

标签: javascript google-chrome nginx

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

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证书。

已更新

I found the problem and solution.

2 个答案:

答案 0 :(得分:0)

这是一种解决方法,而不是问题的解决方案。 在启用了http2的Nginx上,Chrome中发生了此错误。

我能够在nginx中禁用http2(或者只是删除了启用它的选项)。

我更改了:

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

收件人:

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

在那之后,chrome在nginx上运行良好。

我的问题特别奇怪的是,它仅在传递超过500个字节的大标头时才发生。在其他所有时间,chrome / ngnx表现良好。在整个过程中,curl都能很好地达到我的目标。此外,当我绕过nginx直接访问端点时,我测试的chrome和所有其他浏览器都可以正常工作。

从我所看到的情况来看,我怀疑这是ALPN的问题。可能是因为我的openssl版本已过时。不过,降级到http 1.1比研究这种可能性要容易得多。

答案 1 :(得分:0)

严格来说,这不是一个具体问题的答案,但是当我遇到一个非常类似的问题时出现了这个问题,因此我会将其张贴在这里,以防它对其他人有所帮助。

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

尽管默认的nginx设置为1mb,默认情况下,Plesk面板会向每个nginx conf文件应用client_max_body_size 128m;。无论您用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

因此,服务器范围内“ client_max_body_size”指令的默认值为128m。可以在此处设置任何其他值。

将以下行添加到/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

因此,vhost的配置文件中将没有定义“ client_max_body_size”指令。

重新启动NGINX:

service nginx restart

现在可以在域> example.com> Apache和Nginx设置>每个域的其他nginx指令中指定client_max_body_size的自定义值,即:

client_max_body_size 512m;

这有效100%。完全归功于Bulat Tsydenov(此解决方案的作者)。

保存了我的培根:)