我正在使用 jQuery 将一些表单数据发布到我的 Nginx 服务器,但有时会失败并出现 408 错误。当错误发生时,显然处理已发布数据的 php 脚本根本无法到达,因为我在第一行放了一些日志记录函数。最奇怪的是,对于相同的表单数据,脚本有时有效,有时无效。我不明白为什么。
浏览器:Microsoft Edge 101.0.1210.32
jQuery:1.12.4,发布数据的代码如下:
$.ajax({
url: 'save.php',
dataType: 'json',
type: 'post',
contentType: 'application/json',
data: JSON.stringify( { "comment": comment,"id":id} ),
processData: false
});
Nginx 日志:
[03/May/2022:15:11:01 +0700] "POST /save.php HTTP/1.1" 408 0 ...
Nginx 配置:
client_max_body_size 10M;
client_body_buffer_size 2048k;
client_header_timeout 60s;
client_body_timeout 60s;
keepalive_timeout 60s;
答案1
可以定义额外的日志格式 - 专门用于调试。在nginx.conf在部分http
http {
# ... other config lines
log_format request_body_log '$remote_addr $remote_user [$time_local] "$request" status:$status bytes_sent:$bytes_sent gzip_ratio:$gzip_ratio connection_requests:$connection_requests request_length:$request_length connection-serial-number:$connection request_time:$request_time "$http_user_agent" "$http_referer" request_body:"$request_body"';
# ...
}
要启用定位功能:
location / {
# ...
if ($request_method = POST) {
access_log /var/www/html/logs/nginx_request_body.log request_body_log;
}
}
这在日志中提供了有关每个 http 请求的大量信息。
附言此示例适用于较旧的版本,也许您的 nginx 版本有差异。
答案2
解决方案:我们降级了 docker 版本,现在容器(MTU 1500)位于主机网络上,默认 MTU 为 1496。