提供慢速頁面時清漆 503
當嘗試載入需要較長時間在 Web 伺服器上生成的頁面時,Varnish 不斷拋出 503 Service Unavailable。
在 varnishlog 中,我可以看到一個
FetchError c http read error: 0
錯誤,但我不太確定它的含義。我還嘗試增加後端超時:
backend default { .host = "x.x.x.x"; .port = "80"; .connect_timeout = 600s; .first_byte_timeout = 600s; .between_bytes_timeout = 600s; }
後端是 Apache 伺服器。
所有其他頁面工作正常。
有任何想法嗎?
錯誤消息的意思是(行號參考參考 varnish 2.1.3):
獲取標頭時
$$ bin/varnishd/cache_fetch.c:399 $$, 任何一個: a) 發生溢出
$$ bin/varnishd/cache_httpconn.c:170 $$ 或者
b) 呼叫 read() 時出錯
$$ bin/varnishd/cache_httpconn.c:175 $$ 最後的數字是 errno 的值,所以因為它是 0(沒有錯誤),所以我假設選項 a) 發生了,因為
read()
不設置 errno 不應該返回負數。使用以下程式碼檢測溢出
$$ bin/varnishd/cache_httpconn.c:167 $$返回否定結果:
i = (htc->ws->r - htc->rxbuf.e) - 1; /* space for NUL */
htc->ws
是一個struct ws
$$ bin/varnishd/cache.h:126 $$這是一個“工作空間結構” r 成員是該工作空間的保留長度。
htc->rxbuf
指一個struct txt
$$ bin/varnishd/cache.h:109 $$但沒有評論描述成員 (b & e) 所指的內容。也許開始和結束? 我不知道如何調整工作區的大小(或者即使它們是)但是 - 我真的在這裡猜測領域 - 我認為問題的一些可能原因是:
- 大量的標頭
- 很長的標題
- Varnish 如何調整工作區大小的錯誤(如果有)
嘗試通過搜尋以下空間來找到可以強制發生錯誤的點可能很有用:
- 標題長度
- 標頭數量
看看你是否能可靠地重現問題。
您可以通過增加
http_headers
執行時選項來解決此問題。(如果您執行的是 < 2.1,我認為這是一個編譯時或配置時選項)