HAproxy:OPTIONS和POST方法的不同503错误文件

HAproxy: different 503 errorfile for OPTIONS and POST methods

本文关键字:错误 文件 方法 OPTIONS POST HAproxy      更新时间:2023-09-26

我们有一个Web应用程序,它使用ajax调用在不同域上运行的后端(需要->CORS)。后端由HAproxy 1.4.22和多个Wildfly(在OpenShift PaaS上运行)组成。如果没有可用的Wildfly(例如,在"维护"期间),HAproxy为每个请求或配置的错误文件提供503服务。到目前为止还不错。。。

对于Web应用程序来说,根据被拒绝的后端请求(使用503)正确可视化"维护模式"是一个问题,因为浏览器首先发送OPTIONS请求(飞行前),并且已经收到503。最终,浏览器不会将此状态代码反映到JavaScript中执行的ajax调用中(我们总是得到状态代码0作为响应,因为浏览器将其解释为飞行前的致命故障并拒绝任何访问)。这个故事并不新鲜,在stackoverflow有很多帖子。

那么如何解决这个问题呢我的想法是提供两个不同的错误文件(HAproxy语言中的"错误文件")-一个为OPTIONS请求提供内容为"HTTP/1.1 200 OK…Access Control Allow Origin:*……"的错误文件,以通过浏览器中的飞行前检查,然后一个为POST请求提供内容"HTTP/1.1503……",以使浏览器在ajax响应中真正反映状态503。然而,我无法运行。

global
    maxconn     256
defaults
    mode                    http
    log                     global
    option                  httplog
    ...
listen express 127.4.184.2:8080
    acl is_options method OPTIONS
    acl is_post method POST
    errorfile 503 /var/lib/openshift/564468c90c1e66c7f2000077/app-root/runtime/repo/503.http if is_post
    errorfile 503 /var/lib/openshift/564468c90c1e66c7f2000077/app-root/runtime/repo/options.http if is_options
    option httpchk GET /
    http-check expect rstatus 2..|3..|401
    balance leastconn
    server local-gear 127.4.184.1:8080 check fall 2 rise 3 inter 2000 cookie local-564468c90c1e66c7f2000077

我知道这不起作用,因为错误文件不允许使用if <condition>变体。

我如何才能实现我所希望的行为如果有人有其他解决方案来解决这个"维护模式"/CORS问题,我愿意接受任何想法。。。

提前感谢!

我找到了一个很好的解决方案:

  • 定义两个"后端"(因此将"侦听"部分拆分为"前端"answers"后端"
  • "frontend"部分检查请求方法,并使用一个"backend"来回答OPTIONS请求,一个"后端"来回答所有其他请求
  • 第一个定义的"后端"用于用200回答所有OPTIONS请求:这可以用错误文件来完成,如果我们在本节中没有列出任何服务器,则此"后端"标记为Down,并因此响应错误文件(在其中我们将200发送回OPTIONS要求)
  • 第二个定义的"后端"保留"真实"后端,并在真实服务器关闭的情况下响应错误文件中的内容
  • 在错误文件中,我们可以添加CORS头


HAproxy.cfg

global
     maxconn     256
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    maxconn                 128
    ...
frontend balancer
    bind 127.8.155.130:8080
    mode http
    acl is_options method OPTIONS
    use_backend cors_backend if is_options
    default_backend business_backend
backend cors_backend
    errorfile 503 options.http
backend business_backend
    errorfile 503 503.http
    server ...
    server ...


选项。http

HTTP/1.1 200 OK
Access-Control-Allow-Headers: Origin, Accept, X-Session_id, Content-Type
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 86400
Access-Control-Allow-Methods: HEAD, DELETE, POST, GET, OPTIONS, PUT
Connection: close
[empty line]


503.http

HTTP/1.1 503 Service Unavailable
Cache-Control: no-cache
Access-Control-Allow-Origin: *
Connection: close
[empty line]

还有一个额外的冒险:这个配置通过HAproxy自动为所有OPTIONS请求提供服务——即使有CORS支持!