在 openshift 中强制使用 https HAProxy cartridge 并仅为特定的 urls 模式启用

Force https HAProxy cartridge in openshift and enabled only for specific urls patterns

我有 openshift scalable play application 我的问题是我无法强制使用 https,我只想提供以 /portal/api

开头的 URL

所以如果我点击 https://www.example.com 之类的东西,我不想让 haproxy 关心它,因为我已经有一个 WordPress 服务于主网站,但是如果我点击 'https://www.example.com/api' 那么 HAProxy必须参与并且负载平衡器应该在自动缩放齿轮之间工作。

我尝试了很多关于 HAProxy 配置的答案,包括文档: http://cbonte.github.io/haproxy-dconv/1.4/configuration.html#4.2-redirect%20schemehttps://developers.openshift.com/faq/troubleshooting.html#_how_do_i_redirect_traffic_to_https 乃至 https://github.com/openshift/origin/blob/master/images/router/haproxy/conf/haproxy-config.template

类似 redirect scheme https if !{ ssl_fc } 的东西根本没有帮助。

没有任何帮助,一旦我添加 frontend 它就停止工作,而且我在我的应用程序齿轮中的任何地方都看不到日志文件。

我该怎么做?

以下是我的haproxy.cfg

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    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 128

listen stats 127.9.3.131:8080
    mode http
    stats enable
    stats uri /

listen express 127.9.3.130:8080

    cookie GEAR insert indirect nocache
    option httpchk GET /portal
    http-check expect rstatus 2..|3..|401

    balance leastconn
    server local-gear 127.9.3.129:8080 check fall 2 rise 3 inter 2000 cookie local-xxxxxxxxxx

我通过提供特定模式解决了问题,但不是 https,https 的问题是 Openshift Cloud v2 中使用的 HAProxy 版本太旧,他们拥有的旧版本不支持 https,甚至1.4版本以后的补丁没有应用,Openshift的HAProxy版本为:HAProxy version 1.4.22, released 2012/08/09!严重地!正如我在 HAProxy 的文档中看到的那样,最新的次要版本是 1.4.27 足以解决这个问题。

因此,为了强制使用 HTTPS,我从我的应用程序而不是 HAProxy 执行了这一步。

无论如何,为了提供特定模式(在我这里的示例中,我只为 /api 和 /portal 提供服务)配置文件更改为类似以下代码的内容,请注意,我删除了 listen 并使用 backendfrontend 代替:

frontend express
    acl api path_beg -i /api
    acl portal path_beg -i /portal
    bind 127.9.3.130:8080
    use_backend servers if api
    use_backend servers if portal
    default_backend website
    cookie GEAR insert indirect nocache

backend servers
    option httpchk GET /portal
    http-check expect rstatus 2..|3..|401
    balance leastconn
    server local-gear 127.9.3.130:8080 check fall 2 rise 3 inter 2000 cookie local-xxxxxxxxxx

backend website
    balance leastconn
    server webserver DOMAIN_IP

请注意以下事项:

  • 在更改之前始终备份旧的配置文件。
  • 使用原配置文件中提供的本地IP,copy/paste上面的代码肯定行不通,另外一定要把xxxxxxxxxx替换成你原配置文件中提供的gear id配置文件。

P.S: Openshift online v2 已弃用,从明年 8 月起也将停止接受任何新帐户,v3 应该会更好,但直到现在它仍然是 "preview" 尚未公开。