在本实验中,我们将在 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
import socketdef 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 sysif len(sys.argv) != 2:print("Usage: python server.py <port>")sys.exit(1)port = int(sys.argv[1])start_server(port)
🔧 启动两个服务实例
打开两个命令行窗口,分别运行:
# 第一个服务实例
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
,在文件末尾添加:
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 目录并启动:
cd C:\nginx
start nginx
检查是否启动成功:
nginx -t
如果配置正确,不会报错。
三、使用 HAProxy 做 TCP 负载均衡(Windows 版本)
1. 下载并安装 HAProxy for Windows
前往 HAProxy 官方下载页面 或使用 HAProxy for Windows。
解压后放到 C:\haproxy
。
2. 配置 HAProxy
创建配置文件 C:\haproxy\haproxy.cfg
:
globallog 127.0.0.1 local0log 127.0.0.1 local1 noticechroot C:/haproxystats socket ipv4@127.0.0.1:9999 level adminstats timeout 30suser haproxygroup haproxydaemondefaultslog globalmode tcpoption tcplogtimeout connect 5000mstimeout client 60000mstimeout server 60000msfrontend tcp_frontbind *:9000default_backend tcp_backbackend tcp_backbalance leastconnserver server1 127.0.0.1:8000 checkserver server2 127.0.0.1:8001 check
3. 启动 HAProxy
打开命令行,进入 HAProxy 目录并运行:
cd C:\haproxy
haproxy.exe -f haproxy.cfg
四、编写客户端测试负载均衡效果(Windows)
📁 client.py
import socket
import sys
import threadingdef 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()
🚀 运行客户端测试
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、限流、健康检查等功能!