UEditor導致的上傳大檔案失敗
之前寫過一篇《鬧心的Broken pipe》,nginx導致的請求超時,但是今天又碰到個奇葩事兒,容我喝一口82年的白開水慢慢道來
源起
專案中用到視訊上傳,兩種上傳方式,一種直接表單提交,一種內嵌到UEditor中提交,視訊檔案上傳到第三方視訊點播伺服器,此為前提。
問題一
程式碼寫好,測試,提交,釋出,沒毛病。因為網速不好,所以測試為了方便都使用的大小几M的小視訊,上線測試,沒問題。第二天得到反饋,上傳100M的視訊會出現“上傳失敗,請重試”,而小視訊則不會。

1.png
問題排查
-
先看瀏覽器返回錯誤,preview和response下都是空白,明顯沒返回值。
2.png
- 檢視後臺http請求,往第三方傳送,是否超時
發現請求還在傳送中時候前端已經返回超時 - 用表單直接提交100M視訊檔案,沒問題
問題定位
以上排查將問題定位在了UEditor,繼續查詢UEditor的上傳,專案使用的ACE-admin,查詢關聯,UEditor上傳使用了webuploader.js,繼續跟下去,看到如下程式碼:
Transport.options = { server: '', method: 'POST', // 跨域時,是否允許攜帶cookie, 只有html5 runtime才有效 withCredentials: false, fileVal: 'file', timeout: 6 * 1000,// 6 s formData: {}, headers: {}, sendAsBinary: false };
猜測是這裡的問題,於是將timeout改長一點,60min(由於網速原因,100M檔案單獨上傳測試10min左右),修改後重新測試,成功
然而,你以為這就結束了嗎?至少我以為是的,BUT!!!
問題二、生產環境
生產環境測試上傳也沒問題,但是第二天突然出現整個服務越來越慢,最後直接整個服務垮掉的情況。生產環境採用微服務架構,nginx代理,由於上次的教訓,迅速猜測nginx問題導致。
測試:不通過nginx直接訪問網站等,沒問題,通過nginx訪問掛掉
日誌:檢視nginx/logs/error.log,出現大量“Too many open files”錯誤
定位:由於太多的http連線沒釋放導致卡死
nginx配置
keepalive_timeout600000;
keepalive_timeout (單位:s): 簡單說,就是一個請求結束後多久超時,被釋放。以上60w秒≈7天釋放,手動“我的天啊.gif”,改為預設60s,問題解決
總結
在寫每一行程式碼,改每一個配置之前,一定要知道他是幹什麼用的,不能盲改。
一切你認為沒問題的問題,都是能力不足的表現。