【开发日记】换掉Nginx,使用HAProxy作为反向代理服务器

发布时间:2024年01月23日

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:8002check表示定期检查该服务器的健康状况;resolvers mydns表示使用我们在全部参数中设置的DNS解析器来解析该服务器域名;resolve-prefer ipv4表示解析DNS时优先使用IPv4地址。

8、SSL证书

配置文件中使用到的SSL证书用的是阿里云的免费证书,下载证书时候选择Apache服务器类型,如下图所示。

图片

下载SSL证书

下载完成后进行解压,解压后会得到如下几个文件:test.com_chain.crttest.com.keytest.com_public.crt

使用如下命令生成HAProxy需要的密钥文件:

cat?test.com_public.crt?test.com_chain.crt?test.com.key?>?/etc/haproxy/test.com.pem

命令中的文件路径请根据自己的文件路径调整。

文章来源:https://blog.csdn.net/Stand_Fast/article/details/135766081
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。