在 linux 中,nginx 的 least_conn 算法在处理 websocket 长连接时,会基于当前活跃连接数进行分发。由于 websocket 建立后连接保持打开状态,新请求会被分配给当前活跃连接最少的后端服务器,从而实现负载均衡。

配置 least_conn 与 upstream 块
要实现这一功能,需要在 Nginx 配置文件的 upstream 块中指定 least_conn 指令,并将 WebSocket 代理指向该上游组。

upstream websocket_backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
server_name example.com;
location /ws {
proxy_pass http://websocket_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}上述配置中,proxy_http_version 1.1 和 Upgrade、Connection 头部的设置是 WebSocket 握手的关键。当客户端发起连接请求时,Nginx 会根据 least_conn 策略选择后端服务器。一旦连接建立,该连接将被计入所选服务器的活跃连接数中,直到连接关闭。
验证连接分发效果
可以通过模拟多个并发 WebSocket 连接来验证 least_conn 的分发效果。使用工具如 wscat 或编写简单的 Python 脚本发起连接,并观察后端服务器的日志或连接统计信息。

# Python 示例:使用 websockets 库发起连接
import asyncio
import websockets
async def connect_ws(uri):
async with websockets.connect(uri) as ws:
await ws.send("Hello")
response = await ws.recv()
print(f"Received: {response}")
async def main():
uris = ["ws://example.com/ws"] * 10 # 模拟10个连接
tasks = [asyncio.create_task(connect_ws(uri)) for uri in uris]
await asyncio.gather(*tasks)
asyncio.run(main())运行上述脚本后,可以检查后端服务器 192.168.1.10 和 192.168.1.11 的活跃连接数。理想情况下,两个服务器的连接数应大致相等,体现 least_conn 的均衡效果。
基于程序中某个输入、条件或结果的具体问题
如果后端服务器处理消息较慢,导致连接堆积,least_conn 可能会将新连接分配到负载较高的服务器,因为它的判断依据是当前活跃连接数而非处理能力。此时,可以考虑结合 weight 参数调整服务器权重,或引入更复杂的健康检查机制。


















