在前一段时间,我写了几篇有关学习haproxy的文章。今天咱们再来介绍下haproxy的https配置,https协议的好处在此,咱们就不就做介绍了。 前端
咱们只介绍如何配置https,以及https在实际生产环境中的应用。 nginx
PS:本实验所有在haproxy1.5.4版本进行测试经过。haproxy1.3版本如下haproxy配置参数可能不能使用,须要注意版本号。 web
如下haproxy配置是线上生产环境直接使用的。 redis
1、业务要求 后端
如今根据业务的实际须要,有如下几种不一样的需求。以下: 浏览器
1.1 http跳转https 服务器
把全部请求http://http.ilanni.com的地址所有跳转为https//:http.ilanni.com这个地址。 frontend
1.2 http与https并存 ide
服务器同时开放http://http.ilanni.com和https://http.ilanni.com的访问形式。 学习
1.3 同台服务器不一样域名之间的https与http
同一台服务器对http.ilanni.com域名访问的所有跳转为https://http.ilanni.com,而对haproxy.ilanni.com访问走http协议,也就是跳转到http://haproxy.ilanni.com这个地址。
1.4 同台服务器多域名均使用https
同一台服务器对http.ilanni.com和haproxy.ilanni.com访问走http是协议。
2、配置haproxy并测试业务需求
如今咱们根据业务的需求,咱们来配置haproxy一一达到其需求。
2.1 http跳转https配置
说实话haproxy的https配置要比nginx配置简单的多了,咱们只须要加入几行代码便可实现https的功能。
http跳转https的haproxy配置文件内容,以下:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
uid 188
gid 188
daemon
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.1
option redispatch
retries 3
option redispatch
maxconn 2000
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 3000
listen admin_stats
bind 0.0.0.0:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /stats
stats auth admin:admin
stats hide-version
frontend weblb
bind *:80
acl is_http hdr_beg(host) http.ilanni.com
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/haproxy/ilanni.com.pem
use_backend httpserver if is_http
backend httpserver
balance source
server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
在以上配置文件中,须要注意的选项以下:
tune.ssl.default-dh-param 2048由于咱们的SSL密钥使用的是2048bit加密,因此在此进行声明。
acl is_http hdr_beg(host) http.ilanni.com
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/haproxy/ilanni.com.pem
这三行表示把全部访问http.ilanni.com这个域名的请求,所有转发到https://http.ilanni.com这个链接。
2.2 测试http跳转https
http跳转https配置完毕后,咱们选择来测试其跳转。以下:
你会发如今浏览器中,不管你输入的是http.ilanni.com,仍是http://http.ilanni.com亦或是https://http.ilanni.com,都会自动跳转到https://http.ilanni.com。
这样就达到了,把全部的http请求跳转到https的目的。
2.3 http与https并存配置
haproxy要实现http和https并存的话,配置也很简单,只须要把haproxy分别监控不一样的端口就行,配置文件以下:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
maxconn 2000
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen admin_stats
bind 0.0.0.0:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /stats
stats auth admin:admin
stats hide-version
frontend weblb
bind *:80
acl is_http hdr_beg(host) http.ilanni.com
use_backend httpserver if is_http
backend httpserver
balance source
server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
frontend weblb443
bind *:443 ssl crt /etc/haproxy/ilanni.com.pem
acl is_443 hdr_beg(host) http.ilanni.com
use_backend httpserver443 if is_443
backend httpserver443
balance source
server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
在以上配置文件中,咱们定义了两个前端,一个前端用于监听80端口,也就是http协议。另一个前端监听443端口,也就是https协议。
此时haproxy会根据客户端请求的协议进行分发,若是发现客户端请求的是http协议,则把该请求分发到监听80端口的前端。若是发现客户端请求的是https协议,则把该请求分发到监听443端口的前端。如此就达到了haproxy让http和https并存的要求。
2.4 测试http与https并存
http与https并存配置完毕后,咱们选择来测试其跳转。以下:
经过测试你会发现,在浏览器中若是你输入的是http://http.ilanni.com或者是http.ilanni.com都会直接跳转到http://http.ilanni.com,而输入的是https://http.ilanni.com,则只会跳转到https://http.ilanni.com。
如此就到达了,咱们业务的要求实现http和https并存。
2.5 同台服务器不一样域名之间的https与http配置
同台服务器不一样域名之间的http和https配置比较复杂,第一须要监听两个端口,第二还要根据不一样的域名进行分发。
haproxy配置文件以下:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
uid 188
gid 188
daemon
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.1
option redispatch
retries 3
option redispatch
maxconn 2000
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 3000
listen admin_stats
bind 0.0.0.0:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /stats
stats auth admin:admin
stats hide-version
frontend weblb
bind *:80
acl is_haproxy hdr_beg(host) haproxy.ilanni.com
acl is_http hdr_beg(host) http.ilanni.com
redirect prefix https://http.ilanni.com if is_http
use_backend haproxyserver if is_haproxy
backend haproxyserver
balance source
server web1 127.0.0.1:9090 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
frontend weblb443
bind *:443 ssl crt /etc/haproxy/ilanni.com.pem
acl is_443 hdr_beg(host) http.ilanni.com
use_backend httpserver443 if is_443
backend httpserver443
balance source
server web1 127.0.0.1:7070 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
同台服务器不一样域名之间的https与http配置,咱们配置了两个前端一个用于监听80端口,而且根据不一样的域名进行跳转。在80端口的规则中,若是客户端请求的是http.ilanni.com,这个域名的话,则haproxy会把该请求直接跳转到https://http.ilanni.com。若是是haproxy.ilanni.com,这个域名的话,则分发到后端的服务器。
另一个前端用于监听443端口,用于分发客户端https://http.ilanni.com的请求。
2.6 测试同台服务器不一样域名之间的https与http配置
同台服务器不一样域名之间的https与http配置配置完毕后,咱们如今来进行测试。以下:
经过上图,咱们能够发如今浏览器中输入haproxy.ilanni.com会跳转到http://haproxy.ilanni.com这个地址,而若是输入的是http.ilanni.com或者是http://http.ilanni.com,亦或是https://http.ilanni.com的话,都会跳转到https://http.ilanni.com。
如此就达到了咱们的业务要求,同台服务器上访问haproxy.ilanni.com直接跳转到80端口,若是访问的是http.ilanni.com域名的话则跳转到https://http.ilanni.com这个地址。
2.7 同台服务器多域名均使用https配置
要使同台服务器的两个设置多个域名都使用https协议的话,配置很简单。只须要在haproxy中启用各自的https配置便可。
haproxy配置文件,以下:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
uid 108
gid 116
daemon
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.1
option redispatch
retries 3
option redispatch
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 3000
listen admin_stats
bind 0.0.0.0:1080
mode http
option httplog
maxconn 10
stats refresh 30s
stats uri /stats
stats auth admin:admin
stats hide-version
frontend web80
bind *:80
acl is_http hdr_beg(host) http.ilanni.com
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/haproxy/ilanni.com.pem
acl is_haproxy hdr_beg(host) haproxy.ilanni.com
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/haproxy/ilanni.com.pem
use_backend httpserver if is_http
use_backend haproxyserver if is_haproxy
backend httpserver
balance source
server web1 127.0.0.1:6060 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
backend haproxyserver
balance source
server web1 127.0.0.1:9090 maxconn 1024 weight 3 check inter 2000 rise 2 fall 3
配置文件比较简单,在此就不作进一步的讲解了。
2.8 测试同台服务器多域名均使用https
同台服务器多域名均使用https,配置完毕后,如今咱们来测试下。
经过上图,咱们能够看到在浏览中不管是输入http.ilanni.com、http://http.ilanni.com,仍是haproxy.ilanni.com、http://haproxy.ilanni.com,都会跳转到相应的https地址。
这也达到了咱们业务的要求。