开发者

Windows与Linux环境下的高性能负载均衡教程

开发者 https://www.devze.com 2025-05-21 10:00 出处:网络 作者: Hello.Reader
目录1. NGINX 架构 & 工作原理2. Windows 平台部署2.1 下载与解压2.2 注册为 Windows 服务(可选)2.3 配置文件位置2.4 常用命令3. linux 平台部署3.1 安装(包管理/编译安装)3.2 服务管理4. 核心负载均衡配置4
目录
  • 1. NGINX 架构 & 工作原理
  • 2. Windows 平台部署
    • 2.1 下载与解压
    • 2.2 注册为 Windows 服务(可选)
    • 2.3 配置文件位置
    • 2.4 常用命令
  • 3. linux 平台部署
    • 3.1 安装(包管理/编译安装)
    • 3.2 服务管理
  • 4. 核心负载均衡配置
    • 4.1 基础 Round-Robin(轮询)
    • 4.2 Least-Connected(最少连接)
    • 4.3 IP-Hash(基于客户端 IP)
    • 4.4 加权(Weight)
    • 4.5 备用节点 & 强制下线
  • 5. 健康检查与故障恢复
    • 5.1 被动健康检查(开箱即用)
    • 5.2 主动健康检查(NGINX Plus / 第三方模块)
  • 6. 性能调优
    • 6.1 连接与缓冲
    • 6.2 超时配置
    • 6.3 内核 & 网络调优
  • 7. 监控 & 日志
    • 7.1 Stub Status
    • 7.2 日志格式自定义
    • 7.3 Prometheus 集成
  • 8. 常见故障排查
    • 9. 进阶 & 拓展
      • 总结

        1. NGINX 架构 & 工作原理

        1.Master/Worker 进程模型

        • Master:仅负责加载配置、管理 Worker(平滑重载、信号处理)。
        • Worker:事件驱动,一般与 CPU 核心数相同或略多,通过 epoll/kqueue 高效处理海量并发连接。

        2.无阻塞 I/O & 异步事件

        • 每个 Worker 在一个线程内即可管理上万连接,极大降低上下文切换。

        3.模块化设计

        HTTP、Stream、Mail 等子系统均可按需编译模块:

        • ngx_http_upstream_module(负载均衡)
        • ngx_http_stub_status_module(状态监控)
        • 第三方健康检查模块、Lua 脚本扩展等。

        2. Windows 平台部署

        适用场景:企业内部测试、与 IIS 协同(通过 ARR / AJP 协议等)或方便 Windows 环境下快速部署。

        2.1 下载与解压

        1. 访问 nginx.org(en) 下载页
        2. 获取 Stable version 的 ZIP 包,例如 nginx-1.24.0.zip
        3. 解压到 C:\nginx\ 目录。

        2.2 注册为 Windows 服务(可选)

        使用 NSSM(Non-Sucking Service Manager):

        # 假设 nssm.exe 已放在 C:\tools\nssm\nssm.exe
        C:\tools\nssm\nssm install nginx "C:\nginx\nginx.exe"
        # 启动服务
        net start nginx

        2.3 配置文件位置

        • 主配置:C:\nginx\conf\nginx.conf
        • 日志:C:\nginx\logs\Access.log / error.log

        2.4 常用命令

        # 启动
        C:\nginx\nginx.exe
        
        # 平滑重载(重读配置)js
        C:\nginx\nginx.exe -s reload
        
        # 停止
        C:\nginx\nginx.exe -s quit

        小贴士:在 Windows 下,-s reload 可能不如 Linux 稳定,可结合 NSSM 服务的重启实现零 Downtime。

        3. Linux 平台部署

        适用场景:生产环境首选。本文以 Ubuntu 为例,Centos / RHEL 同理。

        3.1 安装(包管理/编译安装)

        • 3.1.1 包管理安装
        # Ubuntu / Debian
        sudo apt update
        sudo apt install -y nginx
        
        # CentOS / RHEL
        sudo yum install -y epel-release
        sudo yum install -y nginx
        • 3.1.2 源码编译(自定义模块)
        # 安装依赖
        sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \
                             liwww.devze.combssl-dev
        
        # 下载源码并编译
        wget http://nginx.org/download/nginx-1.24.0.tar.gz
        tar zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0
        
        ./configure \
          --prefix=/usr/local/nginx \
          --with-http_ssl_moduleBiNRdwy \
          --with-http_v2_module \
          --with-http_stub_status_module \
          --with-stream \
          --with-stream_ssl_module
        make && sudo make install

        3.2 服务管理

        Systemd

        sudo systemctl enable nginx
        sudo systemctl start nginx
        sudo systemctl reload nginx
        sudo systemctl status nginx

        配置目录

        • /etc/nginx/nginx.conf:主配置
        • /etc/nginx/conf.d/*.conf:虚拟主机/负载均衡片段
        • /usr/share/nginx/html/:默认静态服务根

        4. 核心负载均衡配置

        以下示例均放在 http { … } 段内。

        4.1 基础 Round-Robin(轮询)

        upstream backend {
            server srv1.example.com:80;
            server srv2.example.com:80;
            server srv3.example.com:80;
        }
        
        server {
            listen 80;
            location / {
                proxy_pass http://backend;
            }
        }
        • 特性:默认轮询,新连接依序分发;对等服务器无需额外指令。

        4.2 Least-Connected(最少连接)

        upstream backend {
            least_conn;
            server srv1.example.com;
            server srv2.example.com;
            server srv3.example.com;
        }
        • 场景:请求耗时差异大,或部分节点性能不同,动态均衡更公平。

        4.3 IP-Hash(基于客户端 IP)

        upstream backend {
            ip_hash;
            server srv1.example.com;
            server srv2.example.com;
            server srv3.example.com;
        }
        • 会话保持:同一客户端 IP 始终打到同一后端,适用于有状态应用(Session、购物车等)。

        4.4 加权(Weight)

        upstream backend {
            server srv1.example.com weight=4;
            server srv2.example.com weight=1;
            server srv3.example.com weight=1;
        }
        • 意义:每 6 个请求中,srv1 将承担 4 个,其他各 1 个。可与任意调度算法(轮询、least_conn、ip_hash)联合使用。

        4.5 备用节点 & 强制下线

        upstream backend {
            server srv1.example.com;
            server srv2.example.com backup;   # 仅在主组不可用时才使用
            server srv3.example.com down;     # 永久下线(手动维护)
        }

        5. 健康检查与故障恢复

        5.1 被动健康检查(开箱即用)

        • max_fails:连续失败次数
        • fail_timeout:失败后多长时间内禁用
        upstream backend {
            server srv1.example.com max_fails=2 fail_timeout=15s;
            server srv2.example.com;
        }

        流程

        • 若 2 次请求超时/断开,srv1 标记为 Unhealthy;
        • 禁用 15s;
        • 15s 后首次新请求探活,成功即恢复。

        5.2 主动健康检查(NGINX Plus / 第三方模块)

        • NGINX Plus:内置 health_check 与可视化 API。
        • Open Source:可编译 nginx-upstream-check-module,或使用 Lua 脚本按固定间隔 http 探测。

        6. 性能调优

        6.1 连接与缓冲

        # 在 http{} 顶层设置
        worker_connections  10240;      # 每 Worker 最大连接数
        keepalive_timeout   65s;        # 客户端长连接超时
        keepalive_requests  100;        # 单连接最大请求数
        • proxy_buffers:调整上游响应缓冲区
        • proxy_busy_buffers_size:大响应场景优化

        6.2 超时配置

        server {
            proxy_connect_timeout  3s;   # 建立 TCP 连接超时
            proxy_send_timeout     10s;  # 发送请求到后端超时
            proxy_read_timeout     30s;  # 接收后端响应超时
        }

        6.3 内核 & 网络调优

        • somaxconn
        sysctl -w net.core.somaxconn=65535
        • tcp_tw_reuse/tcp_fin_timeout:加速 TIME_WAIT 回收
        • ulimit -n:提升文件描述符上限

        7. 监控 & 日志

        7.1 Stub Status

        server{} 段开启:

        location /nginx_status {
            stub_stjsatus on;
            allow  127.0.0.1;
            deny   all;
        }

        输出示例:

        Active connections: 291 
        server accepts handled requests
         15394 15394 54123 
        Reading: 0 Writing: 1 Waiting: 290

        7.2 日志格式自定义

        log_format main '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        'rt=$request_time ua="$upstream_addr" us="$upstream_response_time"';
        access_log /var/log/nginx/access.log main;
        • rt/us 可用于请求耗时分析、后端性能监控。

        7.3 Prometheus 集成

        • 使用 nginx-prometheus-exporter;
        • 结合 Grafana 构建实时大屏。

        8. 常见故障排查

        场景错误表现排查思路
        后端 502 Bad Gateway502 页面检查后端服务是否启动;error.log 中定位 upstream prematurely closed
        超时 504 Gateway请求超时调大 proxy_read_timeout;后端性能分析
        配置重载失败invalid number…语法检查:nginx -http://www.devze.comt;注意分号、括号
        连接数耗尽500 / 卡顿提升 worker_connections;监控 Active connections

        9. 进阶 & 拓展

        • 动态 DNS 解析
        server backend.example.com resolve; + resolver
        • gRPC & HTTP/2
        http2 on;
        grpc_pass grpc://backend;
        • 缓存proxy_cache_path + proxy_cache
        • 安全:IP 白名单、WAF(ModSecurity)、TLS 卸载与硬件加速

        总结

        本文系统地覆盖了:

        1. NGINX 架构与事件模型
        2. Windows 与 Linux 双平台安装、服务化
        3. 核心调度算法:轮询、最少连接、IP 哈希、加权、备用/下线
        4. 健康检查(被动 & 主动)
        5. 性能与内核调优
        6. 监控、日志采集与可视化
        7. 常见故障排查与进阶功能

        通过以上实践,您可在自研环境或生产集群中,快速搭建一个高可用、可扩展的 HTTP 负载均衡层。后续可结合微服务网关(Service Mesh)、WAF、安全审计与灰度发布,实现更高级的流量控制与运维自动化。

        以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

        0

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        关注公众号