一、环境介绍
我被告知网站需要从http更改为https。目前我的网站前端架构如下图所示:
假设我们有两台物理机器,每台机器都有许多tomcat容器。前端使用haproxy的http层负载均衡,然后前端使用LVS负载均衡。整个LVS都使用DR模式。
一开始打算把tomcat改成https,后来设置成haproxy的时候,发现haproxy已经不能用负载均衡了,因为SSL在第四层,于是这个方案就结束了。现在,我将尝试在haproxy层设置SSL,并使用普通连接到后端。
二。设置步骤
1。概述
如果您的应用程序使用SSL证书,您需要决定如何在负载平衡器上使用它们。
单一服务器的简单配置通常考虑客户机SSL连接如何被接收请求的服务器解码。由于负载均衡器位于客户端和更多服务器之间,SSL连接解码成为关注的焦点。
2。有两种主要策略
首先,我们将介绍最典型的解决方案——SSL终端。如前所述,我们需要让负载平衡器处理SSL连接。这意味着SSL证书应该放在负载平衡服务器上。
请记住,生产环境中使用的SSL证书(而不是自签名)不需要您自己生成或签名——您只需要创建一个证书签名请求(csr)并将其交给您购买证书的机构。
首先,我们创建一个自签名证书作为演示,并在本地使用相同的证书。
openssl genrsa -out /etc/haproxy/wzlinux.key 2048 openssl req -new -key /etc/haproxy/wzlinux.key -out /etc/haproxy/wzlinux.csr > Country Name (2 letter code) [AU]:CN > State or Province Name (full name) [Some-State]:Shanghai > Locality Name (eg, city) []:Shanghai > Organization Name (eg, company) [Internet Widgits Pty Ltd]:wzlinux > Organizational Unit Name (eg, section) []: > Common Name (e.g. server FQDN or YOUR name) []:www.wzlinux.com > Email Address []: > Please enter the following 'extra' attributes to be sent with your certificate request > A challenge password []: > An optional company name []: cd /etc/haproxy openssl x509 -req -days 3655 -in wzlinux.csr -signkey wzlinux.key -out wzlinux.crt生成文件wzlinux.csr、wzlinux.key和wzlinux.crt。
然后,在创建证书之后,我们需要创建pem文件。Pem文件本质上只是将证书、密钥和证书认证中心(可选)的证书拼接成一个文件。在我们的示例中,我们只是按照这个顺序将证书和密钥文件拼接在一起,以创建wzlinux.pem文件。这是HAProxy读取SSL证书的首选方式。
cat wzlinux.crt wzlinux.key | tee wzlinux.pem买真证的时候,不一定拿到拼接的文件。你可以自己拼接。不过很多机构也会给你提供一个拼接的文档。如果没有得到拼接的文件,可能不是pem文件,而是bundle、cert、cert、key文件或者一些概念相同但名称相似的文件。
无论如何,只要拿到HAProxy使用的pem文件,通过简单的配置就可以处理SSL连接。
接下来,我们将配置haproxy来安装SSL证书。配置文件如下所示
#--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # log 127.0.0.1 local2 warning chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 400000 user haproxy group haproxy daemon tune.ssl.default-dh-param 2048 # nbproc 3 # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch option httpclose 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 stats enable stats hide-version stats uri /haproxy?status stats realm Haproxy\ Statistics stats auth admin:asd870719 # stats admin if TRUE #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- #frontend main *:5000 # acl url_static path_beg -i /static /images /javascript /stylesheets # acl url_static path_end -i .jpg .gif .png .css .js # use_backend static if url_static # default_backend app frontend wzlinux_ssl bind *:80 bind *:443 ssl crt /etc/haproxy/wzlinux.pem mode http default_backend wzlinux #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- #backend static # balance roundrobin # server static 127.0.0.1:4331 check backend wzlinux mode http balance roundrobin option forwardfor # option httpchk HEAD / HTTP/1.1\r\nHost:localhost server wzlinux01 10.0.0.9:8080 check inter 15000 rise 2 fall 4 server wzlinux02 10.0.0.9:8081 check inter 15000 rise 2 fall 4 server wzlinux03 10.0.0.9:8082 check inter 15000 rise 2 fall 4 server wzlinux04 10.0.0.9:8083 check inter 15000 rise 2 fall 4 server wzlinux05 10.0.0.9:8084 check inter 15000 rise 2 fall 4 server wzlinux06 10.0.0.9:8085 check inter 15000 rise 2 fall 4 server wzlinux07 10.0.0.9:8086 check inter 15000 rise 2 fall 4 # http-request set-header X-Forwarded-Port %[dst_port] # http-request add-header X-Forwarded-Proto https if { ssl_fc }因为SSL连接是在负载平衡器上终止的,所以我们仍然向后台服务器发送普通的HTTP请求。
仅接受SSL连接
如果您希望网站只接受SSL连接,可以添加重定向到前端配置:
上面,我们添加了重定向,如果连接不是通过SSL,它会将http重定向到https。
4。使用HAProxy的SSL渗透
通过SSL渗透,我们将让后台服务器处理SSL连接,而不是负载均衡器。
负载平衡器的工作只是将请求转发给已配置的后台服务器。因为连接还是加密的,所以HAProxy只能转发给其他服务器,其他什么都做不了。
在这个配置中,我们需要在前端和后端配置中都使用TCP模式而不是HTTP模式。HAProxy只会将连接作为信息流转发到其他服务器,不会使用只能在HTTP请求上使用的功能。
首先,我们来调整一下前端配置:
frontend wzlinux_ssl bind *:80 bind *:443 option tcplog mode tcp default_backend wzlinux这里仍然同时绑定了端口80和443,以保证正常的HTTP连接和SSL连接可以工作。
如上所述,要在不进行任何解码的情况下将安全连接转发到服务器,我们需要使用TCP模式(modetcp)。这也意味着我们需要设置tcplog而不是默认的httplog(选项tcplog)。
接下来,我们需要调整后台端的配置。注意,我们必须将此更改为TCP模式,并删除一些指令,以避免修改/添加HTTP头函数导致的冲突:
backend wzlinux mode tcp balance roundrobin option ssl-hello-chk server wzlinux01 10.0.0.9:8080 check inter 15000 rise 2 fall 4 server wzlinux02 10.0.0.9:8081 check inter 15000 rise 2 fall 4 server wzlinux03 10.0.0.9:8082 check inter 15000 rise 2 fall 4 server wzlinux04 10.0.0.9:8083 check inter 15000 rise 2 fall 4 server wzlinux05 10.0.0.9:8084 check inter 15000 rise 2 fall 4 server wzlinux06 10.0.0.9:8085 check inter 15000 rise 2 fall 4 server wzlinux07 10.0.0.9:8086 check inter 15000 rise 2 fall 4如您所见,这里设置了模式TCP前端和后台配置都需要设置为该模式。
我们还删除了forwardfor选项和http-request选项——这些选项不能在TCP模式下使用,我们也不能给加密的请求添加头。之前的一些默认配置也删除了关于http的配置,这里就不演示了。
为了检查正确性,我们可以使用ssl-hello-chk来检查连接及其处理ssl(尤其是SSLv3)连接的能力。
在这个例子中,我构建了两个接受SSL证书的后台服务器。如果您已经阅读了版本SSL证书,您将看到如何将它们集成到Apache或Nginx中,以创建一个web服务器后台来处理SSL通信。使用SSL遍历,不需要为HAProxy创建或使用SSL证书。后台服务器可以处理SSL连接,就像只有一个服务器,没有使用负载平衡器一样。
关于如何设置lvs发行版,这里就不做演示了。你可以看看我写的关于LVS的文章。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)