Nginx 限制上传文件大小,大文件失败

这里写图片描述

  • 问题描述: 公司ios和Android客户端时有上传图片失败的情况,经过测试确认只有大文件上传失败。

  • nginx.conf 配置

#user  nobody;
worker_processes  4; # 进程数,建议跟CPU核数相同

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  65535; # origin is 1024
    multi_accept on;
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    charset utf-8; # 头文件中的默认的字符集

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    server_names_hash_bucket_size 1280;

    client_header_buffer_size 1280m;
    large_client_header_buffers 4 1280m;
    client_max_body_size 1000m; # 允许客户端请求的最大单文件字节数
    client_body_buffer_size 2560m; # 缓冲区代理缓冲用户端请求的最大字节数

    server_tokens  off;
    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;

    keepalive_timeout  10; # 原始值为 65

    proxy_connect_timeout 60;
    proxy_read_timeout 60;
    proxy_send_timeout 60;
    proxy_buffer_size 32k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k; # 缓存文件夹大小
    proxy_temp_path /tmp/proxy_temp_dir; # 缓存目录
    proxy_cache_path /tmp/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=7d max_size=2g;

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 5m;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/javascript application/xml application/xml+rss;

    include conf.d/*.conf;

}

一、 故障原因

  • 当上传的文件大于 “proxy_temp_file_write_size“ 设置的值时,nginx会先将文件写入“proxy_temp_path ”缓存目录(默认为nginx安装目录下/proxy_temp目录)
  • 3服务器没有创建 /tmp/proxy_temp_dir 目录
  • 4服务器 /tmp/proxy_temp_dir nobody用户没有写权限

二、 解决步骤

  • 3 服务器:创建 /tmp/proxy_temp_dir 更改拥有者为nobody
  • 4 服务器:/tmp/proxy_temp_dir 更改拥有者为nobody
  • nginx 重启 问题解决

三、 注意事项

  • nginx 如果开启缓存参数,当前运行nginx的用户对两个参数设置的目录和上层目录一定要有写入权限。
    • proxy_temp_path
    • proxy_cache_path
### Java 文件上传大小限制设置 在Java应用程序中,文件上传的大小可以通过多种方式来控制。对于基于Servlet的应用程序来说,在配置文件或代码内部设定最大允许上传文件尺寸是一种常见做法。 当使用Apache Commons FileUpload库处理文件上传请求时,可以指定`DiskFileItemFactory`对象的最大字节数属性来限定单个文件大小[^1]: ```java // 创建磁盘工厂并设置缓冲区大小和临时目录位置 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); // 设置内存阈值为4KB factory.setRepository(new File("/tmp")); // 构建解析器实例,并定义整个HTTP POST请求体的最大长度 ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(1024 * 1024 * 5); // 设定最大可接受文件总容量为5MB ``` 如果应用部署于Tomcat服务器上,则可以在`web.xml`描述符内通过初始化参数调整默认行为[^3]: ```xml <multipart-config> <!-- 单个上传项的最大大小 (单位: 字节) --> <max-file-size>20848820</max-file-size> <!-- 请求中的数据总量上限 --> <max-request-size>418018841</max-request-size> <!-- 存储到硬盘前保存在内存里的数据量 --> <file-size-threshold>1048576</file-size-threshold> </multipart-config> ``` 另外值得注意的是,前端浏览器发送POST请求之前也会受到其自身以及中间件(如Nginx反向代理)所施加的各种约束条件影响。例如,在Nginx配置文件里存在名为`client_max_body_size`指令专门用来规定客户端提交内容主体的最大体积,默认情况下该值被设为了1兆字节(MB)[^4];因此适当增大此数值同样有助于解决大文件传输失败的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值