阅读背景:

如何配置和使用Pivotal Cloud Foundry里的HAPorxy(上)

来源:互联网 

Pivotal使用HAProxy作为其访问入口,当然是允许使用其他负载均衡软件或硬件进行替换的。不过,基于怕麻烦和强迫症,个人还是用了HAProxy到最终的生产环境。为了满足特定的应用需求和可靠性需求,对负载均衡这一层做了一定的配置,本文通过四个案例共享这些经验。

为不同应用分配不同的HAProxy

Pivotal Cloud Foundry的配置界面中,HAProxy允许配置多个IP(同时需要在资源尺寸页配置相同个数的HAProxy虚拟机),这样一个CF就拥有了多个入口。可以通过管理员的人脑,对运行在这套CF上不同应用按照负载和安全的考量,分配到不同的HAProxy上。具体实例如下:
假定为PCF配置了两个HAProxy(10.20.30.40和10.20.30.41),在DNS上,默认将*.pcf.mydomain.com子域分配给了这个PCF,指向了10.20.30.40。此时,如果应用app1域名为app1.pcf.mydomain.com,则该应用的访问将通过10.20.30.40进入PCF。
这时如果这个应用app1需要使用域名app1.mydomain.com,并且负载很大和/或可靠性要求高,则可以在DNS上将app1.mydomain.com指向10.20.30.41,然后cf create-domain org1 mydomain.com创建域名(如果这个域名整个CF都要用,那就用cf create-shared-domain),然后用cf map-route app1 mydomain.com -n app1为这个应用增加一个新的域名。
此时,通过app1.mydomain.com和app1.pcf.mydomain.com都可以访问这一应用,但是前者通过10.20.30.41进入PCF,后者通过10.20.30.40进入PCF。

为同一HAProxy上的不同域名配置SSL证书并自动访问https

PCF可以生成个自签名的域名给分配给自己的子域,但实际生产中使用证书肯定不会是自签名的,而且多数也不会是整个子域的域名,而是单独的域名,还是针对前文的实例,增加如下需求:另一个应用app2与app1属于同一系统,需要使用域名app2.mydomain.com,app1.mydomain.com和app2.mydomain.com均有各自的SSL证书,同时二者均要求禁止http访问。
此时可以将DNS上app2.mydomain.com指向10.20.30.41,然后登陆10.20.30.41这个HAProxy的OS(用户名为vcap,密码可以在Pivotal Operation Manager的界面上找到),进行HAProxy配置。
对于自动跳转https的需求,可以通过修改/var/vcap/jobs/haproxy/config/haproxy.config里的http-in完成。

frontend http-in
    mode http
    bind :80
    option httplog
    option forwardfor
    reqadd X-Forwarded-Proto:\ http
    acl is_app1_mydomain_com hdr(host) -i app1.mydomain.com
    redirect location https://app1.mydomain.com:443 if is_app1_mydomain_co
    acl is_app2_mydomain_com hdr(host) -i app2.mydomain.com
    redirect location https://app2.mydomain.com:443 if is_app2_mydomain_com
    default_backend http-routers

对于多个证书的需求,可以通过修改/var/vcap/jobs/haproxy/config/haproxy.config里的https-in完成。将需要的证书上传到这台HAProxy,并在配置文件中添加即可,证书文件支持的格式请参见/var/vcap/jobs/haproxy/config/cert.pem。

frontend https-in
    mode http
    bind :443 ssl crt /var/vcap/jobs/haproxy/config/cert.pem crt /var/vcap/jobs/haproxy/config/app1.mydomain.com.pem crt /var/vcap/jobs/haproxy/config/app2.mydomain.com.pem
    option httplog
    option forwardfor
    option http-server-close
    reqadd X-Forwarded-Proto:\ https
    default_backend http-routers

分享到: