HAProxy,全称为 "High Availability Proxy",是一款开源的、高性能的负载均衡器和代理服务器。主要用于改善应用程序的可用性、可靠性和性能。
与大众熟知的Nginx相比各有优缺点,如果你需要的是一个Web服务器,还是首选Nginx,虽然HAProxy也能实现相同效果,但却需要通过十分繁琐的配置才能达到与Nginx相同的水平。
HAProxy最擅长的还是负载均衡、限流、反向代理,在这些方向HAProxy的性能是明显高于Nginx的。
最重要的是Nginx有一个致命的问题就是作为反向代理服务器时有DNS缓存,并且即使配置了DNS缓存有效时间也不能生效,当然也有可能是我的打开方式不对。
下面是我使用HAProxy作为反向代理服务器的一个案例,可进行参考。
1、运行环境
操作系统:Ubuntu 20.04
HAProxy版本:HAProxy 2.6.16
2、安装HAProxy
sudo apt-get update
sudo apt-get install haproxy
3、配置文件
HAProxy的配置文件路径位于/etc/haproxy/haproxy.cfg
。
先把配置文件的全部内容放出来,下面对配置内容进行说明:
global
chroot /var/lib/haproxy
daemon
resolvers mydns
nameserver dns1 223.5.5.5:53
nameserver dns2 114.114.114.114:53
hold valid 120s
defaults
log global
mode http
option httplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend https_front
bind *:443 ssl crt /etc/haproxy/test.cn.pem
acl url_online path_beg /online
use_backend online_backend if url_online
frontend http_front
bind *:80
acl url_online path_beg /online
use_backend online_backend if url_online
backend online_backend
http-request set-header X-Real-IP %[src]
http-request set-path %[path,regsub(^/online/,/)]
server tworice www.test.com:8002 check resolvers mydns resolve-prefer ipv4
4、全局参数
在 HAProxy 配置文件中,global
部分用于设置全局参数,这些参数会影响 HAProxy 的整体运行方式。
global
chroot /var/lib/haproxy
daemon
resolvers mydns
nameserver dns1 223.5.5.5:53
nameserver dns2 114.114.114.114:53
hold valid 120s
在如上配置中,chroot /var/lib/haproxy
表示将HAProxy 的运行环境隔离到指定的目录,这样攻击者就无法访问运行环境之外的文件系统了。
daemon
表示HAProxy 以守护后台进程模式运行。
resolvers mydns ...
表示指定DNS服务器,并且DNS缓存最多保存120秒。
5、默认参数
在 HAProxy 的配置中,defaults
用于定义默认设置。这部分的设置会应用于配置文件中后续定义的所有 frontend
和 backend
部分,但可以被覆盖。
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
mode http
表示当前工作模式为 HTTP 模式,用于HTTP 负载均衡器或 HTTP 反向代理。
timeout connect 5000ms
表示HAProxy 尝试与后端服务器建立连接的最大等待时间。
timeout client 50000ms
表示客户端与 HAProxy 之间的最大闲置连接时间。
timeout server 50000ms
表示HAProxy 与后端服务器之间的最大闲置连接时间。
6、前端部分
前端部分表示HAProxy 接收进入连接的入口点。在前端部分定义如何处理进入的客户端请求。
bind *:443 ssl crt /etc/haproxy/test.cn.pem
以上配置表示监听443端口,并且指定了SSL证书。
acl url_online path_beg /online
以上配置表示创建了一个名为url_online
的访问控制项,用于检查进入请求的 URL 路径是否以 /online
开头。
use_backend online_backend if url_online
以上配置表示如果满足名为url_online
的访问控制项条件后将流量转发到名为online_backend
的后端部分。
7、后端部分
后端部分表示HAProxy定义处理请求的服务器配置。
http-request set-header X-Real-IP %[src]
以上配置表示将请求头中的X-Real-IP
参数设置为请求的源IP地址。
http-request set-path %[path,regsub(^/online/,/)]
以上配置表示修改请求路径内容,将路径中的/online/
替换为/
。原始请求路径为 /online/example
,修改后的路径将变为 /example
。
server tworice www.test.com:8002 check resolvers mydns resolve-prefer ipv4
以上配置定义了一个名为tworice
后台服务器,服务器的地址为www.test.com:8002
;check
表示定期检查该服务器的健康状况;resolvers mydns
表示使用我们在全部参数中设置的DNS解析器来解析该服务器域名;resolve-prefer ipv4
表示解析DNS时优先使用IPv4地址。
8、SSL证书
配置文件中使用到的SSL证书用的是阿里云的免费证书,下载证书时候选择Apache
服务器类型,如下图所示。
下载SSL证书
下载完成后进行解压,解压后会得到如下几个文件:test.com_chain.crt
、test.com.key
、test.com_public.crt
。
使用如下命令生成HAProxy需要的密钥文件:
cat test.com_public.crt test.com_chain.crt test.com.key > /etc/haproxy/test.com.pem
命令中的文件路径请根据自己的文件路径调整。