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

本文介绍了HAProxy作为高性能负载均衡器的特点,与Nginx的比较,以及在Ubuntu20.04环境中安装和配置HAProxy的详细过程,特别关注了其在反向代理和SSL证书方面的优势与问题.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

### Nacos 跨网段服务调用解决方案 对于Nacos在不同网段中的服务调用问题,核心在于确保各个微服务能够正确解析并访问彼此的服务实例。当多个服务分布在不同的网络环境中时,可能会遇到因内部IP地址(如`172.x.x.x`)导致的通信障碍[^4]。 #### 修改Nacos配置以支持跨网段服务发现 为了使Nacos能够在跨网段环境下正常工作,需调整其配置文件`application.properties`或`bootstrap.properties`,具体如下: - 设置`spring.cloud.nacos.discovery.ip`属性为实际可被外部访问的公网IP或域名; - 如果使用Kubernetes集群,则可以通过设置Service Entry的方式暴露Pod IP给Nacos; ```properties # application.properties or bootstrap.properties spring.cloud.nacos.discovery.ip=your_public_ip_or_domain_name ``` 此操作使得注册至Nacos的服务会报告一个全局可达的地址而非仅限于局域网内的私有地址。 #### 使用负载均衡器或反向代理 考虑到生产环境下的高可用性和性能需求,在前端部署一层负载均衡设备(如NginxHAProxy等),并将所有对外提供HTTP(S)请求入口统一指向该层。这样做的好处是可以集中管理SSL证书、实现HTTPS卸载等功能的同时,也方便后续扩展更多后端节点[^1]。 ```nginx upstream backend { server your_service_1_ip:port; server your_service_2_ip:port; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; } } ``` 上述Nginx配置片段展示了如何定义一组上游服务器,并通过location指令将来自客户端的流量分发给这些服务器处理。 #### 配置Spring Cloud Gateway 针对基于Spring Cloud构建的应用程序而言,还需特别注意API网关层面可能出现的问题——即默认情况下它可能尝试直接连接到Eureka/Nacos中记录的目标服务内网IP上。此时应考虑启用自定义过滤器来替换掉原始URL中的主机部分,从而强制让API网关经由预设路径转发请求而不是依赖内置机制自动查找目标位置。 ```java @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder, LoadBalancerClient loadBalancer){ return builder.routes() .route(r -> r.path("/api/**") .filters(f->f.rewritePath("/api/(?<segment>.*)", "/${loadBalancer.choose('service-name').host}:${loadBalancer.choose('service-name').port}/$\\{segment}")) .uri("http://example.com")) .build(); } ``` 这段Java代码示范了怎样创建一个新的路由规则,其中包含了重写路径逻辑以及利用LoadBalancerClient选取合适的服务实例作为最终目的地。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值