net::ERR_INCOMPLETE_CHUNKED_ENCODING nginx

28

我有两个托管在不同服务器上的 RoR 网页应用。对于特定页面,请求是从第二个应用程序服务的。而对于其余页面,请求则由主应用程序服务。 主应用程序的 Nginx 设置

location /customer/help/ {
            proxy_pass http://second-application:3020/help_and_support/;
}
location /assets/ {
            proxy_pass http://second-application:3020/assets/;
}

这个工作一直很好,直到昨天。现在,在 Firefox 中,/customer/help/ 页面显示为空白页面,在 Chrome 中,它部分加载并且控制台显示错误。

net::ERR_INCOMPLETE_CHUNKED_ENCODING

调试后发现问题可能出在通过API发送的图像数据上。我的第二个应用程序调用API获取图像并将它们显示在页面上。

<% url_with_binary_data = "data:image/" + "jpeg" + ";base64," + u.photo_url.to_s %>
<%= image_tag(url_with_binary_data, :class => "userpic")  %>

获取图像的API代码

photo_url: Base64.encode64(u.photo.file.read).gsub("\n", '')
12个回答

52

您可能需要检查运行Nginx工作进程的用户是否拥有目录/var/lib/nginx(在某些发行版中为/var/cache/nginx)。

我了解到,当您向Nginx发送过大的响应时,它会使用此目录作为临时文件的工作目录。如果工作进程无法访问它,则Nginx将在传输完成之前终止传输,从而出现错误INCOMPLETE_CHUNKED_ENCODING


2
你从未知道这个救了我多少次! - Sri Harsha Kappala
3
检查Nginx正在哪个用户运行(通常在nginx.conf文件中),然后将nginx的lib目录所有权赋给该用户 chown -R nginx:nginx /var/lib/nginx/。为了保险起见,您可以重新加载Nginx(在CentOS 6上使用service nginx reload命令)。 - Don Wilson
如果该目录不存在,我应该创建它吗? - Dexter Adams
我在strapi+ nginx安装中遇到了问题。访问管理员页面时,会收到ECONNRESET错误。更改nginx目录的所有权是解决方法。非常感谢! - Jack
这是我在网上搜寻了两天后看到的最佳解决方案。感谢@DfKimera,愿上帝保佑你。 - ganji
显示剩余7条评论

28

在 AWS 上遇到了这个问题,发现在站点配置文件中添加一些 proxy_buffer 指令可以解决这些问题:

server {
    ...

    location / {
        ...
        proxy_buffers 8 1024k;  
        proxy_buffer_size 1024k;
    }
}

3
这解决了我的问题。你有什么想法为什么会有帮助吗? - adotout

6

对我来说,DfKimer推荐的解决方案是可行的,但是我使用的路径是/var/cache/nginx而不是/var/lib/nginx


我正在使用 Mac v12.4,并通过 Homebrew 进行安装,它的路径为 /opt/homebrew/var/run/nginx - nonethewiser

1

proxy_set_header Connection keep-alive;

代理设置头连接保持活动状态;


完整配置

server {
        listen      0000; #//port give by your need
        server_name  aa.com;
        proxy_buffers 16 4k;
        proxy_buffer_size 2k;


        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        location ~ ^/hello/{
            proxy_buffering off;
            proxy_pass http://127.0.0.1:1111; #//port give by your need
            proxy_redirect     off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Connection keep-alive; 
        }

1
由于服务器内存已满,我遇到了这个错误。希望这能帮助未来的任何人。

在我的Kibana服务器上也是一样,'df -h'显示服务器已满,nginx无法缓存新文件到/var/cache/nginx,导致Kibana无法加载(Kibana未能正确加载)。释放一些空间解决了这个问题。 - Xavier FRANCOIS

1

对我来说,解决方案是启用proxy_max_temp_file_size


1

PHP和Nginx Web服务器的100%工作解决方案

问题 => net::ERR_INCOMPLETE_CHUNKED_ENCODING nginx

步骤1:打开/etc/php/7.2/fpm/pool.d文件夹[选择您的php文件夹,在我的情况下,我正在使用php 7.2]

步骤2:编辑pool.d文件夹中的www.conf文件

在我的情况下,它看起来像这样 =>

[inet]
user = www-data
group = www-data

listen = 127.0.0.1:9999
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 5

pm.status_path = /status
ping.path = /ping

request_terminate_timeout = 10s
request_slowlog_timeout = 10s

;
; Log files
;
access.log = /var/log/php-fpm/php-fpm.log
slowlog = /var/log/php-fpm/slow.log

步骤三:更改request_terminate_timeout的值为10秒(或您想要的任何时间)。

request_terminate_timeout = 300s

第四步:现在保存并重新启动php-fpm(在我的情况下,我使用的是php7.2,所以命令将是)

sudo service php7.2-fpm restart

现在可以执行你的脚本,它将会运行并在300秒后终止。
现在还有一件事,在nginx.conf文件或者你的网站.conf文件中添加一行语法fastcgi_read_timeout 300;[以下是代码片段]。
user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http { 
include /etc/nginx/conf-enabled/*.conf;
include /etc/nginx/sites-enabled/*.conf;    
}

在添加 fastcgi_read_timeout 300; 后,它将如下所示。
user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http { 
include /etc/nginx/conf-enabled/*.conf;
include /etc/nginx/sites-enabled/*.conf;
fastcgi_read_timeout 300; 
}

现在按照以下命令重新加载nginx并重启php-fpm。
sudo service php7.2-fpm reload
sudo service nginx reload

注意:这段代码片段已经由我运行和测试,请让我知道如果您无法通过我的答案解决问题。


0
如果代理服务器无法写入/var/lib/nginx,您无需更改该目录的文件权限或所有权。您可以通过以下方式更改Nginx上下文的缓存目录;
proxy_temp_path /home/emre/projects/frontend/nginx_temp 1 2;

nginx.conf 文件的 httpserverlocation 上下文中。

请查看 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_temp_path


0
为了给这个线程添加另一个解决方案,我想提供一下我的经验。在使用SSE后,我从Nginx得到了错误代码(failed)net::ERR_INCOMPLETE_CHUNKED_ENCODING,但是如果我直接调用服务器,它就可以正常工作。原因是Nginx设置了60秒的读取超时时间。可以通过使用proxy_read_timeout指令来覆盖它,例如以下示例将其设置为24小时:
proxy_read_timeout 24h;

0

这个错误是由nginx尝试使用缓存文件夹而没有正确访问权限造成的:

  1. 确保nginx用户可以写入/var/lib/nginx(或在某些发行版中为/var/cache/nginx)。
  2. 确保nginx用户可以写入文件夹(通常位于/etc/nginx/nginx.conf中查找nginx配置文件中的nginx用户)
  3. 授予正确的访问权限(chown -R nginx:nginx /var/lib/nginx/
  4. 重新加载服务(-service nginx reload -in centos)

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