Назад | Перейти на главную страницу

тайм-аут сервера и повторная попытка в HAProxy 502

У нас странная проблема с прокси-сервером HA. Хотя мы решили это, мы действительно не понимаем почему.

Настройка очень проста: балансировщик нагрузки и серверная часть Apache. Наша проблема возникает из-за http-запроса, который выполняется на Apache за 100 минут, прежде чем какой-либо вывод будет отправлен обратно.

В первой настройке у нас было timeout server 30 минут. В этом случае HAProxy представил ошибку 504, в журнале было показано sH--. Согласно документам:

Ход «сервер тайм-аута» перед тем, как сервер сможет вернуть свои заголовки ответа.

Поэтому мы увеличили время ожидания сервера до 60 минут. На этот раз мы получили (через 100 минут) ошибку 502 и в журнале SH--:

Сервер был прерван перед отправкой полных заголовков HTTP-ответа или отказал при обработке запроса.

Сначала мы подозревали сбой Apache, но затем мы заметили, что через 60 минут Apache получил второй запрос от HAProxy, который не отображался ни в одном файле журнала. Может быть, произошло следующее:

  1. Отправка запроса в HAProxy, а оттуда в Apache
  2. Через 60 минут HA Proxy решает, что соединение плохое, и повторно отправляет запрос (я думаю, с другим исходным портом). Apache начинает обработку этого второго запроса.
  3. Через 40 минут Apache завершает первую попытку и отправляет результаты обратно в HAProxy. HAProxy сбивается с толку, поскольку это ответ с первой попытки, поэтому он прерывается с 502 и регистрирует счетчик повторов 0 (как мы видели в журнале).

Кстати, только после того, как мы увеличили тайм-аут сервера до 2 часов, запрос был обработан без ошибок (без повторных попыток).

Удаленная конфигурация HAProxy 1.5.9:

global
   maxconn         4000     # Sets the maximum per-process number of concurrent connections.
   maxsslconn      1000     # Sets the maximum per-process number of concurrent SSL connections.
   maxcompcpuusage 95       # Sets the maximum CPU usage HAProxy can reach before stopping or decreasing the compression level.

defaults HTTP
   mode            http
   option          http-server-close        # Preserve client persistent connections while handling every incoming request individually, dispatching them one after another to servers, in HTTP close mode
   option          httplog
   option          forwardfor
   timeout connect 4s       
   timeout client  20s      
   timeout server  100s
   timeout http-request 20s  # Set the maximum allowed time to wait for a complete HTTP request
   maxconn         200
   default-server  inter 2s fall 6 rise 2 port 80

frontend dc2--fe
   bind            8.8.8.8:80 mss 1422
   default_backend dc2--active

backend dc2--active
   timeout server  7200s
   server          app37 10.0.0.97:80 check