haproxy 504 тайм-аут для apache

Очень новичок в haproxy и нам это нравится, за исключением проблемы 504, которую мы получаем. Соответствующий вывод журнала:

Jun 21 13:52:06 localhost haproxy[1431]: 192.168.0.2:51435 [21/Jun/2017:13:50:26.740] www-https~ beFootprints/foorprints 0/0/2/-1/100003 504 195 - - sH-- 2/2/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1"
Jun 21 13:54:26 localhost haproxy[1431]: 192.168.0.2:51447 [21/Jun/2017:13:52:46.577] www-https~ beFootprints/foorprints 0/0/3/-1/100005 504 195 - - sH-- 2/2/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1"
Jun 21 14:15:57 localhost haproxy[1431]: 192.168.0.1:50225 [21/Jun/2017:14:14:17.771] www-https~ beFootprints/foorprints 0/0/2/-1/100004 504 195 - - sH-- 3/3/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1"
Jun 21 14:22:26 localhost haproxy[1431]: 192.168.0.1:50258 [21/Jun/2017:14:20:46.608] www-https~ beFootprints/foorprints 0/0/2/-1/100003 504 195 - - sH-- 2/2/0/0/0 0/0 "POST /MRcgi/MRlogin.pl HTTP/1.1" 

Использование следующих значений времени ожидания в haproxy.cfg

defaults
        log     global
        mode    http
        option forwardfor
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  100000

Запуск на Ubuntu 16.04.2 LTS

Любая помощь и комментарий очень ценятся!


person Ads    schedule 21.06.2017    source источник
comment
Спасибо, что включили записи в журнал и сделали этот вопрос чистым, кратким и хорошо отформатированным. Вы удивитесь, как часто этого не происходит.   -  person Michael - sqlbot    schedule 22.06.2017


Ответы (2)


Проблема, похоже, связана с веб-сервером. Проверьте журналы, и вы должны найти длительные запросы.

Вот как я заключаю это.

Обратите внимание на sH-- в своих журналах. Это состояние сеанса при отключении. Это чрезвычайно ценно для устранения неполадок. Значения являются позиционными и чувствительными к регистру.

s: время ожидания на стороне сервера истекло во время ожидания отправки или получения данных сервером.

...итак, timeout server уволил, а...

H: прокси-сервер ожидал полного, действительного ответа HEADERS от сервера (только HTTP).

Сервер еще не закончил (возможно, даже не начал) ретрансляцию всех заголовков ответов на прокси, но соединение было установлено и запрос был отправлен.

HAProxy возвращает 504 Gateway Timeout, указывая на то, что серверная часть не ответила своевременно.

Если вашему бэкенду нужно больше 100 секунд (?!), вам нужно увеличить timeout server. В противном случае ваш сервер Apache, похоже, слишком медленно отвечает.

person Michael - sqlbot    schedule 22.06.2017
comment
Привет, Майкл, это то, о чем я подумал изначально, и тайм-ауты происходят только тогда, когда веб-сайт аутентифицирует пользователей через ldap. Однако мы не получаем 100-секундную паузу, когда мы регистрируемся непосредственно на веб-сервере, нажмите ctrl F5 после ошибки 504, и она сразу же войдет .... - person Ads; 23.06.2017
comment
Должно быть что-то в журнале приложения или в журналах доступа или ошибок apache, или вам может понадобиться дополнительное ведение журнала в вашем приложении... причина различного поведения требует объяснения, и на основе этих записей журнала объяснение более подробно. скорее всего, на сервере приложений, а не на прокси. - person Michael - sqlbot; 23.06.2017
comment
@Ads Вы когда-нибудь решали эту проблему? Я сейчас на той же лодке. Любая помощь будет принята с благодарностью! - person Pedro; 21.09.2017
comment
Я также столкнулся с этой проблемой, и она оказалась ошибкой в ​​версии 1.7.10: discourse.haproxy.org/t/ Обновление до версии 1.7.11+ устраняет проблему. - person Joe P; 19.06.2018

У меня была аналогичная проблема, и я обнаружил, что проблема связана с тем, как я настроил раздел своего внутреннего сервера.

backend no_match_backend
  mode http
  balance roundrobin
  option forwardfor
  option httpchk HEAD / HTTP/1.1\r\nHost:\ example.com
  server nginx-example 192.168.0.10 check port 80

Моя проблема в том, что я не указал порт для подключения. При подключении через HTTP это будет работать, но поскольку мой SSL завершен на моем haproxy. Это пытается подключиться через 443 к бэкэндам. Поскольку бэкэнды не могут/не могут правильно общаться. Настройка сеанса SSL с haproxy и серверной частью, которая приводит к тайм-ауту шлюза. Мне нужно настроить незашифрованную связь с бэкэндом.

backend no_match_backend
  mode http
  balance roundrobin
  option forwardfor
  option httpchk HEAD / HTTP/1.1\r\nHost:\ example.com
  server nginx-example 192.168.0.10:80 check port 80

Изменение может быть трудно заметить server nginx-example 192.168.0.10 check port 80 теперь имеет :80 после ip 192.168.0.10:80

Эта проблема усложнялась тем, что на моих внутренних серверах были настроены перенаправления SSL. Таким образом, все мои запросы будут поступать как HTTP и перенаправляться на HTTPS. Поэтому трудно было определить, где была проблема. I Похоже, HTTPS-запросы правильно перенаправляются на внутренние серверы. Мне нужно отключить это перенаправление на внутренних серверах и переместить его в haproxy config.

person nelaaro    schedule 15.02.2019
comment
Это странно, особенно потому, что вы уже указали «порт 80» в EOL. - person Kevin C; 25.06.2020