NGINX RTMP + Google Cloud 自动缩放上的共享资源

NGINX RTMP + Google Cloud 自动缩放上的共享资源

我正在为我的 nginx RTMP 服务器构建可扩展的基础架构。我已经:nginx + arut-rtmp 模块 + ffmpeg在服务器上。这是托管组实例内第一个架构的方案

第一种方案 这个方案的问题很简单:输入流仅在服务器上,服务器 2 上的观众将无法观看直播

编辑2:在这种情况下,我的浏览器工作正常:直接从服务器获取所有 .ts 文件,它就可以正常工作!显然,就像已经说过的,这个解决方案不可扩展。

所以...我认为我们需要所有新实例共享一些东西。 我在每个实例上都安装了一个带有 gcsfuse 的 google bucket. (我始终使用托管组实例) 第二种方案

这种情况下的问题:当输入流的服务器正在创建 .ts 段时,每次创建段时,存储桶都会用 0 字节的 .ts 进行更新。当服务器完成 .ts 的写入时,存储桶会获取更新的 .ts 文件。所以它并不是真正的“共享”...

编辑2:在这种情况下,我的浏览器仅加载前 1/2 个 .ts 段,然后卡在循环加载 m3u8 上。

所以,我测试了这些解决方案,但没有效果。我是不是搞错了什么?桶不是合适的选择吗?

谢谢

附言:我在存储桶上添加了云 CDN,因此从我的应用程序中,我可以直接从 CDN 获取 .ts 片段。问题是,在 2/3.ts 之后,我的应用程序只能获取 m3u8,而无法获取其他 .ts(我的 cdn 有 .ts!)

EDIT1:就像第一次加载 m3u8 之后一样,它会获取已经加载的第一个 .ts……但之后无法获取下一个 .ts!

编辑3:这是我的浏览器加载的内容:

chrome_console

循环加载的m3u8是:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:10
#EXT-X-DISCONTINUITY
#EXTINF:4.167,
0.ts
#EXTINF:4.167,
1.ts
#EXTINF:6.666,
2.ts
#EXTINF:4.167,
3.ts

bucket上真正的m3u8是:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:10
#EXT-X-DISCONTINUITY
#EXTINF:4.167,
0.ts
#EXTINF:4.167,
1.ts
#EXTINF:6.666,
2.ts
#EXTINF:4.167,
3.ts
#EXTINF:6.133,
4.ts
#EXTINF:4.734,
5.ts
#EXTINF:10.016,
6.ts
#EXTINF:6.450,
7.ts
#EXTINF:8.317,
8.ts
#EXTINF:7.183,
9.ts
#EXTINF:5.850,
10.ts
#EXTINF:2.050,
11.ts

编辑3: 嗯...可能是 CDN 的缓存问题?在这种情况下,我可以在哪里编辑缓存配置?

编辑4:这是当前方案,它给我带来了文件 m3u8 无法在我的播放器上正确更新的问题

当前案例

更新:

尝试了两个应用程序同时(仅改变我在播放器上获取的来源):

  1. 直接指向服务器上的 m3u8(我已使用 gcsfuse 安装存储桶)
  2. 指向 CDN 上的 m3u8

第一种情况有效:m3u8 每次都会更新。第二种情况 m3u8 加载第一种配置(例如,尝试在已创建 20 个 ts 段后打开)。它加载第一个 m3u8...然后循环重新加载文件的相同版本。

正如我所说,流媒体是相同的:只是 m3u8 的源是从不同的方式获取的:直接从安装在服务器上的存储桶获取,或者直接从 cdn 获取(即在同一个存储桶上)。

更新2:重试了所有方法,如果我从我的 cdn 下载 m3u8...我得到的文件也没有更新。如果我从 bucket 中获取相同的文件,它就会更新!! 我试图将我的播放器指向 storage.google,但从我的网站我收到 cors 错误...尝试从控制台(使用 gsutil)更改 cors 设置,但无济于事。 如何防止 CDN 上的缓存?我已经将标头设置为无缓存和无存储:/

这是我的云 CDN 缓存命中率......

在此处输入图片描述

答案1

这个问题很复杂,但您可以使用CDN 故障排除页面查明收到的响应是否来自缓存。

您还可以尝试缓存失效,即在对象正常过期时间之前将其从缓存中删除的过程。您可以通过请求缓存失效。验证这是否能给你预期的结果,如果是的话,你可能需要查看缓存细节并调整到期时间。

如果你想停止缓存内容,你可以关注 GCP 文章防止缓存

防止缓存要防止私人信息缓存在 Cloud CDN 缓存中,请执行以下操作:

在不应存储在 Cloud CDN 缓存中的响应中包含 Cache-Control: private 标头,或在不应存储在任何缓存(甚至是网络浏览器的缓存)中的响应中包含 Cache-Control: no-store 标头。不要对提供对私人信息的访问权限的 URL 进行签名。当使用签名 URL 访问内容时,无论响应中的任何 Cache-Control 指令如何,它都可能符合缓存条件

相关内容