CentOS Linux 6 / 7 编译安装 HAProxy

安装:

1、先去官网下载最新版的 HAProxy:

http://www.haproxy.org/

如下图所示,复制 HAProxy 的下载链接:

下载最新版的 HAProxy
下载最新版的 HAProxy

2、进入你的 CentOS ,先使用 yum 安装 wget 和 HAProxy 的依赖包 openssl-devel(如果已经安装过,可忽略这步):

[root@host ~]# yum -y install wget openssl-devel

3、Ricky 个人是喜欢把一些临时文件放到 /tmp 目录下,所以进入 /tmp 目录,使用 wget 命令把 HAProxy 的 tar.gz 包下载到这里,然后解压(或者下载到 PC 后,再通过 FTP 上传至 CentOS Linux ):

[root@host ~]# cd /tmp
[root@host tmp]# wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.1.tar.gz
[root@host tmp]# tar -zxvf haproxy-1.8.1.tar.gz

4、查看一下当前 CentOS 的内核版本(如下例所示,内核版本为 2.6 ):

[root@host tmp]# uname -a
Linux host.localdomain 2.6.32-042stab123.3 #1 SMP Fri May 5 12:29:05 MSK 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@host tmp]#

5、进入解压出来的文件夹,在这里执行编译安装操作(由上可知内核版本号为 2.6,所以这里 TARGET 是 linux26 ;因为是 64 位的 Linux 系统,所以 ARCH=X86_64 ):

[root@host tmp]# cd haproxy-1.8.1/
[root@host haproxy-1.8.1]# make TARGET=linux26  ARCH=X86_64 PREFIX=/usr/local/haproxy USE_OPENSSL=1 ADDLIB=-lz
[root@host haproxy-1.8.1]# make install PREFIX=/usr/local/haproxy

6、删除掉这个文件夹,并创建 conf 文件夹:

[root@host haproxy-1.8.1]# cd ..
[root@host tmp]# rm -rf haproxy-1.8.1/
[root@host tmp]# mkdir /usr/local/haproxy/conf/

7、同时还要创建一个文件夹,如果没有这个文件夹,HAProxy 打开的时候可能会报错:

[root@host tmp]# mkdir /var/lib/haproxy/

8、生成 HAProxy 的配置文件:

[root@host tmp]# vi /usr/local/haproxy/conf/haproxy.conf

键入小写字母 i ,进入编辑模式,将以下配置复制粘贴进去:

global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    tune.ssl.default-dh-param 2048

    stats socket /var/lib/haproxy/stats

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                 3000

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

backend static
    balance     roundrobin
    option      httpchk
    server      static 127.0.0.1:4331 check

backend app
    balance     roundrobin
    option      httpchk
    server      app1 127.0.0.1:5001 check
    server      app2 127.0.0.1:5002 check
    server      app3 127.0.0.1:5003 check
    server      app4 127.0.0.1:5004 check

按一次 ESC 键退出编辑模式,然后键入 “ :wq ” 保存并退出。

9、把 HAProxy 的启动脚本添加到开机自启动(还要给 rc.local 文件添加可执行权限,如果已添加可忽略),并执行 HAProxy 的启动脚本即可:

(1)给 rc.local 文件添加可执行权限:
[root@host tmp]# chmod +x /etc/rc.d/rc.local
[root@host tmp]# chmod +x /etc/rc.local

(2)把 HAProxy 的启动脚本添加到开机自启动:
[root@host tmp]# echo "/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf" >> /etc/rc.local

(3)执行 HAProxy 的启动脚本:
[root@host tmp]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf

至此,安装完成。

可能出现的错误:

HAProxy 启动时提示 “ cannot bind socket ” ,启动失败。

可以尝试键入以下命令来解决:

[root@host ~]# echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf

[root@host ~]# rm -f /sbin/modprobe  
[root@host ~]# ln -s /bin/true /sbin/modprobe 
[root@host ~]# rm -f /sbin/sysctl  
[root@host ~]# ln -s /bin/true /sbin/sysctl

[root@host ~]# sysctl -p

使用:

1、对 HAProxy 配置文件的语法做检查:

[root@host ~]# /usr/local/haproxy/sbin/haproxy -c -f /usr/local/haproxy/conf/haproxy.conf

2、开启 HAProxy 的进程:

[root@host ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf

3、查看 HAProxy 的进程:

[root@host ~]# ps -ef | grep haproxy
root       613     1  0 Dec16 ?        00:00:54 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf
root      1142  1116  0 18:26 pts/0    00:00:00 grep haproxy
[root@host ~]#

4、关闭(杀死)HAProxy 的进程:

[root@host ~]# killall haproxy

如果 CentOS Linux 提示没有 killall 命令,请使用 yum 安装 psmisc :

[root@host ~]# yum -y install psmisc

或者使用如下命令关闭(杀死)HAProxy 的进程:

[root@host ~]# ps aux|grep "haproxy" |grep -v grep|awk '{print $2}'|xargs kill -9

5、查询 HAProxy 的版本号:

[root@host ~]# /usr/local/haproxy/sbin/haproxy -v
HA-Proxy version 1.8.4-1deb90d 2018/02/08
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>

[root@host ~]#

配置:

1、修改 HAProxy 的配置文件,让其支持 https:

frontend name(name 这里比如:http_server 和 main *:5000 等)
        bind 0.0.0.0:80
        bind 0.0.0.0:443 ssl crt /etc/haproxy/keys/www.test.com.pem

只需要在 frontend 这里添加一行配置(监听 443 端口,再告诉 HAProxy 存放 CA 证书的位置)即可。

www.test.com.pem 这个文件应该需要如下形式,即把 key 也要附上:

-----BEGIN CERTIFICATE-----
BAQDAgEGM798a1UdEwEB/wQIMAYBAf8CAQAQMKYIKwYBBQUHAQEEJzAlMCMGCCsG

...

k3YtCAbvmq==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----  
IGZvciBhdXRob3JpemVkIHVz9zBvbmx5MS4wLAYDVSSDEyVFbnRydXN0IMAlcnRp 

...

QnLcB= 
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
SnXgfbEA3wLWqbjZiGkReyuxlZs+peS644u6+vnxTbmVHH+3t3rmubDK7nEACI81

...

cckLx6AQUD/7oUbcB9wKG5sy9EhYrCkg9wYYGyPlgUuRdLZny0I0Bw==
-----END RSA PRIVATE KEY-----

2、修改 HAProxy 的配置文件,让其支持多个 https:

frontend name(name 这里比如:http_server 和 main *:5000 等)
        bind :80
        bind :443 ssl crt /etc/haproxy/keys/www.test.com.pem crt /etc/haproxy/keys/admin.test.com.pem crt /etc/haproxy/keys/passport.abc.com.pem

只需要连续不断地添加证书即可,HAProxy 会自动地根据不同的域名去使用相关的证书,不需要额外配置。

网上说 https 的配置要这么配:

frontend name(name 这里比如:http_server 和 main *:5000 等)
        bind :80
        bind :443 ssl crt /etc/haproxy/keys/www.test.com.pem crt /etc/haproxy/keys/admin.test.com.pem crt /etc/haproxy/keys/passport.abc.com.pem

        acl admintest_com hdr_dom(host) -i admin.test.com
        use_backend admin_test_com if admintest_com { ssl_fc_sni admin.test.com } 

        acl passportabc_com hdr_dom(host) -i passport.abc.com
        use_backend pasport_abc_com if passport_abc_com { ssl_fc_sni passport.abc.com }

...

即在 use_backend 的后面还要添加 { ssl_fc_sni admin.test.com } ,表示 “ 指定 ” (或者说是强制)使用某个证书。其实这么做的话这个域名就没法通过 80 端口来访问了,只能通过 443 端口来访问。要想 443 端口和 80 端口都能同时访问还需要这么做:

frontend name(name 这里比如:http_server 和 main *:5000 等)
        bind :80
        bind :443 ssl crt /etc/haproxy/keys/www.test.com.pem crt /etc/haproxy/keys/admin.test.com.pem crt /etc/haproxy/keys/passport.abc.com.pem

        acl admintest_com hdr_dom(host) -i admin.test.com
        use_backend admin_test_com if admintest_com

        acl admintest_com hdr_dom(host) -i admin.test.com
        use_backend admin_test_com if admintest_com { ssl_fc_sni admin.test.com }

        acl passportabc_com hdr_dom(host) -i passport.abc.com
        use_backend pasport_abc_com if passport_abc_com

        acl passportabc_com hdr_dom(host) -i passport.abc.com
        use_backend pasport_abc_com if passport_abc_com { ssl_fc_sni passport.abc.com }

...

即再添加一个不 “ 指定 ” 证书的配置。

这么做我觉得完全没有必要,只要添加 bind :443 ssl crt /etc/haproxy/keys/www.test.com.pem … 这一行配置就行,剩下的让 HAProxy 自动地根据不同的域名去使用相关的证书即可。

3、301 永久重定向和 302 临时重定向在 HAProxy 上的配置:

现有如下需求,将一个链接根据规则重定向到另一个链接:

  • http://www.test.com/m 和 https://www.test.com/m → https://www.test.com/m/home
  • http://www.test.com/m/ 和 https://www.test.com/m/ → https://www.test.com/m/home
  • 但是 https://www.test.com/m/XXXX 不做重定向,XXXX 为任意字符
# 301 永久重定向
acl website_test hdr_reg(host) -i ^(www.test.com)$
acl url_m path_reg -i ^(/m|/m/)$
redirect code 301 location https://www.test.com/m/home if website_test url_m

# 302 临时重定向
acl website_test hdr_reg(host) -i ^(www.test.com)$
acl url_m path_reg -i ^(/m|/m/)$
redirect code 302 location https://www.test.com/m/home if website_test url_m

如需了解《 301 永久重定向和 302 临时重定向的区别》请点击这里

4、修改 HAProxy 的配置文件,在用户访问相关 http 的域名时强制切换到 https :

# 对以下站点进行 https 跳转

acl ssl hdr_reg(host) -i ^(www.test.com|admin.test.com|passport.abc.com)$
redirect scheme https code 301 if !{ ssl_fc } ssl

5、现有如下需求,如果是手机访问首页则跳转到手机版的首页(仅对首页做跳转),PC 等其他终端访问首页不做任何跳转:

  • https://www.test.com( mobile )→ https://www.test.com/m/index.jsp
acl website_test hdr_reg(host) -i ^(www.test.com)$
acl website_home_page path_reg -i ^/$
acl ua hdr_reg(User-Agent) -i UCBrowser|Android|Iphone|ipad|ipod|BlackBerry|Windows\ Phone|Symbian(.*)Series60/3|Symbian(.*)Series60/5
redirect code 302 location https://www.test.com/m/index.jsp if website_test website_home_page ua

6、现有如下需求,如果是手机来访问,同时 cookies 值 abtest 等于 1 则跳转到一个链接,abtest 不等于 1 又跳转到另一个链接(仅对首页做跳转);PC 等其他终端访问首页不做任何跳转:

  • https://www.test.com( mobile ,abtest = 1 )→ https://www.test.com/m/home
  • https://www.test.com( mobile ,abtest != 1 )→ https://www.test.com/m/index.jsp
acl website_test hdr_reg(host) -i ^(www.test.com)$
acl website_home_page path_reg -i ^/$
acl ua hdr_reg(User-Agent) -i UCBrowser|Android|Iphone|ipad|ipod|BlackBerry|Windows\ Phone|Symbian(.*)Series60/3|Symbian(.*)Series60/5
acl abtest hdr_sub(cookie) abtest=1
redirect code 302 location https://www.test.com/m/home if website_test website_home_page ua abtest
redirect code 302 location https://www.test.com/m/index.jsp if website_test website_home_page ua !abtest

7、关于证书配置的安全性改进:

bind 0.0.0.0:443 ssl crt 1.pem no-sslv3 ciphers AES:ALL:!aNULL:!eNULL:-RC4:-EXPORT:-DES crt 2.pem no-sslv3 ciphers AES:ALL:!aNULL:!eNULL:-RC4:-EXPORT:-DES

8、健康监测:

(1)基于端口的健康监测,这种检测方式只会去检查后端服务器的端口是否存活,并不能保证服务的真正可用:

option httpchk

(2)基于页面的健康监测,这种检测方式会去 GET 后端服务器的一个 web 页面,基本上可以代表后端服务的可用性:

option httpchk GET /check.html

(3)基于页面的健康监测,与(2)类似,但后端服务器只允许通过 www.test.com 这个域名去访问健康监测的页面:

option httpchk HEAD /check.jsp HTTP/1.1\r\nHost:\ www.test.com

9、开启 HAProxy 的监控后台和隐藏 HAProxy 的版本号:

frontend  status
        bind 0.0.0.0:8080    # 监控后台所使用的端口号
        mode http            # 监控后台使用 http 协议
        stats enable
        stats  uri  /monitor    # 访问监控后台所使用的 URI
        stats auth admin:admin  # 登录监控后台所用到的用户名和密码
        stats hide-version   # 隐藏 HAProxy 的版本号
        stats admin if TRUE  # 管理界面,如果认证成功了可通过 WebUI 管理节点
        stats  refresh  30s  # 监控后台的页面每 30 s 刷新一次

访问 http://x.x.x.x:8080/monitor,输入用户名 admin 和密码 admin 即可进入 HAProxy 的监控后台,监控后台如下图所示:

HAProxy 的监控后台
HAProxy 的监控后台
打赏作者
这里是 “ CCIE 工程师社区 ” 官方的捐款通道,您是否可以考虑请我们喝杯咖啡呢?

您的支持将鼓励我们继续创作!

[微信] 扫描二维码打赏

[支付宝] 扫描二维码打赏

Was this article helpful?

Related Articles

Leave A Comment?

This site uses Akismet to reduce spam. Learn how your comment data is processed.