在 Windows 使用 Nginx/HAProxy 实现负载均衡

在本实验中,我们将在 Windows 系统 上使用 Python 编写一个 TCP 服务器 ,并启动两个服务实例。然后使用 Nginx 或 HAProxy 作为负载均衡器,将来自多个客户端的请求分发到这两个服务实例上,验证负载均衡效果。

🧩 环境准备

  • 操作系统:Windows 10 / Windows 11
  • Python 3.x(建议使用 Python 3.10+)
  • Nginx for Windows 或 HAProxy for Windows
  • 10 个客户端(使用 Python 编写)

一、Python TCP 服务器代码

📁 server.py

python 复制代码
import socket

def start_server(port):
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', port))
    server_socket.listen(5)
    print(f"Server started on port {port}")

    while True:
        client_socket, addr = server_socket.accept()
        print(f"Connection from {addr}")
        data = client_socket.recv(1024)
        print(f"Received: {data.decode()}")

        response = f"Response from server on port {port}\n"
        client_socket.sendall(response.encode())
        client_socket.close()

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 2:
        print("Usage: python server.py <port>")
        sys.exit(1)
    port = int(sys.argv[1])
    start_server(port)

🔧 启动两个服务实例

打开两个命令行窗口,分别运行:

bash 复制代码
# 第一个服务实例
python server.py 8000

# 第二个服务实例
python server.py 8001

二、使用 Nginx 做 TCP 负载均衡(Windows 版本)

Nginx Windows 版本默认 不包含 stream 模块 ,所以需要使用 第三方模块 或使用 WSL(推荐使用 WSL)。不过我们这里使用 Nginx for Windows 的 stream 模块支持版本。

1. 下载并安装 Nginx for Windows(含 stream 模块)

推荐使用 Nginx + stream module for Windows 或使用 XAMPP 中的 Nginx。

下载后解压到目录,例如:C:\nginx

2. 配置 Nginx TCP 负载均衡

编辑 C:\nginx\conf\nginx.conf,在文件末尾添加:

nginx 复制代码
stream {
    upstream tcp_backend {
        least_conn;
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }

    server {
        listen 9000;
        proxy_pass tcp_backend;
    }
}

3. 启动 Nginx

在命令行中进入 Nginx 目录并启动:

cmd 复制代码
cd C:\nginx
start nginx

检查是否启动成功:

cmd 复制代码
nginx -t

如果配置正确,不会报错。


三、使用 HAProxy 做 TCP 负载均衡(Windows 版本)

1. 下载并安装 HAProxy for Windows

前往 HAProxy 官方下载页面 或使用 HAProxy for Windows。

解压后放到 C:\haproxy。

2. 配置 HAProxy

创建配置文件 C:\haproxy\haproxy.cfg:

haproxy 复制代码
global
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    chroot C:/haproxy
    stats socket ipv4@127.0.0.1:9999 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    mode    tcp
    option  tcplog
    timeout connect 5000ms
    timeout client  60000ms
    timeout server  60000ms

frontend tcp_front
    bind *:9000
    default_backend tcp_back

backend tcp_back
    balance leastconn
    server server1 127.0.0.1:8000 check
    server server2 127.0.0.1:8001 check

3. 启动 HAProxy

打开命令行,进入 HAProxy 目录并运行:

cmd 复制代码
cd C:\haproxy
haproxy.exe -f haproxy.cfg

四、编写客户端测试负载均衡效果(Windows)

📁 client.py

python 复制代码
import socket
import sys
import threading

def send_request(client_id):
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('127.0.0.1', 9000))
    message = f"Hello from client {client_id}"
    client_socket.sendall(message.encode())
    response = client_socket.recv(1024).decode()
    print(f"Client {client_id} received: {response}")
    client_socket.close()

if __name__ == "__main__":
    threads = []
    for i in range(1, 11):  # 启动10个客户端
        t = threading.Thread(target=send_request, args=(i,))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

🚀 运行客户端测试

bash 复制代码
python client.py

五、查看服务器日志确认负载均衡效果

运行两个服务端(8000 和 8001),观察它们的输出日志,确认请求是否被交替分配。

示例输出(server.py):

复制代码
Connection from ('127.0.0.1', 54321)
Received: Hello from client 1
Connection from ('127.0.0.1', 54322)
Received: Hello from client 2

如果两个服务端交替收到请求,说明负载均衡生效。


六、常见问题与注意事项(Windows)

问题 解决方法
bind: permission denied 使用管理员权限运行 CMD
socket.error: [WinError 10048] 确保端口未被占用
Nginx 启动失败 检查 nginx.conf 是否语法正确,关闭占用 80/9000 端口的程序
HAProxy 启动失败 检查配置文件路径、端口是否被占用
Windows 防火墙拦截 添加 Nginx/HAProxy 为允许通过防火墙的程序

七、总结

工具 协议支持 负载均衡算法 Windows 支持 优点
Nginx TCP(需 stream 模块) least_conn, round-robin 有限(推荐使用 WSL) 易于配置,适合 HTTP/TCP 混合场景
HAProxy TCP least_conn, round-robin, uri 等 支持(需下载 Windows 版本) 专业 TCP 负载均衡器,功能丰富

有兴趣的还可以继续实现 HTTPS、限流、健康检查等功能!

相关推荐
叼烟扛炮13 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
Thneonl1 天前
桌宠穿透不是一行 SetWindowLong
windows·程序员
Csvn2 天前
认识 Nginx
后端·nginx
艺杯羹2 天前
Windows原生软件锁设计:从暴力杀进程丢数据到零轮询事件驱动架构
windows·系统架构·开源·开源软件·内存管理·开源协议
陈希1232 天前
Nginx 从入门到能扛事:反向代理、负载均衡与 HTTPS 实战
nginx·https·负载均衡
csdn_aspnet2 天前
Redis 入门:Windows、Mac安装指南
数据库·windows·redis·缓存·mac
木头左3 天前
【Nginx】内网服务源 IP 白名单实战:动态域名解析放行网段 + 端口接管零改造
运维·nginx·白名单·反向代理
skywalk81633 天前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
没差c3 天前
winsw将jar、nginx等注册为Windows服务
windows·nginx·jar
光谱SpectrAI3 天前
Claude Code 2.1.318 的隐私模块:4 条命令,拦了 2 条
windows