post请求体过大服务端报错,却没有日志输出?
2022-05-19 本文已影响0人
姜治宇
服务器报错却没有日志输出
最近发现这样一个问题:
当执行一个保存的接口时,post的请求体过大会导致服务器报错。
查了nginx的error.log和access.log,却没有任何输出,请求压根没传到服务器。
这是怎么回事呢?
问题排查
一般来说,对post的请求体body并没有任何大小限制,但可以在nginx或node代码中做人为的限制。一旦触发了设置条件,请求会被直接打回,此行为并不会记录到日志中。
我们可以把nginx的client_max_body_size设置的大一些;如果是直连node服务端,也可以通过代码进行限制,就不会出现上述问题了。
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json({limit: '50mb'}));//使能 post 50mb以下的数据
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
nginx请求体设置
nginx限制请求体主要有以下几项:
1、client_max_body_size
限制请求体的大小。如果超过了所设定的大小,返回413错误。
413 Request Entity Too Large
2、client_body_timeout
读取请求实体的超时时间。一旦超过了所设定的大小,返回413错误。
3、client_header_timeout
读取请求头的超时时间。一旦超过了所设定的大小,返回408错误。
4、proxy_connect_timeout
http请求无法立即被容器(tomcat等)处理,被放在nginx的待处理池中等待被处理。
此参数为等待的最长时间默认为60秒,官方推荐最长不要超过75秒。
5、proxy_read_timeout
http请求被容器处理后,nginx会等待处理结果。也就是容器返回的response,此参数即为服务器响应时间,默认60秒。
6、proxy_send_timeout
http请求被服务器处理完后,把数据传返回给nginx的用时,默认60秒。