Nginx

NGINX“proxy_cache_valid”可以相對於 Last-Modified 而不是收到的時間嗎?

  • December 28, 2018

我一直在努力讓 NGINX 記憶體 HTTPS 反向代理伺服器正確記憶體實時 DASH 和 HLS 影片流。

我目前的想法是,我的主要問題可能是 NGINXproxy_cache_valid指令似乎與文件進入記憶體的時間有關。我認為我需要的是記憶體保留與Last-Modified標題欄位相關。sub_filter_last_modified onNGINX 通過and提供對此的訪問$upstream_http_last_modified,但我還沒有找到如何將“Last-Modified + 10 seconds”設置為記憶體過期時間。

  1. 有沒有辦法設置proxy_cache_valid為“Last-Modified + 10 seconds”?

我發現的另一種可能的方法是讓後端為X-Accel-Expires標頭欄位提供一個@(參考: http: //nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid)。

  1. X-Accel-ExpiresNGINX記憶體實時媒體內容是“最正確”的方式嗎?
  2. 還有其他更好的方法我應該調查嗎?

提前致謝。(這是我在這個蘋果上的第三口,我之前的問題太模糊和無能為力,無法得到有用的答案。


對於那些不熟悉 HTTP 直播影片流的人的一些背景/概述/上下文:

影片流從數字電視調諧器 (ATSC @ 1080i) 提供的 MPEG 傳輸流 (TS) 開始,該傳輸流 (TS) 被饋送到實時生成 3 種解析度(720p、480p、360p)的 MPEG 轉碼器(帶有硬體輔助的 ffmpeg) )在 CBR(恆定比特率)中,然後饋送到打包器(例如,GPAC 或 Shaka),該打包器生成動態媒體文件(清單/播放列表 + 音頻 + 影片)用於頻寬自適應流(例如,衰落的 WiFi 導致解析度減少,當頻寬提高時會自動增加)。

每 2-10 秒(“分段時間”)創建新文件集,具體取決於打包程序的配置方式;我們目前使用 10 秒的分段來最小化傳輸次數,儘管我們希望最終達到 2 秒以最小化延遲。所有這些文件都由 NGINX 通過一個列出可用實時流的簡單頁面提供。

為了讓您了解規模,單個 1080i 輸入會生成 3 個 CBR 流,每個都打包為 DASH 和 HLS,用於從每個輸入流創建的 6 個輸出流。總共,對於每個 1080i 輸入,打包器每 10 秒輸出 10 個文件。使用 24 個 1080i 輸入(在許多城市並不罕見),即每 10 秒有 240 個新文件,或每小時有 86,400 個新文件。記憶體大小適合 1 分鐘的歷史記錄,或 1,440 個媒體文件 (<1 GB)。

影片和音頻段文件(包含 MPEG 數據)是用唯一的名稱創建的,因此讓它們 LRU 脫離完整的記憶體是沒有問題的。但是 DASH 清單和 HLS 播放列表是格式化的文本文件,每次分段都會重寫(以列出新的音頻和影片分段文件),因此清單/播放列表在更新時必須被替換。

Tuner-trancoder-packager 的工作很出色,但它不是一個超過十幾個客戶端的出色 Web 伺服器,主要是由於 HTTPS 的成本。需要外部記憶體 HTTPS 反向代理來最小化這種負載,它的工作是看起來像一個客戶端,無論有多少實際影片使用者。但是,影片使用者不應該知道存在記憶體反向代理,因此始終正確的記憶體至關重要。

我目前看到記憶體中的影片偶爾會凍結,儘管它可以直接從影片伺服器上正常播放。HLS 比 DASH 早,但兩者都會在 1-8 小時內凍結。

影片伺服器和記憶體反向代理都執行 NGINX 以利用(調整/優化)組合功能集。

我發現的用於流媒體伺服器的 NGINX 記憶體 HTTPS 反向代理的最佳工作範例來自這裡:https ://docs.peer5.com/guides/use-nginx-as-wowza-cache/

它只需要針對我的特定環境進行少量修改。

引用自:https://serverfault.com/questions/945880