我在我的服务器上获得了 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 的“连接”为空...
三天时间都浪费在这上面了,如果你有什么想法可以帮助我,那就太感谢你了!我想了解到底发生了什么 :/