Nginx proxy_pass 不雅关闭连接

Nginx proxy_pass 不雅关闭连接

我在我的服务器上获得了 Nginx over Nginx 配置。

服务器方案

Nginx A -> Nginx B -> PHP FPM

(如果你想知道下面隐藏的原因,那是因为两者之一在Docker容器中。)

问题描述

当客户端想要下载大文件时,Nginx A 接收请求,将其转发给 Nginx B,然后由 Nginx B 将其发送到 PHP FPM。

如果我SIGQUIT向 Nginx B 发送一个信号,它会等待所有请求的文件都传输完毕,然后正常关闭。在此期间,Nginx A 会成功将所有数据包重新传输到客户端。

但是:当 Nginx B 发送完最后一个数据包并关闭时,Nginx A 会捕获 Nginx B 已关闭的连接,并在向客户端传输最后一个数据包之前关闭与客户端的连接。

实验

我在测试期间检索到的信息:

  • 平均而言,发送到客户端的文件缺少不到 8 MB(尝试使用小文件以及 1 GB 或 4 GB 等大文件)
  • Nginx A 记录错误upstream prematurely closed connection while sending to client(它不应该,它应该完成将数据包发送到客户端,然后关闭此连接而不会出现任何问题)。
  • 如果我直接将客户端连接插入 Nginx B,并发送一个SIGQUIT,客户端确实收到连接关闭前的所有数据包

配置

NginxA配置文件:

  server_name mywebsite.io;

  access_log /var/log/nginx/mywebsite.io.access.log;
  error_log /var/log/nginx/mywebsite.io.error.log error;

  include /etc/nginx/conf.d/server/default.conf;
  include /etc/nginx/conf.d/server/ssl.conf;
  include /etc/nginx/conf.d/server/csp.conf;
  
  location / {
    client_max_body_size 10G;
    client_body_timeout 43200s; # 12h
    proxy_read_timeout 1800s; # 30m
    proxy_max_temp_file_size 0;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Host $server_name;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_http_version      1.1;
    proxy_set_header        Upgrade $http_upgrade;
    proxy_set_header        Connection "upgrade";
    proxy_pass              http://127.0.0.1:8000;
  }

NginxB配置文件:

  listen 80;

  root /var/www/html/public;

  server_name _;

  index index.php;

  client_max_body_size 10G;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_read_timeout 600s; # 10m
  }

我尝试调整许多参数:

client_max_body_size、client_body_timeout、proxy_read_timeout 1800s、proxy_max_temp_file_size、proxy_buffering、proxy_connect_timeout、proxy_send_timeout、proxy_intercept_errors、proxy_buffers、proxy_busy_buffers_size、proxy_buffer_size、proxy_set_header 的“连接”为空...

三天时间都浪费在这上面了,如果你有什么想法可以帮助我,那就太感谢你了!我想了解到底发生了什么 :/

相关内容