我已經設置了清漆坐在tomcat服務器前面。我注意到的是,在向瀏覽器發送任何響應之前,Varnish似乎等待整個頁面加載(所有css,js等)。在向瀏覽器發送響應之前,Varnish等待整個頁面加載
這會在用戶看到任何東西之前導致巨大的延遲。如果我繞過清漆並直接進入現場,它會立即響應。
儘管總頁面加載時間可能相似,但感覺是該網站很慢。
有沒有人遇到過這個?
我已經設置了清漆坐在tomcat服務器前面。我注意到的是,在向瀏覽器發送任何響應之前,Varnish似乎等待整個頁面加載(所有css,js等)。在向瀏覽器發送響應之前,Varnish等待整個頁面加載
這會在用戶看到任何東西之前導致巨大的延遲。如果我繞過清漆並直接進入現場,它會立即響應。
儘管總頁面加載時間可能相似,但感覺是該網站很慢。
有沒有人遇到過這個?
隨着加載的全部頁面(所有的CSS,JS等)你的意思是隻有嵌入的JS和CSS資源,我是對嗎?在發送給客戶之前,清漆會緩衝(並希望存儲)整個響應。如果您的後端以增量方式發送響應(例如,分塊),則非緩存頁面可能會顯得較慢,因爲它僅在後端發送其最後一部分後才通過清漆傳送。
如果這是一個問題,請更改應用程序的技術設計。確保大多數請求可以從緩存中提供(這些頁面將非常快)並且將css資源(瀏覽器緩存避免了根本不需要的請求)外部化。如果只有一小部分頁面緩慢且緩存不準確,請異步加載它(例如Ajax)。
還有增量渲染的概念(隨着更多資源可用,瀏覽器會重新渲染頁面),但我不明白Varnish如何改變這種行爲。
除非在HTML中嵌入JS和CSS,否則所描述的行爲在技術上是不可能的。 您的瀏覽器需要接收並解析HTML,才能提取<script>
和<link>
標籤併發送單獨的HTTP請求;即使他們到達相同的Varnish服務器,也不會知道他們是同一個「頁面」的一部分。
嘗試更改HTML以加載靜態(JS,CSS和圖像)不同的主機名稱,不會去光油;這應該使事情更容易調試。 您可以使用命令行HTTP客戶端獲得相同的結果,例如curl
。 如果您在這種情況下仍然看到相同的低性能,請查看光油日誌,它可能會給您提供不少想法,以便查看更多內容。隨意添加,作爲評論,這樣我們將能夠更好地幫助你。
我覺得你被塗料的反應緩衝困惑了。假設最快的後端可以響應一個100k頁面,對於給定的請求是10秒,每秒發送10k。如果您的堆棧中沒有清漆,則客戶端連接會直接隧道傳輸到後端,並且瀏覽器在1秒內開始接收數據(第一個10k,並開始解析,呈現並跟隨<link>
標籤等)。
隨着清漆在您的堆棧中,它發送第一個字節到客戶端之前等待後端發送整個頁面。因此,客戶端必須等待10秒鐘,直到它可以開始呈現頁面,跟在<link>
標籤之後。相信與否,這有兩個主要原因是好事。其一,如果該響應是可緩存的,則下一個客戶端將不必等待10秒鐘以便後端生成響應,而清漆將很快(ms,而不是s)提供服務。如果您的命中率很高,您應該優化,那麼必須等待響應的第一個字節的初始成本在未來的緩存命中中支付許多分紅。二,假設一個手機上的一個單點信號請求相同的100k頁面,但它不能像後端能夠生成的一樣快速下載頁面,它需要一整分鐘來接收100k頁面。使用清漆後,apache不必浪費連接並在整個分鐘內(大部分是空閒的,介意你)連線,而它將數據緩慢地傳輸到客戶端。它將數據儘可能快地發送到清漆,然後移動到下一個請求,而清漆緩慢地將數據發送到客戶端。
對於已知不可緩存的請求,您可以通過VCL配置varnish,如果您願意,可以配置爲return (pipe)
,這將導致無響應緩衝。它會在收到數據後立即將數據從您的後端發送到客戶端。但是在default.vcl管道中沒有使用。