Версия прокси 1.7.9 18.08.2017
Простые запросы GET, сделанные в тегах сценария в индексном файле, отбрасываются случайным образом, и вместо этого пользовательский HTML-код ошибки 400 возвращается с кодом состояния 200. Иногда 2-3 раза подряд, иногда даже не 30 раз подряд. Вроде появляется совершенно случайно. Это файлы js, обслуживаемые статической конфигурацией серверной части узла.
Из журналов сервера, прослушивающего бэкэнд, кажется, что запросы не приходят. Доступ к файлу напрямую всегда работает. Доступ к бэкэнду с обходом прокси не воспроизводит проблему.
Поскольку ошибка явно является настраиваемым сообщением об ошибке, это должно быть HAproxy. Добавление опции accept-invalid-http-request и опции accept-invalid-http-response не решило проблему. Команда администратора socat не показывает никаких ошибок, и статистика не учитывает их в ответах 4xx.
У меня нет идей. У кого-нибудь есть предложения, как изучить, почему это происходит?
Журналы включают ---- во все запросы. Таким образом, индексный HTML-файл запрашивает 7-8 файлов в качестве зависимости. Некоторые файлы css, js в виде запросов GET. Из всех этих запросов иногда один или два файла не обслуживаются, но пользовательская ошибка 408 HTML используется как данные с кодом ответа 200. Этот ответ 200 виден только в браузере, где он говорит Uncaught SyntaxError: Unexpected token <
при попытке проанализировать HTML как файл JS. Теперь в журнале через rsyslog эти запросы не отображаются. Бэкэнд также не регистрирует эти запросы. Затем, после нажатия кнопки «Обновить», обслуживается следующий запрос к набору файлов, и если он обслуживается по-настоящему, код для них равен 200. Поскольку я просто продолжаю обновлять страницу, а содержимое не меняется, все запросы должны отображаться в все журналы с кодом 304. ...
global
daemon
maxconn 4096
log 127.0.0.1 local2 debug
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
stats socket /var/lib/haproxy/stats
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
tune.ssl.default-dh-param 2048
ssl-server-verify none
stats socket /var/run/haproxy.stat
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 1s
timeout queue 1m
timeout connect 1s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
option forwardfor
option http-server-close
stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth stat:stat
errorfile 400 /var/www/html/400.html
errorfile 403 /var/www/html/400.html
errorfile 408 /var/www/html/400.html
errorfile 500 /var/www/html/500.html
errorfile 501 /var/www/html/501.html
errorfile 502 /var/www/html/502.html
errorfile 503 /var/www/html/503.html
errorfile 504 /var/www/html/504.html
option accept-invalid-http-request
option accept-invalid-http-response
Я узнаю содержимое настраиваемого файла ошибок 400.html в браузере, когда он не работает.
Как отметил @ Michael-sqlbot, errorfile 408 /var/www/html/408.html
следует удалить полностью.
Это не просто проблема с хромом, но быстрый поиск приводит к https://www.haproxy.com/blog/haproxy-and-http-errors-408-in-chrome/