问题描述
对接其他系统接口时,对方说请求我们接口报错,让对方发了相关请求报文,查看后台程序日志,发现并没有相关请求报文日志,也没有任何访问信息,猜测是在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安装和配置详解
|