nginx中upstream
时间: 2025-05-22 14:50:11 浏览: 14
### Nginx Upstream 配置及用法
Nginx 的 `upstream` 模块主要用于实现负载均衡和高可用性,通过合理的配置可以显著提升系统的性能和稳定性。以下是关于 Nginx `upstream` 的详细说明。
#### 1. 基础概念
`upstream` 是 Nginx 中的一个模块,允许用户定义一组后端服务器,并将其作为一个逻辑单元进行调用。这使得前端请求可以根据预设策略分发到不同的后端服务器上[^1]。
#### 2. 配置语法
在 Nginx 配置文件中,`upstream` 的基本结构如下:
```nginx
upstream backend {
server address[:port];
}
```
其中:
- `backend` 是自定义的名称,供后续 `proxy_pass` 或其他指令引用。
- `address[:port]` 表示后端服务器的 IP 地址或域名以及可选的端口号。
#### 3. 负载均衡算法
Nginx 提供多种内置的负载均衡算法,默认情况下采用轮询方式(Round Robin)。除此之外,还可以通过特定参数启用其他算法[^4]。
##### (1)轮询模式
默认模式下,每次请求按顺序依次转发给列表中的每一台服务器。
##### (2)加权轮询 (`weight`)
为每台服务器指定权重值,权重越高则分配更多请求。
```nginx
upstream backend {
server 10.0.0.11:8080 weight=3;
server 10.0.0.11:6060 weight=1;
}
```
此处,第一台服务器接收三倍于第二台服务器的流量[^3]。
##### (3)基于客户端 IP 的哈希分布 (`ip_hash`)
此方法确保来自同一客户端的所有请求都被发送至固定的某一台服务器。
```nginx
upstream backend {
ip_hash;
server 10.0.0.11:8080;
server 10.0.0.11:6060;
}
```
注意:当使用 `ip_hash` 时无法同时设置 `backup` 属性[^4]。
#### 4. 后端服务器状态控制
除了简单的地址声明外,还支持更精细的状态管理选项[^4]:
| 参数 | 描述 |
|------------|----------------------------------------------------------------------|
| `down` | 手动禁用该服务器参与调度 |
| `backup` | 只有主服务器全部失效时才激活 |
| `max_conns`| 设置单个连接的最大数量 |
| `max_fails`| 定义连续失败次数阈值 |
| `fail_timeout`| 失败后的等待恢复时间 |
例如:
```nginx
upstream backend {
server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.11:6060 backup;
}
```
以上片段表明第一个实例最多容忍三次错误,在三十秒内不再接受新任务;而第二个仅作为备用方案存在[^4]。
#### 5. 流量分割依据条件 (Map)
有时需要根据不同维度动态调整目标池子,则可通过 `map` 结合定制化规则达成目的[^2]。
```nginx
http {
map $request_uri $target_group {
default tomcat_pool_a;
~*/api/v2/ tomcat_pool_b;
}
upstream tomcat_pool_a {...};
upstream tomcat_pool_b {...};
server {
location / {
proxy_pass http://$target_group;
}
}
}
```
这里展示了如何利用 URI 特征划分两组独立的服务集合[^2]。
---
### 示例代码展示
下面给出一个完整的例子来演示实际应用场景下的综合运用情况:
```nginx
# 定义上游资源池
upstream app_servers {
least_conn; # 使用最少连接数算法代替传统轮循机制
server 192.168.1.101:8080 max_conns=100 slow_start=30s;
server 192.168.1.102:8080 max_fails=2 fail_timeout=10s;
}
server {
listen 80;
location /application {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://app_servers/;
}
}
```
上述脚本实现了对两个应用程序副本间的智能分流操作[^4]。
---
阅读全文
相关推荐

















