安装haproxy
解压haproxy的tar包
着进行haproxy的编译安装,haproxy编译没有configure,直接make->make install
make TARGET=linux310 CPU=x86_64 PREFIX=/data/haproxy USE_OPENSSL=1 ADDLIB=-lz
ldd haproxy | grep ssl
make install PREFIX=/data/haproxy
编译参数说明:
TARGET=linux310 : 使用 uname -r 查看内核,如:3.10.0-693.21.1.el7.x86_64,此时该参数就为linux310
CPU=x86_64 : 使用 uname -r 查看系统信息,如 x86_64 x86_64 x86_64 GNU/Linux,此时该参数就为 x86_64
PREFIX : 后面跟的是haprpxy的安装路径
USE_OPENSSL=1 ADDLIB=-lz : 支持ssl
设置 haproxy
配置 haproxy.cfg 参数
# this config needs haproxy-1.1.28 or haproxy-1.2.1
# haproxy version 1.5.18
#---------------------------------------------------------------------
# Global settings
# 这里的配置是使用HAProxy作为SSL终端,而不是使用SSL穿透让后台服务器处理SSL
# 如果使用HAProxy实现SSL穿透,配置则不一样
#---------------------------------------------------------------------
global
log 127.0.0.1 local0 warning
#最大连接数
maxconn 8192
#修改haproxy的工作目录至指定的目录
chroot /data/haproxy/var/chroot
pidfile /data/haproxy/var/run/haproxy.pid
user root
group root
#让haproxy以守护进程的方式工作于后台
daemon
#进程数量(可以设置多个进程提高性能)
nbproc 1
#这一行要加,要不然reload会警告
tune.ssl.default-dh-param 2048
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
ssl-default-bind-options no-sslv3
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
mode http
#启用每个实例日志记录事件和流量
log global
#记录HTTP 请求,session 状态和计时器
option httplog
#启用或禁用在连接故障情况下的会话重新分配
option redispatch
#启用和禁用 记录 空连接
option dontlognull
#获得客户端IP
option forwardfor
#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
option httpclose
#当对server的connection失败后,重试的次数
retries 3
#haproxy的状态管理页面,通过/haproxyadmin?stats来访问
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats auth admin:xxxx
#负载均衡方式根据权重
balance static-rr
maxconn 4000
timeout connect 5000
timeout client 50000
timeout server 50000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend xxx
#保留80,同时支持443 ssl,后面指定证书文件
bind *:80
bind *:443 ssl crt /data/haproxy/conf/cert/xxxxx.pem
#仅支持ssl,如果连接不是通过SSL连接的,它将http重定向到https
redirect scheme https if !{ ssl_fc }
#这句话必须要有,否则静态页面的哪些样式会加载不上
reqadd X-Forwarded-Proto:\ https
#请求报文中的所有host中符合后面指定的域名 -i表示不区分大小写
acl fs_com hdr(host) -i www.xxxxx.com
use_backend fs if fs_com
default_backend fs
backend fs
#使用defaults中配置的参数
#balance static-rr
#option httpclose
#option redispatch
#传递客户端真实IP
#option forwardfor
#option forwardfor header X-Forwarded-For
option httpchk HEAD /favicon.ico HTTP/1.0
#允许serverid插入cookie中,serverid后面可以定义
cookie SERVERID insert indirect nocache
#需要转发的ip及端口
#maxconn 2048服务器接受的最大并发连接数
#inter 2000 健康检查时间间隔2秒
#rise 3 检测多少次才认为是正常的
#fall 3 失败多少次才认为是不可用的
#weight 30 权重
server www01 127.0.0.1:8000 cookie www01 maxconn 2048 weight 3 check port 8000 inter 2000 rise 3 fall 3
server www02 127.0.0.1:8080 cookie www02 maxconn 2048 weight 6 check port 8000 inter 2000 rise 3 fall 3
启动haproxy
#对haproxy 语法做检查
/data/haproxy/sbin/haproxy -c -f /data/haproxy/conf/haproxy.cfg
#启动haproxy
/data/haproxy/sbin/haproxy -D -f /data/haproxy/conf/haproxy.cfg
#重新加载配置文件reload
/data/haproxy/sbin/haproxy -f /data/haproxy/conf/haproxy.cfg -sf `cat /data/haproxy/var/run/haproxy.pid`
启动haproxy日志
查看统计页面的情况
配置ssl中需要注意:
证书的处理,需要将网站的根证书和key简单的合并在一起:
cat xxx.com.pem xxx.com.key | tee xxx.pem
否则会报 'bind *:443' : unable to load SSL private key from PEM file '/data/haproxy/conf/cert/xxx.com.pem'.
我将文件证书合到一起之后仍然报上面那个问题,最后打开证书,发现格式有点问题,如下图
将格式调整下即可
#在request加上https
reqadd X-Forwarded-Proto:\ https
这个配置必须要在haproxy.cfg配置文件中加上,否则会出现如下图样式加载的问题
如果样式还是有问题,则需要进行如下的配置
同nginx一样,如果haproxy和tomcat之间配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。
配置Tomcat server.xml 的 Host下配置一个 Valve
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto"/>