今天在測試一個 nginx reversed proxy 上, 代理 upstream server mp4 檔案時的播放問題.
之前沒特別有這個狀況, 但今天開始不能播放(感覺應該是在ios 12.4起發生), 十分有趣, 從 nginx server log 也看不出來原因, 只知道 nginx server 在 ios safari request 時, sent-byte 大小小於原始的 mp4 檔案, 所以也只能從 ios safari 的 developer mode 來著手.
先進行 ios safari developer mode, 可以參考:
https://unrealnavigation.com/blog/web-inspector-with-ios-simulator
然後發現原來 safari 會 request byte-range 0-1 這樣的狀況, 難怪都不會送出完整結果, 這樣一來原因就明確了, 實務上的狀況可以參考這篇:
https://www.stirtingale.com/guides/2018/10/mp4-not-working-cloudflare
若是原本的 server 沒有支援 byte-range 時, 會導致 status 200 而非 safari 預期的 206, 而導致失敗. 接下來就可以來找解決方案.
以 nginx proxy_pass 的反向代理結構來看, 可以利用這個方案:
https://stackoverflow.com/questions/22728016/nginx-is-not-accepting-range-of-bytes
使用 proxy_force_ranges on; 即可.
當然, 原本的 upstream 也需要有支援才能解決.
如此一來, 便能在 ios safari 於 request mp4 資源時, 下達的 byte-range 於快取或未快取內容皆可正常工作.
PS. 於查找過程找到一篇介紹 nginx revered proxy hash key 算法資料可供參考:
https://tomme.me/nginx-proxy-cache-server/