Я боролся с этой проблемой в течение нескольких недель, и у меня заканчиваются идеи. Я запускаю HAProxy для прокси-запросов между 3 серверами на основе пути / заголовков запросов.
Мои бэкенды:
Последний бэкэнд (prerender.io), похоже, не имеет проблем (хотя у него очень мало трафика). Два других возвращают клиенту 504 ошибки случайным образом (примерно каждую минуту согласно журналам, но нет четкого шаблона).
Вот мой (продезинфицированный) конфиг:
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5s
timeout client 120s
timeout server 120s
frontend foobar
mode http
bind *:80
bind *:443 ssl crt /etc/ssl/certs/foobar.com.pem
redirect scheme https code 301 if !{ ssl_fc }
default_backend s3
acl api path_beg -i /api/
use_backend node if api
acl user-agent-bot hdr_sub(User-Agent) -i baiduspider twitterbot facebookexternalhit
use_backend prerender if user-agent-bot
backend s3
mode http
http-request set-path /index.html
reqirep ^Host: Host:\ my-bucket.s3-website-us-east-1.amazonaws.com
reqidel ^Authorization:.*
rspidel ^x-amz-id-2:.*
rspidel ^x-amz-request-id:.*
server s3 my-bucket.s3-website-us-east-1.amazonaws.com:80 check inter 5000
backend node
mode http
balance roundrobin
option forwardfor
server api01 1.2.3.4:3333 check
server api02 5.6.7.8:3333 check
backend prerender
mode http
server prerender service.prerender.io:443 check inter 5000 ssl verify none
http-request set-header X-Prerender-Token my-secret-token
reqrep ^([^\ ]*)\ /(.*)$ \1\ /https://app.wwoof.fr/\2
Я сам испытал эти 504 посещения сайта. Все, что мне нужно сделать, это обновить страницу, и она сразу же снова заработает. Мне не нужно ждать 120 секунд (тайм-аут сервера), прежде чем получить эти 504, они появляются сразу по запросу.
Примеры (очищенные) ошибок из журнала:
Sep 28 14:27:13 node/api01 0/0/1/-1/1 504 195 - - sR-- 38/38/30/14/0 0/0 "GET /api/hosts/2266 HTTP/1.1"
Sep 28 14:34:15 node/api02 0/0/0/-1/0 504 195 - - sR-- 55/55/41/25/0 0/0 "GET /api/hosts/4719 HTTP/1.1"
Sep 28 14:34:15 node/api01 0/0/1/-1/1 504 195 - - sR-- 54/54/41/16/0 0/0 "GET /api/hosts/2989 HTTP/1.1"
Sep 28 14:38:41 node/api01 0/0/1/-1/1 504 195 - - sR-- 50/50/47/25/0 0/0 "POST /api/users HTTP/1.1"
Sep 28 14:42:13 node/api02 0/0/1/-1/1 504 195 - - sR-- 134/134/102/49/0 0/0 "POST /api/users HTTP/1.1"
Sep 28 14:42:29 node/api02 0/0/1/-1/1 504 195 - - sR-- 130/130/105/51/0 0/0 "GET /api/hosts/1634 HTTP/1.1"
У меня есть аналогичные логи для бэкэнда s3. Я заглянул в документацию, чтобы понять, что sR
средства. Первый символ - это код, сообщающий о первом событии, которое привело к завершению сеанса:
s: время ожидания на стороне сервера истекло во время ожидания отправки или получения данных сервером.
Второй символ указывает состояние сеанса TCP или HTTP, когда он был закрыт:
R: прокси ожидал полного действительного ЗАПРОСА от клиента (только в режиме HTTP). Ничего не было отправлено ни на один сервер.
Эта комбинация sR
для меня не имеет смысла. Как мог истечь тайм-аут сервера, если он установлен на 120 с? А почему второе письмо относится к клиенту? Эти письма кажутся противоречивыми.
В 0/0/1/-1/1
часть представляет время. Короче говоря, это означает, что мы не ждем 120 секунд, это сразу же выходит из строя.
Бэкенды s3 и Node.js имеют точно такую же проблему. Раньше я использовал Nginx, и он работал нормально, поэтому я уверен, что эта проблема не имеет ничего общего с моей конфигурацией. Любой совет или предложение по отладке этого?
Думаю, я наконец понял это. Решение состояло в увеличении timeout
ценности:
timeout connect 20s
timeout client 10m
timeout server 10m
Я не уверен, почему увеличение времени ожидания клиент / сервер с 2 до 10 минут решило проблему. Я считаю, что это как-то связано с keep-alive
и тот факт, что HAProxy поддерживает открытые соединения с S3 / Node.
Надеюсь это поможет!
Я также столкнулся с этой проблемой, и это оказалось ошибкой в v1.7.10:
https://discourse.haproxy.org/t/intermittent-504-errors-and-sr-after-upgrade-to-1-7-10/2029
Обновление до v1.7.11 + устраняет проблему.