You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VestaCP安装的Nginx禁用缓存仍返回旧版m3u8文件求助

解决Nginx返回ffmpeg生成的m3u8缓存内容的问题

看起来你明明配置了禁用缓存,但Nginx还是返回ffmpeg持续更新的m3u8旧内容对吧?我帮你梳理几个可能的问题点和解决办法:

1. 检查VestaCP的配置优先级问题

VestaCP会自动生成站点的Nginx配置,可能存在全局缓存规则或者其他匹配m3u8的location规则优先级比你手动加的更高。比如如果配置里有location ~* \.m3u8这样的规则在你的location ~ /stream/(.*)\.m3u8之前,Nginx会优先匹配前者,导致你的禁用缓存配置根本没生效。

你可以打开站点的Nginx配置文件(一般在/home/USER/web/DOMAIN/conf/nginx.conf),检查你的规则是不是放在所有其他m3u8相关规则的前面,或者用更精确的正则(比如加上^和$限制完全匹配)来提高优先级:

location ~ ^/stream/(.*)\.m3u8$ { 
    # 你的配置内容
}

2. 禁用系统层面的sendfile缓存

Nginx默认启用的sendfile会利用内核缓冲区来加速文件传输,但对于ffmpeg持续更新的文件,内核可能会缓存旧的文件内容,即使你配置了no-cache也没用。你可以在这个location里加上以下指令:

sendfile off;
tcp_nopush off;

3. 完善缓存控制头,确保所有客户端都不缓存

除了你现有的头,加上Pragma: no-cache可以兼容一些旧的客户端,同时把root /;放在配置的最前面(Nginx指令顺序会影响配置生效),修改后的完整配置如下:

location ~ ^/stream/(.*)\.m3u8$ { 
    root /; 
    # 禁用内核级缓存
    sendfile off;
    tcp_nopush off;
    # 强制不缓存的响应头
    add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
    add_header Pragma 'no-cache';
    add_header Last-Modified $date_gmt;
    # 禁用Nginx自身的缓存机制
    if_modified_since off;
    expires off;
    etag off;
    proxy_no_cache 1;
    proxy_cache_bypass 1;
    max_ranges 0;
}

4. 确保配置真正生效

  • 先用nginx -t测试配置语法是否正确,避免语法错误导致配置不加载
  • 重启Nginx:systemctl restart nginx,或者用VestaCP的命令v-restart-web
  • 用curl -I https://your-domain/stream/your-file.m3u8查看响应头,确认Cache-Control和Pragma头是否正确返回,比如应该看到:

Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0
Pragma: no-cache
Last-Modified: [当前GMT时间]

5. 检查ffmpeg的写入方式

如果ffmpeg是先写入临时文件再改名替换原m3u8,可能会导致Nginx读取到旧的inode内容。建议你调整ffmpeg的命令,使用-hls_flags append_list参数,让ffmpeg直接在原文件后追加更新,而不是替换整个文件,比如:

ffmpeg -i your-input-stream -hls_time 10 -hls_list_size 5 -hls_flags append_list+delete_segments /stream/your-file.m3u8

6. 避免VestaCP覆盖手动配置

VestaCP有时候会在重建站点配置时覆盖你手动修改的内容,如果你修改的是自动生成的配置文件,建议你把自定义规则放在include的额外配置文件里,比如在站点配置里加include /home/USER/web/DOMAIN/conf/nginx-custom.conf;,然后把你的m3u8配置放在这个自定义文件里,这样重建配置时不会被覆盖。

内容的提问来源于stack exchange,提问作者cagri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:25:33