代理版本 1.7.9 2017/08/18
在索引文件中的脚本标签内发出的简单 GET 请求被随机丢弃,而是返回自定义的 400 错误 html,状态码为 200。有时连续 2-3 次,有时甚至连续 30 次。它似乎完全随机出现。这些是由节点后端静态配置提供的 js 文件。
从后端监听的服务器日志来看,请求似乎没有到达。直接访问文件总是有效的。绕过代理访问后端不会重现问题。
由于 Error 显然是自定义错误消息,因此它必须是 HAproxy。添加选项 accept-invalid-http-request 和选项 accept-invalid-http-response 并没有解决问题。socat admin 命令不显示任何错误,并且 stat 不将这些计入 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
应该完全删除。这不仅仅是 chrome 问题,而是快速搜索导致 https://www.haproxy.com/blog/haproxy-and-http-errors-408-in-chrome/