【背景】
最近遇到一個奇怪的現象,前端vue,后端python,服務部署在服務器上面后,本來一切正常,但公司說要使用https訪問,想著也沒什么問題,切過去發現在沒有更改任何代碼的情況下,https的這個地址,流式輸出時,總是一卡一卡的,一次輸出一大段,而http這邊的地址,一切正常,輸出都是好著的,一個字一個字的崩,起初懷疑是證書的問題,更換證書后依舊卡頓。 經過curl命令排查, https請求時,后端響應明顯變慢,但是http正常, 排除代碼本身的原因。懷疑到nginx上后,經過一頓搜索,問題解決。
linux系統生成ssl證書后nginx配置可參考博主的另外一篇文章:
linux系統生成ssl證書后nginx配置_linux生成ssl pem-CSDN博客
先上解決辦法
server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;location /agent {proxy_pass http://backend;proxy_buffering off; # 關閉代理緩沖,確保流式傳輸}
}
核心配置:proxy_buffering off; # 關閉代理緩沖,確保流式傳輸
配置完后,nginx重新加載一下配置
nginx -s reload
深究原理:
我有個疑問: 相同的nginx配置,為什么 http訪問正常, https訪問好像被nginx 截流了呢? 為什么 http請求 沒有proxy_buffering off; 設置也正常響應呢?
這個問題的核心在于 HTTP 和 HTTPS 在 Nginx 代理中的處理方式不同。以下幾點解釋了為什么 HTTP 請求可以正常響應,而 HTTPS 請求在沒有關閉?proxy_buffering
?時表現出卡頓的現象。
這是因為
https
和http
協議在傳輸數據時使用的是不同的傳輸方式。http
協議使用的是明文傳輸,數據是一行一行地傳輸的,每行數據以回車符和換行符結尾。這種傳輸方式比較簡單,但是不夠安全,容易被竊聽和篡改。https
協議使用的是加密傳輸,數據是一大段一大段地傳輸的,每段數據的長度是不固定的。這種傳輸方式比較安全,可以保護數據的機密性和完整性,但是相對于http
協議來說,傳輸效率會稍微低一些。因此,如果你需要傳輸機密性較高的數據,建議使用https
協議進行傳輸。如果你需要傳輸的數據不太機密,可以使用
http
協議進行傳輸。
1. Nginx 代理行為差異:
- HTTP:在 HTTP 請求中,Nginx 默認會使用緩沖機制,但由于 HTTP 請求本身并不涉及加密和解密,數據的傳輸和處理通常比較快,即使啟用了
proxy_buffering
,只要后端響應速度快,客戶端也不會明顯感受到延遲。Nginx 能夠較快速地將緩沖的數據傳遞給客戶端,因此你感受不到 HTTP 請求的卡頓。 - HTTPS:HTTPS 請求涉及加密、解密過程,Nginx 需要處理 SSL/TLS 協議,導致響應的數據經過更多處理環節。在這種情況下,
proxy_buffering
緩沖機制可能會導致 Nginx 等待完整的響應數據塊,再將其推送到客戶端,增加了數據傳輸的延遲感,尤其在流式數據的場景中更明顯。
2. 緩沖的作用:
proxy_buffering
的默認行為:Nginx 默認會緩沖來自后端服務器的響應數據,緩沖滿了之后再一次性發送到客戶端。對于 HTTP 請求,數據包小而且無需解密,Nginx 處理較為快速,通常不會影響用戶體驗。- HTTPS 的復雜性:在 HTTPS 情況下,由于涉及加密和較大的數據包,Nginx 可能需要更長的時間來處理響應。而當啟用緩沖時,Nginx 會先緩沖較大的數據塊,再推送到客戶端,這使得 HTTPS 的流式響應延遲更為明顯。關閉
proxy_buffering
后,Nginx 可以直接將流式數據傳遞給客戶端,無需等待緩沖區填滿。
3. 流式傳輸的需求:
- 流式響應要求數據能夠即時從后端傳遞給前端,而不是經過代理服務器的緩沖。對于流式傳輸來說,
proxy_buffering
可能會阻礙這種即時時性。HTTP 由于傳輸開銷小,能承受一定的緩沖延遲,而 HTTPS 的加密過程放大了這個問題。
4. 數據包大小和網絡開銷:
- HTTPS 請求的每個數據包相對更大,因為它包含了加密后的數據。Nginx 可能需要緩沖這些較大的數據包,而一旦 Nginx 使用
proxy_buffering
進行緩沖處理,這種額外的等待時間會被放大。而 HTTP 請求沒有這種加密開銷,響應更快。
總結:
簡單來說,HTTPS 請求的流式響應之所以卡頓,主要是因為:
- 數據包更大:HTTPS 請求的數據包經過加密后確實比 HTTP 大一些,加密增加了開銷。
- 緩沖機制的影響:在 HTTPS 請求中,Nginx 的緩沖機制需要更多時間來處理這些加密的數據包,導致延遲。相比之下,HTTP 沒有加密開銷,即使啟用緩沖,數據傳輸也相對流暢。
因此,同樣的請求,HTTPS 因為加密、數據包較大,加上 Nginx 的緩沖,導致流式響應出現卡頓。關閉 proxy_buffering
后,Nginx 不再等待緩沖區填滿,而是直接傳輸數據,HTTPS 響應也就變得流暢了。
性能影響及優化建議
- ?性能影響?:https的加密和解密過程增加了處理時間,尤其是在流式數據的場景中,Nginx需要等待完整的響應數據塊才能推送給客戶端,這可能導致延遲感增加?。
- ?優化建議?:可以通過調整Nginx配置來減少緩沖,使用分塊傳輸編碼等方式來優化性能。此外,對于大數據處理,可以考慮使用更高效的算法和硬件資源來減輕CPU負擔?
https://juejin.cn/post/7417521775586770995
https://mp.weixin.qq.com/s?__biz=MzAxMjY5NDU2Ng==&mid=2651867175&idx=1&sn=8fe3429c9943c981480f7e51ed9a4133