在 nginx 中,轮询负载均衡默认使用 upstream 块中定义的端口。如果需要指定不同的端口号,必须在 server 指令中显式写出 ip 地址和对应的端口,例如 server 192.168.1.10:8080;。nginx 的 round_robin(默认轮询)算法会按照配置顺序依次将请求分发到这些不同端口的后端服务上。

如何配置多端口轮询负载
要配置多端口轮询,只需在 upstream 块中添加多个 server 指令,每个指令包含不同的主机和端口组合即可。Nginx 会自动对这些后端进行轮询调度。

worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream backend_pool {
# 定义轮询组,默认即为 round_robin
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
location / {
proxy_pass http://backend_pool;
}
}
}
上述配置中,客户端访问 localhost:80 时,Nginx 会将请求依次转发到 :8080、:8081 和 :8082。如果某个后端不可用,Nginx 会根据健康检查机制跳过该节点(需配合 max_fails 等参数)。这种配置适用于同一台机器上运行多个不同端口服务的场景,或者分布式系统中不同节点提供不同端口服务的场景。
轮询在不同端口间的分配逻辑
轮询算法在多端口环境下依然保持简单的顺序循环特性。它不关心后端的具体业务逻辑,只负责按配置列表的顺序分发请求。如果后端服务状态发生变化,比如某个端口宕机,Nginx 的行为取决于是否启用了故障转移。

# 假设后端 8081 宕机,配置如下:
upstream backend_pool {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8082 max_fails=3 fail_timeout=30s;
}
当 127.0.0.1:8081 连续失败次数达到 max_fails 设定的值后,Nginx 会在 fail_timeout 时间内将其从轮询列表中移除。此时,请求将在 :8080 和 :8082 之间继续轮询。一旦恢复,经过一定时间后,该节点会重新加入轮询池。这种机制确保了在多端口部署中,即使部分服务实例异常,整体负载均衡依然能维持运转。
基于特定端口返回结果的验证问题
为了验证不同端口的轮询效果,可以编写一个简单的测试脚本,模拟多次请求并记录响应来源。通过观察返回结果中的端口信息,可以确认请求是否被正确分发到不同的后端服务。
import requests
url = "http://localhost:80"
for i in range(6):
try:
response = requests.get(url)
print(f"Request {i+1}: Status {response.status_code}, Body: {response.text.strip()}")
except Exception as e:
print(f"Request {i+1}: Error - {e}")
运行上述脚本后,预期输出应显示请求交替或循环地由不同端口的后端处理。如果后端服务返回了包含自身端口信息的标识(如 Response from port 8080),则可以直观看到轮询过程。若所有请求都指向同一端口,则可能意味着其他后端未启动或配置有误。通过这种方式,可以准确判断 Nginx 是否按预期在不同端口间进行了负载均衡。


















