因此,我目前面临的问题是,当发出 HTTP 请求时,系统上的 NGINX 会不断在内存中缓存大量视频文件。这导致 NGINX 使用 20GB 以上的内存,而我不得不运行sync; echo 1 > /proc/sys/vm/drop_caches
(清除页面缓存)频繁地停止不断的交换。我在下面提供了相关的配置。
nginx.conf
location /protected/ {
internal;
alias /usr/share/nginx/html/videos/;
}
脚本.php
function Download(){
global $path, $fname;
$file = "$path/$fname";
header("Content-Type: video/mp4");
header("Content-Length: " . filesize($file));
header('Content-Disposition: attachment; filename="'.$fname.'"');
header("X-Accel-Redirect: /protected/$fname");
exit;
}
我在 nginx.conf 中尝试过:
sendfile off;
if_modified_since off;
expires off;
etag off;
proxy_no_cache 1;
proxy_cache_bypass 1;
open_file_cache off;
附言:我正在使用 pcstat 和 fincore 计算这些文件的内存使用情况,这些 MP4 文件在被用户观看时被 100% 缓存,每个文件的大小均为 5GB+。
答案1
可以通过设置禁用 nginx 提供的文件的操作系统缓存directio <size>
。<size>
是文件大小的阈值,大于该阈值的文件将直接使用 DMA 复制,并且不会缓存文件。