nginx upstream 高级配置
upstream 模块的高级用法:健康检查、会话保持、慢启动
语法
upstream name { ... }参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
least_conn |
最少连接数策略 | least_conn; |
常用 |
ip_hash |
IP 哈希(会话保持) | ip_hash; |
常用 |
hash |
自定义哈希键 | hash $request_uri consistent; |
进阶 |
keepalive |
与后端保持长连接数 | keepalive 32; |
进阶 |
down |
标记服务器为下线 | server 127.0.0.1:3001 down; |
常用 |
示例
会话保持(IP Hash)
upstream app {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}同一 IP 始终访问同一后端
长连接优化
upstream backend {
server 127.0.0.1:3000;
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}减少 TCP 连接建立开销
灰度发布
upstream app_v1 {
server 127.0.0.1:3001;
}
upstream app_v2 {
server 127.0.0.1:3002;
}
server {
location / {
# 10% 流量到新版本
set $backend app_v1;
if ($cookie_version = "v2") {
set $backend app_v2;
}
proxy_pass http://$backend;
}
}通过 Cookie 控制流量分配
常见错误
keepalive 不生效
必须设置 proxy_http_version 1.1 和清空 Connection 头
技巧
- keepalive 配合 proxy_http_version 1.1 使用
- ip_hash 在后端服务器数量变化时会导致大量重新分配
- consistent hash 比 ip_hash 在扩缩容时更平滑