【问题标题】:NodeJS + Nginx: busboy behind an nginx reverse proxyNodeJS + Nginx:nginx 反向代理背后的 busboy
【发布时间】:2021-09-15 12:25:07
【问题描述】:

如果我启动 nodejs 服务器并使用busboy,那么我可以上传大文件(10+ gbs)但是当我使用相同的 nodejs 代码并使用 nginx 作为反向代理时,nginx 会抛出“413 请求实体太大了”

有人遇到过这样的问题吗?我们如何解决这个问题?我知道我可以设置一个“client_max_body_size”变量,但这意味着文件仍然会有一个硬限制。

我的 nginx 配置如下所示:


server {
  listen 80;
  server_name *.example.local;

  location /api {
    proxy_pass   http://host.docker.internal:5000;
    proxy_pass_header Accept;
    proxy_pass_header Server;
    keepalive_requests 1000;
    proxy_redirect off;
    proxy_buffering off;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection "upgrade";
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;
    client_max_body_size        100M;
  }

}

【问题讨论】:

    标签: node.js nginx busboy


    【解决方案1】:

    client_max_body_size 大小;

    设置客户端请求正文的最大允许大小。如果尺寸 在一个请求中超过了配置的值,413(Request Entity Too 大)错误返回给客户端。请注意,浏览器 无法正确显示此错误。 将大小设置为 0 会禁用 检查客户端请求正文大小。

    Source

    【讨论】:

      【解决方案2】:

      在您的 nginx 配置中,您有 client_max_body_size=100M。您需要根据自己的需要进行调整,例如 15G 等。此配置属性定义了客户端可以发送到 Nginx 的最大正文有效负载大小。如果有效负载大小大于此值,则将413 http status 发送到客户端。将其设置为 0(如 Taxel 所建议的那样)将禁用有效负载大小检查,但这会将服务器暴露于外部攻击,其中恶意用户通过发送可能会降低服务器性能的随机大文件使您的服务器忙碌。

      【讨论】:

      • 如果我将其设置为 0,并且如果用户上传 10 gb 文件,nginx 会将整个文件转储到服务器内存中还是会创建文件的读取流?
      • @Phantom007 是的,它会尝试缓冲它,但你可以禁用它trac.nginx.org/nginx/ticket/251
      • @Phantom007 这个答案对你有帮助吗?
      • 我必须在我的 nginx 配置文件 proxy_buffering off 中添加两个额外的指令; proxy_request_buffering off;
      • 好的。如果这个答案帮助你标记它,请
      【解决方案3】:

      回答我自己的问题:

      为了在我的 nginx 反向代理中禁用请求/代理缓冲,我必须在 nginx 配置文件中添加以下指令

      proxy_buffering off; 
      proxy_request_buffering off; 
      

      所以,现在我的 nginx 配置文件如下所示:

      server {
        listen 80;
        server_name *.example.local;
      
        location /api {
          proxy_pass   http://host.docker.internal:5000;
          proxy_pass_header Accept;
          proxy_pass_header Server;
          keepalive_requests 1000;
          proxy_redirect off;
          proxy_buffering off;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Ssl on;
          proxy_set_header    X-Real-IP       $remote_addr;
          proxy_set_header Host $host;
          proxy_http_version 1.1;
          proxy_set_header   Upgrade $http_upgrade;
          proxy_set_header   Connection "upgrade";
          proxy_connect_timeout       600;
          proxy_send_timeout          600;
          proxy_read_timeout          600;
          send_timeout                600;
          client_max_body_size        0;
          proxy_buffering             off; # <-----
          proxy_request_buffering     off; # <-----
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-14
        • 2014-04-24
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 2021-04-01
        相关资源
        最近更新 更多