描述:
- 提交大数据查询操作,会在2min内出现504报错(时间不定,有时候是1.5min有时候是1.6min)
- nginx与gunicorn超时时间同样是600,测试环境设置相同timeout等未复现此问题(不过测试环境未与正式环境100%一致,没有gunicorn),可以执行到4-5分钟乃至更长
- nginx error中没有504错误日志
问题:什么原因导致504,往哪个方向大概率复现
技术:
nginx + gunicorn + django
nginx与这个接口相关的错误日志如下,下面这个warn也没看懂,这个配置怎么会报这个warning,错误日志没有504相关内容
2023/07/08 20:42:03 [warn] 5629#5629: *6150342 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000049, client: 10.xxx.xxx.34, server: www.xxx.com, request: "POST /xxx/ HTTP/1.1", host: "www.xxx.com", referrer: "https://www.xxx.com/xxx/"
nginx日志如下:
60.191.37.34 - - [08/Jul/2023:20:43:38 +0800] "POST /xxx/ HTTP/1.1" 499 0 "https://www.xxx.com/submitsql/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "192.168.142.31"
线上ngxin 配置如下
与此网站相关配置如下
server{
listen 9100 ssl; # 监听的端口
server_name www.xxx.com;
client_max_body_size 2050M; # 处理Request Entity Too Large
client_body_buffer_size 1024K;
proxy_read_timeout 600s; # 超时时间与Gunicorn超时时间设置一致,主要用于在线查询
ssl_certificate /etc/xxx/xxx.crt;
ssl_certificate_key /etc/xxx/xxx.key;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host:9100; # 解决重定向404的问题,和listen端口保持一致,如果是docker则和宿主机映射端口保持一致
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# websocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /static {
alias /data/xxx/static; # 此处指向settings.py配置项STATIC_ROOT目录的绝对路径,用于nginx收集静态资源
# alias /data/xxx/static; # 此处指向settings.py配置项STATIC_ROOT目录的绝对路径,用于nginx收集静态资源
}
location /web {
alias /data/xxx/dist/;
autoindex on;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
location /documentation {
#root /home/xxx/documentation/dist/;
alias /data/xxx/dist/;
autoindex on;
index index.html index.htm;
}
# error_page 404 /404.html;
# location = /40x.html {
# }
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
}
==============================
更新:一直以为是nginx爆出了504,发现不是nginx,是后端框架,也不是手动抛出来的,是后端框架出错自己断开了连接
你上面的警告,你得先增加 client_body_buffer_size 的值,让请求可以被缓存到内存中,而不是写入到磁盘上,增加一下gunicorn的工作进程数量。这样可以让gunicorn能够处理更多的并发请求