当前位置:首页 > 文章列表 > 文章 > linux > Linux负载均衡教程:HAProxy与Nginx详解

Linux负载均衡教程:HAProxy与Nginx详解

2025-08-02 17:48:29 0浏览 收藏

还在为Linux应用的负载均衡配置发愁吗?本文以“Linux负载均衡配置教程:HAProxy与Nginx详解”为题,深入探讨了如何在Linux环境下利用HAProxy和Nginx实现高效的应用负载均衡。文章首先介绍了负载均衡的基本原理,即通过负载均衡器作为客户端和后端服务器的中介,智能分发请求,保障服务连续性。随后,详细讲解了HAProxy和Nginx的配置思路,包括安装步骤、核心配置文件详解以及关键参数的设置,例如HAProxy的frontend和backend模块,Nginx的upstream模块和proxy_pass指令。针对HAProxy和Nginx的选择,文章给出了实用建议:追求极致性能和复杂调度选HAProxy,需Web服务集成选Nginx,或两者结合实现更高级的架构。最后,通过实例演示了如何用HAProxy实现HTTP负载均衡及会话保持,以及如何用Nginx配置HTTP/HTTPS负载均衡,并详细解析了配置中的关键参数,助你轻松掌握Linux负载均衡配置技巧,提升应用可用性和响应速度。

要在Linux上配置应用负载均衡,核心是使用HAProxy或Nginx作为反向代理工具。1. HAProxy适用于高并发、低延迟场景,支持多种负载均衡算法(如轮询、最少连接、源IP哈希),通过frontend和backend模块定义监听端口与后端服务器池,并启用健康检查和会话保持;2. Nginx适合需要集成Web服务的场景,提供静态文件处理、SSL终止等功能,其upstream模块结合proxy_pass指令可实现HTTP/HTTPS负载均衡,支持轮询、最少连接及IP哈希等调度方式,并可通过ip_hash实现会话保持;3. 选择标准:追求极致性能与复杂调度时优先选HAProxy,需Web服务集成则优选Nginx;4. 高级方案可结合两者优势,用HAProxy做前端TCP负载均衡,将流量转发至Nginx集群进行HTTP处理,最终再分发到应用服务器。

Linux如何配置应用负载均衡?_LinuxHAProxy与Nginx负载均衡教程

Linux上配置应用负载均衡,核心就是利用HAProxy或Nginx这类强大的反向代理工具,将客户端涌入的请求智能地分发到后端多台服务器上。这不仅能有效分散单点压力,大幅提升应用的整体可用性、响应速度,还能为未来的业务扩展提供坚实的基础。说白了,就是让你的服务不再“单打独斗”,而是形成一个高效协作的集群。

Linux如何配置应用负载均衡?_LinuxHAProxy与Nginx负载均衡教程

解决方案

要实现Linux上的应用负载均衡,我们通常会选择HAProxy或Nginx。这两个工具各有侧重,但都能胜任这项工作。

基本原理: 负载均衡器作为客户端和后端服务器之间的中介,接收所有入站请求,然后根据预设的算法(比如轮询、最少连接等)将这些请求转发给集群中健康的后端服务器。一旦某台后端服务器出现故障,负载均衡器能够自动检测到并停止向其发送请求,从而保障服务的连续性。

Linux如何配置应用负载均衡?_LinuxHAProxy与Nginx负载均衡教程

HAProxy的配置思路: HAProxy以其高性能和丰富的负载均衡算法而闻名,特别适合高并发场景下的TCP和HTTP负载均衡。

  1. 安装HAProxy:

    Linux如何配置应用负载均衡?_LinuxHAProxy与Nginx负载均衡教程
    sudo apt update
    sudo apt install haproxy -y # Debian/Ubuntu
    # 或者
    sudo yum install haproxy -y # CentOS/RHEL
  2. 核心配置 /etc/haproxy/haproxy.cfg HAProxy的配置通常分为global(全局设置)、defaults(默认设置)、frontend(前端监听)和backend(后端服务器池)几个部分。

    global
        log /dev/log    local0 info
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon
        # 最大并发连接数,根据服务器性能调整
        maxconn 20000
    
    defaults
        mode http # 默认工作模式为HTTP,也可以是tcp
        log global
        # 默认超时设置
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        # 错误页
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http
    
    # 前端:监听80端口,接收HTTP请求
    frontend my_app_frontend
        bind *:80
        mode http
        default_backend my_app_backend
    
    # 后端:定义应用服务器池
    backend my_app_backend
        mode http
        balance roundrobin # 负载均衡算法:轮询
        # 启用健康检查,每2秒检查一次,2次失败后标记为down,5秒后重试
        option httpchk GET /healthz
        http-check expect status 200
        server app1 192.168.1.101:80 check inter 2s fall 2 rise 1
        server app2 192.168.1.102:80 check inter 2s fall 2 rise 1
        server app3 192.168.1.103:80 check inter 2s fall 2 rise 1 backup # 标记为备用服务器,主服务器都down时才启用
    
    # HAProxy 统计页面
    listen stats_page
        bind *:8080
        stats enable
        stats uri /haproxy_stats
        stats realm HAProxy\ Statistics
        stats auth admin:password123 # 设置访问统计页面的用户名和密码
  3. 启动/重启HAProxy服务:

    sudo systemctl enable haproxy
    sudo systemctl restart haproxy
    sudo systemctl status haproxy

Nginx的配置思路: Nginx作为高性能的Web服务器和反向代理,在处理HTTP/HTTPS流量方面非常出色,其负载均衡功能也相当强大且易于配置。

  1. 安装Nginx:

    sudo apt update
    sudo apt install nginx -y # Debian/Ubuntu
    # 或者
    sudo yum install nginx -y # CentOS/RHEL
  2. *核心配置 /etc/nginx/nginx.conf 或 `conf.d/.conf:** Nginx的负载均衡主要通过upstream模块和proxy_pass`指令实现。

    # 在http块内定义上游服务器组
    http {
        upstream my_app_servers {
            # 默认是轮询 (round-robin)
            server 192.168.1.101:80;
            server 192.168.1.102:80;
            server 192.168.1.103:80;
            # 可以添加权重:server 192.168.1.101:80 weight=3;
            # 可以添加最少连接:least_conn;
            # 可以添加ip_hash实现会话保持:ip_hash;
        }
    
        server {
            listen 80;
            server_name your_domain.com; # 替换为你的域名或IP
    
            location / {
                proxy_pass http://my_app_servers; # 将请求转发到上游服务器组
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
    
                # 错误页面配置
                error_page 500 502 503 504 /50x.html;
                location = /50x.html {
                    root /usr/share/nginx/html; # Nginx默认错误页面路径
                }
            }
        }
    }
  3. 启动/重启Nginx服务:

    sudo systemctl enable nginx
    sudo systemctl restart nginx
    sudo systemctl status nginx

HAProxy与Nginx,我该如何选择负载均衡器?

说实话,每次遇到“选哪个”的问题,我脑子里首先浮现的不是什么高大上的理论,而是那些年为了让服务不宕机而熬的夜。HAProxy和Nginx,就像是武林中的两位高手,各有绝活,选择哪一个,真的得看你的具体需求和偏好。

HAProxy:性能狂魔与专业调度员 HAProxy那家伙,简直就是个性能狂魔,纯粹为了转发而生。它在TCP和HTTP层面的负载均衡上表现极其出色,尤其是在高并发连接和低延迟方面,几乎无可匹敌。如果你追求极致的转发性能,需要复杂的负载均衡算法(比如最少连接、源IP哈希、URL哈希等),以及精细的健康检查和会话保持机制,那么HAProxy绝对是首选。它更像是一个专职的“流量指挥官”,把流量分发这事儿做到了极致。我个人偏爱HAProxy处理纯粹的TCP/HTTP代理,因为它在这方面真的极致,尤其是在L4层,它的效率和稳定性让人放心。

Nginx:多面手与Web服务集成者 Nginx呢,更像个多面手,它不仅能当负载均衡,还能搞定静态文件服务、SSL/TLS终止、HTTP缓存、URL重写等等。如果你本身就需要一个强大的Web服务器来处理静态内容,或者需要在一个入口点进行SSL证书管理,并且负载均衡只是你Web架构的一部分,那么Nginx无疑是更方便、更集成的选择。它的配置初看可能有点像在写诗,但一旦摸清了门道,你会发现它真的优雅。对于大多数Web应用而言,Nginx提供的负载均衡功能已经足够强大和灵活。

我的建议是:

  • 纯粹的TCP/HTTP负载均衡,追求极致性能和复杂调度: 选HAProxy。
  • Web服务集成,需要SSL终止、缓存、静态文件服务,同时进行负载均衡: 选Nginx。
  • 如果你想玩得更高级,可以考虑两者结合: HAProxy做前端的TCP负载均衡,将流量转发给Nginx集群,Nginx再处理HTTP/HTTPS请求并转发给应用服务器。这样可以充分发挥两者的优势。

如何用HAProxy实现HTTP负载均衡及会话保持?

用HAProxy实现HTTP负载均衡并确保会话保持,是很多Web应用场景下的刚需。这东西,说白了就是个智能交通警察,把涌进来的请求合理地分发出去,同时还得记住哪些请求是同一个“人”发出来的,得把他们引导到同一台服务器上。

我们来看一个具体的HAProxy配置示例,它会监听80端口,将HTTP请求分发到后端两台Web服务器,并使用cookie机制实现会话保持。

global
    log /dev/log    local0 info
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon
    maxconn 4000 # 增加最大连接数,应对高并发

defaults
    mode http
    log global
    option httplog # 记录HTTP请求日志
    option dontlognull # 不记录空连接
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http_front
    bind *:80
    mode http
    # 插入一个名为SERVERID的cookie,值为后端服务器的名称
    cookie SERVERID insert indirect nocache
    default_backend http_back

backend http_back
    mode http
    balance roundrobin # 负载均衡算法:轮询
    # 启用健康检查,检查后端服务器的/healthz路径,期望返回200状态码
    option httpchk GET /healthz
    http-check expect status 200

    # 定义后端服务器,并为其指定一个名称(用于cookie)
    # 'check' 开启健康检查
    # 'inter 2s' 每2秒检查一次
    # 'fall 3' 连续3次检查失败则标记为DOWN
    # 'rise 2' 连续2次检查成功则标记为UP
    # 'cookie app1' 告诉HAProxy,如果请求的cookie值是'app1',就导向这台服务器
    server app_server1 192.168.1.101:80 check inter 2s fall 3 rise 2 cookie app1
    server app_server2 192.168.1.102:80 check inter 2s fall 3 rise 2 cookie app2

配置解析:

  1. frontend http_front:

    • bind *:80: HAProxy将监听所有网络接口的80端口,接收HTTP请求。
    • mode http: 明确指定工作在HTTP模式。
    • cookie SERVERID insert indirect nocache: 这是实现会话保持的关键。
      • SERVERID: 这是将要插入到客户端浏览器中的Cookie的名称。
      • insert: 表示HAProxy会在服务器响应中插入这个Cookie。
      • indirect: 告诉HAProxy,即使后端服务器已经设置了同名Cookie,HAProxy也不会覆盖它,而是优先使用自己的。
      • nocache: 防止代理服务器缓存此Cookie。
    • default_backend http_back: 所有进入http_front的请求都将被转发到http_back后端池。
  2. backend http_back:

    • mode http: 后端池也工作在HTTP模式。
    • balance roundrobin: 负载均衡算法采用轮询方式,即依次将请求分发给后端服务器。其他常用算法还有leastconn(最少连接)、source(基于源IP哈希,也可以实现会话保持,但不如cookie灵活)。
    • option httpchk GET /healthz: 开启HTTP健康检查。HAProxy会定期向后端服务器的/healthz路径发送GET请求。
    • http-check expect status 200: 期望健康检查的响应状态码是200,否则认为服务器不健康。
    • server app_server1 192.168.1.101:80 check ... cookie app1:
      • app_server1: 这是HAProxy内部识别这台服务器的名称,也是cookie指令中cookie app1对应的服务器标识。
      • 192.168.1.101:80: 后端应用服务器的IP地址和端口。
      • check inter 2s fall 3 rise 2: 详细的健康检查参数。
      • cookie app1: 当客户端发送的请求中包含SERVERID=app1这个Cookie时,HAProxy会尝试将请求转发到app_server1这台服务器。

通过上述配置,当用户首次访问时,HAProxy会选择一台后端服务器(例如app_server1),并在响应中插入SERVERID=app1的Cookie。后续该用户的请求,只要带着这个Cookie,HAProxy就会“记住”并将请求始终发送到app_server1,从而实现会话的“粘性”。

Nginx作为反向代理,如何配置HTTP/HTTPS负载均衡?

Nginx在HTTP/HTTPS负载均衡方面,用起来相当顺手,尤其是在处理SSL/TLS加密和证书管理上,它能做到“一站式”解决。它更像是一个多功能的网关,不仅能分发流量,还能顺便把SSL证书给卸载掉,减轻后端服务器的负担。

下面是一个Nginx配置示例,涵盖了HTTP和HTTPS的负载均衡,以及简单的会话保持(基于IP哈希)。

http {
    # 定义上游服务器组,用于HTTP负载均衡
    upstream my_http_backend {
        # 默认是轮询 (round-robin)
        server 192.168.1.101:80;
        server 192.168.1.102:80;
        # 可以添加权重,例如:server 192.168.1.103:80 weight=3;
        # 最少连接调度:least_conn;
        # IP哈希会话保持:
        # ip_hash;
        # Nginx Plus(商业版)支持更高级的会话保持,如sticky cookie
    }

    # 定义上游服务器组,用于HTTPS负载均衡(如果后端服务器也跑HTTPS)
    upstream my_https_backend {
        server 192.168.1.101:443;
        server 192.168.1.102:443;
        # ip_hash; # 同样可以用于HTTPS的会话保持
    }

    # HTTP服务器块:处理HTTP请求,并转发到后端HTTP服务
    server {
        listen 80;
        server_name your_domain.com; # 替换为你的域名

        # 强制将HTTP请求重定向到HTTPS
        return 301 https://$host$request_uri;
    }

    # HTTPS服务器块:处理HTTPS请求,并转发到后端HTTP/HTTPS服务
    server {
        listen 443 ssl;
        server_name your_domain.com; # 替换为你的域名

        # SSL证书配置
        ssl_certificate /etc/nginx/ssl/your_domain.crt; # 你的证书文件路径
        ssl_certificate_key /etc/nginx/ssl/your_domain.key; # 你的私钥文件路径

        # 推荐的SSL设置,提高安全性
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

        location / {
            # 将请求转发到之前定义的HTTP后端服务器组
            proxy_pass http://my_http_backend;

            # 传递原始请求头,这对后端服务获取客户端真实IP等信息很重要
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme; # 告知后端协议是HTTPS

            # 连接超时设置
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;

            # 错误页面配置
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root /usr/share/nginx/html; # Nginx默认错误页面路径
            }
        }

        # 如果后端服务也是HTTPS,可以这样配置
        # location /secure_app {
        #     proxy_pass https://my_https_backend;
        #     proxy_ssl_server_name on; # 如果后端服务器有多个域名,需要开启SNI
        #     proxy_set_header Host $host;
        #     proxy_set_header X-Real-IP $remote_addr;
        #     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #     proxy_set_header X-Forwarded-Proto $scheme;
        # }
    }
}

配置解析:

  1. upstream my_http_backend / my_https_backend:

    • 这是Nginx定义后端服务器池的方式。你可以定义多个upstream块来对应不同的服务或端口。
    • server IP:Port;: 列出后端服务器的IP地址和端口。Nginx默认采用轮询(round-robin)方式分发请求。
    • ip_hash;: 这是Nginx实现会话保持的一种简单方式。它会根据客户端的源IP地址计算哈希值,并将来自同一IP的请求始终转发到同一台后端服务器。缺点是如果客户端IP地址变化(比如通过代理),会话可能会中断;并且在后端服务器数量较少时,负载可能不均衡。
  2. server 块 (HTTP):

    • listen 80;: 监听80端口接收

理论要掌握,实操不能落!以上关于《Linux负载均衡教程:HAProxy与Nginx详解》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

DeepSeek模型加密技术深度解析DeepSeek模型加密技术深度解析
上一篇
DeepSeek模型加密技术深度解析
PHP输出JSON小数不转科学计数法的解决方法
下一篇
PHP输出JSON小数不转科学计数法的解决方法
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 千音漫语:智能声音创作助手,AI配音、音视频翻译一站搞定!
    千音漫语
    千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
    96次使用
  • MiniWork:智能高效AI工具平台,一站式工作学习效率解决方案
    MiniWork
    MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
    89次使用
  • NoCode (nocode.cn):零代码构建应用、网站、管理系统,降低开发门槛
    NoCode
    NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
    107次使用
  • 达医智影:阿里巴巴达摩院医疗AI影像早筛平台,CT一扫多筛癌症急慢病
    达医智影
    达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
    98次使用
  • 智慧芽Eureka:更懂技术创新的AI Agent平台,助力研发效率飞跃
    智慧芽Eureka
    智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
    100次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码