504,nginx无错误日志?

描述:

  1. 提交大数据查询操作,会在2min内出现504报错(时间不定,有时候是1.5min有时候是1.6min)
  2. nginx与gunicorn超时时间同样是600,测试环境设置相同timeout等未复现此问题(不过测试环境未与正式环境100%一致,没有gunicorn),可以执行到4-5分钟乃至更长
  3. 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 配置如下
image.png

与此网站相关配置如下
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,是后端框架,也不是手动抛出来的,是后端框架出错自己断开了连接

阅读 2.4k
1 个回答

你上面的警告,你得先增加 client_body_buffer_size 的值,让请求可以被缓存到内存中,而不是写入到磁盘上,增加一下gunicorn的工作进程数量。这样可以让gunicorn能够处理更多的并发请求

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题