nginx访问日志报错:[error] 4560#4560_ _117823 client intended to send too large body_ 7562419 bytes,错误码413

问题描述

对接其他系统接口时,对方说请求我们接口报错,让对方发了相关请求报文,查看后台程序日志,发现并没有相关请求报文日志,也没有任何访问信息,猜测是在nginx代理时候就已经出错被拦截。

解决办法

查看nginx访问错误日志,可以看到如下报错:
[error] 4560#4560: *117823 client intended to send too large body: 7562419 bytes
看报错意思是客户端请求体超长。查看nginx相关配置,发现没有额外设置扩大请求体大小。因为nginx默认最大的请求体大小为1M,看报错信息很明显超过了1M(7562419 bytes=7.21M)。通过配置client_max_body_size 20M把请求体最大值设置成20M,避免请求体过长报错解决。

client_max_body_size说明

client_max_body_size可以配置在全局的nginx.conf中的http{ }中设置:client_max_body_size 20m;
也可以选择在server{ }中设置:client_max_body_size 20m;
还可以选择在location{ }中设置:client_max_body_size 20m;
三者有区别

  • 设置到http{}内,控制全局nginx所有请求报文大小
  • 设置到server{}内,控制该server的所有请求报文大小
  • 设置到location{}内,控制满足该路由规则的请求报文大小

ngix.conf完整配置案例:

user  nginx;

worker_processes  auto;
# worker_cpu_affinity  auto;
worker_rlimit_nofile    65536;

# pid             /data/software/nginx/run/nginx.pid;

events
{
        use     epoll;
        worker_connections      65536;
}

http
{
        include mime.types;
        default_type    application/octet-stream;
        charset  utf-8;

        server_names_hash_bucket_size 128;
      #client_header_buffer_size的配置为4k,如果(请求行+请求头)的大小如果没超过4k,放行请求。
      #如果(请求行+请求头)的大小如果超过4k,则以large_client_header_buffers配置为准
        client_header_buffer_size 4k;
       #large_client_header_buffers的配置为4 32k,则对请求有如下要求
          #请求行(request line)的大小不能超过32k,否则返回414错误
          #请求头(request header)中的每一个头部字段的大小不能超过32k,否则返回400错误(实际是494错误,但nginx统一返回400了)curl -H "header1=aaa" -H "header2=bbb" -v http://127.0.0.1/,这里的header1=xxx和header2=xxx就是请求头中的头部字段
          #(请求行+请求头)的大小不能超过128k(4 * 32k)
        large_client_header_buffers 4 32k;
        #限制请求体的大小,若超过所设定的大小,返回413错误。默认1m
        client_max_body_size 20m;
        # 指定访问日志的格式和存放路径
        access_log  /usr/local/var/log/nginx/access.log  main;
  
        open_file_cache max=65536 inactive=20s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 1;

        sendfile on;
        tcp_nopush on;
        keepalive_timeout 60;
        tcp_nodelay on;
        server_tokens off;
        port_in_redirect off;

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 128k;

        #open gzip
        gzip on;
        gzip_vary on;
        gzip_min_length 1k;
        gzip_buffers 4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_types      text/plain      application/x-javascript text/css application/xml;
        gzip_disable "MSIE [1-6]\.(?!.*SV1)";

        #Proxy
        #若上传文件很大,还要适当调整上传超时时间。
        proxy_connect_timeout   600;
        #http请求被容器(tomcat, netty等)处理后,nginx会等待处理结果,也就是容器返回的response。
        #此参数即为服务器响应时间,默认60秒。
        proxy_read_timeout      600;
        #http请求被服务器处理完后,把数据传返回给Nginx的用时,默认60秒。
        proxy_send_timeout      600;
        proxy_buffer_size       32k;
        proxy_buffers   4       128k;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size      256k;

        #Limit
        limit_req_zone $binary_remote_addr  zone=xxx:10m rate=5r/s;

        #Log format
        # 声明日志格式,request_length用来输出每一个请求的大小(请求行+请求头+请求体)
        log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" $http_x_forwarded_for';

        #server
        #{
        #listen 80 default;
        #server_name _;
        #return 403;
        #}

        include vhosts/*.conf;

}

更多nginx相关配置可以查看我这篇文章:nginx安装和配置详解

猜你喜欢

转载自blog.csdn.net/qq_35427589/article/details/124960901