我正在尝试设置HAProxy来为504个错误提供静态JSON文件。为了进行测试,我们将配置文件设置为10秒后超时,并使用errorfile
选项:
defaults
log global
mode http
retries 3
timeout client 10s
timeout connect 10s
timeout server 10s
option tcplog
balance roundrobin
frontend https
maxconn 2000
bind 0.0.0.0:9000
errorfile 504 /home/user1/test/error.json
acl employee-api-service path_reg /employee/api.*
use_backend servers-employee-api if employee-api-service
backend servers-employee-api
server www.server.com 127.0.0.1:8000
实际上,我试图在超时时提供JSON而不是HTML,这样后端服务就可以正常地失败。然而,在测试中,我们什么都得不到,既没有HTML也没有JSON。在查看响应时,它只是简单地说它失败了,没有状态代码。我的errorfile
设置正确吗?HAProxy 1.5支持这一点吗?
根据错误文件的文档:
<file> designates a file containing the full HTTP response. It is
recommended to follow the common practice of appending ".http" to
the filename so that people do not confuse the response with HTML
error pages, and to use absolute paths, since files are read
before any chroot is performed.
因此,该文件应该包含完整的HTTP响应,但您尝试仅提供JSON。
文件进一步指出:
For better HTTP compliance, it is
recommended that all header lines end with CR-LF and not LF alone.
示例配置,例如
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
显示了错误文件的.http
扩展名的常见做法。
您可以在这里找到一些默认错误文件的示例。
示例(504.http(:
HTTP/1.0 504 Gateway Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html><body><h1>504 Gateway Time-out</h1>
The server didn't respond in time.
</body></html>
因此,在您的场景中,504.http
将是这样的:
HTTP/1.0 504 Gateway Time-out
Cache-Control: no-cache
Connection: close
Content-Type: application/json
{
"message": "Gateway Timeout"
}
此外,您需要将文件大小控制在限制范围内,如文档中所述,即BUFSIZE
(8或16KB(。
可能有一些错误日志没有为您的JSON文件提供服务。您可能需要再次仔细查看HAProxy的日志。只是为了确定。