一、问题描述
环境:申威CPU、统信系统,nginx在线安装。 问题:客户端通过nginx配置的下载代理,大文件固定下载到2G时,都会下载中断,下载失败。 查看nginx报错信息如下:
二、问题原因
在网上折腾好了好久说是因为可能是nginx缓存区限制问题,禁用缓存即可。根据指引配置过后,还是不行。
proxy_pass http://127.0.0.1:5002; proxy_redirect default; proxy_buffering off;
后来一行一行的查看nginx配置文件终于发现问题,由于在线安装的nginx 默认开启了sendfile off 。在下载文件时nginx会经过系统内核导致的。但是系统内核缓冲区都有大小限制,如果文件的大小超出了系统内核缓冲区大小就会出现无法下载的情况。
sendfile = off 时,应用程序读取磁盘中的文件以字节流的形式从磁盘中加载文件,然后再将文件以字节流的形式复制到内核中。内核在把文件推送到NC。 sendfile = on 时,应用程序直接向内核发送指令,让内核去读文件。读完文件内核直接推送给NC。只有一次复制操作,实现异步网络IO形式。因此,性能会有很大的提升。 具体还要根据实际使用情况来配置sendfile。当读取服务不能解析大量的文件时。还是建议将sendfile配置为off
通过 cat /proc/sys/net/core/rmem_max 命令查看系统内核缓冲区大小,发现系统内核区正好是2G。(显示的KB需要换算一下)
三、解决办法
vim 修改vim /etc/nginx/nginx.conf配置文件的sendfile on即可,保存重启nginx; (sendfile一般都在http中,注意配置文件的指向地址)
|