上传大文件 nginx 报错 readv() failed (104: Connection reset by peer) while reading upstream

后台使用springMvc开发,之前是上传100M的文件,正常上传。当上传150M文件时候,发现上传失败,在nginx.conf的location中修改nginx中配置信息client_max_body_size 为 150M(之前是100M)还是报错。

29657#0: *722 readv() failed (104: Connection reset by peer) while reading upstream, client: x.x.x.x, server: 127.0.0.1, request: "POST /api/file_upload HTTP/1.1", upstream: "http://127.0.0.1:8080/api/file_upload", host: "x.x.x.x", referrer: "htt....

观察浏览器报错是500(这是后来问题解决的关键)。

查看浏览器response后发现log:

Apache Tomcat/8.0.30 - Error report

HTTP Status 500 - Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 1000000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8746370) exceeds the configured maximum (1000000)

type Exception report

message Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 1000000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8746370) exceeds the configured maximum (1000000)

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 1000000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8746370) exceeds the configured maximum (1000000)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:980)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size of 1000000 bytes exceeded; nested exception is org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8746370) exceeds the configured maximum (1000000)
    org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:162)
    org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142)
    org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1089)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:928)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

root cause

org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8746370) exceeds the configured maximum (1000000)
    org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:965)
    org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:310)
    org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:334)
    org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
    org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158)
    org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142)
    org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1089)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:928)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

note The full stack trace of the root cause is available in the Apache Tomcat/8.0.30 logs.


Apache Tomcat/8.0.30

 解决:

1、首先nginx中 client_max_body_size 150M是需要配置的,如果不配置会先报错413.上传的文件过大了。

2、通过500 和 返回的log可以发现是后台配置文件


   
   

在springmvc-servlet.xml中修改

启示:一定要看状态码,500一定是后台问题。之前我看到状态码后没有在意,一直在nginx上下功夫,找了很多nginx配置的问题,各种试之后还是没有任何变化。之后就是注意浏览器检查中的response了。之前看到500后没有点response看,如果早看了问题应该早就发现了。

 

你可能感兴趣的:(java)