Случайные ошибки 503 Varnish / Apache

Я запускаю cPanel на облачном сервере Rackspace, на котором размещено около 30 веб-сайтов. Я использую Varnish 3.0.3 + Apache 2.2.23. Я получаю случайные ошибки 503. Если я перезапущу процесс httpd, они исчезнут. Я проверил журнал ошибок Apache и не вижу ничего, связанного с ошибкой 503.

Вот мой конфиг Varnish:

backend default {
    .host = "198.61.161.65";
    .port = "8080";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
    }

Вот мои параметры запуска Varnish:

-a :80 -f /etc/varnish/default.vcl -T 127.0.0.1:6082 -t 120 -w 1,1000,120 -u varnish -g varnish -S /etc/varnish/secret -p http_max_hdr=256 -p http_resp_hdr_len=8192 -p http_range_support=on -s malloc,768M

Я запустил varnishlog и записал некоторые ошибки. Во всех них есть TxResponse = Service Unavailable. Для меня это означает, что Apache не отвечает на запрос Varnish своевременно. Вот пример:

17 SessionOpen  c 74.133.75.136 54227 :80
17 ReqStart     c 74.133.75.136 54227 1219297893
17 RxRequest    c GET
17 RxURL        c /
17 RxProtocol   c HTTP/1.1
17 RxHeader     c Host: www.archerytrade.org
17 RxHeader     c User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:20.0) Gecko/20100101 Firefox/20.0
17 RxHeader     c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
17 RxHeader     c Accept-Language: en-US,en;q=0.5
17 RxHeader     c Accept-Encoding: gzip, deflate
17 RxHeader     c DNT: 1
17 RxHeader     c Connection: keep-alive
17 VCL_call     c recv lookup
17 VCL_call     c hash
17 Hash         c /   
17 Hash         c www.archerytrade.org
17 VCL_return   c hash
17 VCL_call     c miss fetch
17 Backend      c 18 default default
17 FetchError   c http first read error: -1 0 (Success)
17 VCL_call     c error deliver
17 VCL_call     c deliver deliver
17 TxProtocol   c HTTP/1.1
17 TxStatus     c 503
17 TxResponse   c Service Unavailable
17 TxHeader     c Server: Varnish
17 TxHeader     c Content-Type: text/html; charset=utf-8
17 TxHeader     c Retry-After: 5
17 TxHeader     c Content-Length: 441
17 TxHeader     c Accept-Ranges: bytes
17 TxHeader     c Date: Wed, 17 Apr 2013 01:39:52 GMT
17 TxHeader     c X-Varnish: 1219297893
17 TxHeader     c Age: 0
17 TxHeader     c Via: 1.1 varnish
17 TxHeader     c Connection: close
17 Length      c 441
17 ReqEnd      c 1219297893 1366162792.398471832 1366162792.541639328 0.000244379 0.143036604 0.000130892
17 SessionClose c error
17 StatSess     c 74.133.75.136 54227 0 1 1 0 0 0 257 441

Я пробовал добавить в свой файл default.vcl следующее:

sub vcl_recv {
set req.grace = 15s;
...
}

sub vcl_fetch {
if (beresp.status == 500 || beresp.status == 503) {
set beresp.saintmode = 10s;
return(restart);
} 
set beresp.grace = 1h;
...
}

Примерно в то время, когда возникло около 503 ошибок, я обнаружил в Apache error_log ошибку PHP Fatal, Преждевременное завершение заголовков скриптов и Превышение лимита в 10 внутренних перенаправлений из-за возможной ошибки конфигурации.

Я пробовал увеличивать / уменьшать память для Varnish и значений тайм-аута. Я пробовал добавить более высокие значения http_max_hdr и http_resp_hdr_len.


person Gray Loon    schedule 18.04.2013    source источник


Ответы (2)


Мы используем APC на этом сервере, и объем выделенной памяти составлял всего 96 МБ. После увеличения памяти в несколько раз и отслеживания использования мы остановились на 312M. Частота попаданий в кэш составляет 99,7%, а фрагментация <0,2%. Ошибки Apache 503 практически полностью устранены.

person Gray Loon    schedule 03.05.2013

Вот что помогло мне решить проблему:

После выполнения следующей команды я узнал об ошибке:

$ varnishlog -b -q 'FetchError'

Ошибка была "- FetchError http: ошибка первого чтения: EOF", подробности можно найти на сайте varnish < / а>

Затем после настройки first_byte_timeout проблема была исправлена:

backend default {
  .host = "127.0.0.1";
  .port = "8888";
  .connect_timeout = 1s; # Wait a maximum of 1s for backend connection (Apache, Nginx, etc...)
  .first_byte_timeout = 5s; # Wait a maximum of 5s for the first byte to come from your backend
  .between_bytes_timeout = 2s; # Wait a maximum of 2s between each bytes sent
}

Подробности см. На странице Varnish 503 Solutions.

person mshakeel    schedule 13.10.2016