upstream模块是Nginx中用于定义后端服务器组的模块,主要用于负载均衡和代理设置。以下是upstream模块的详细使用方法:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
location / {
proxy_pass http://backend;
}
}
可以为每个后端服务器指定额外参数:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3.sock;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 down;
}
weight=number
- 设置服务器权重,默认为1max_conns=number
- 限制到代理服务器的最大并发连接数max_fails=number
- 失败尝试次数,超过后暂停服务fail_timeout=time
- 服务器不可用时间(与max_fails配合使用)backup
- 标记为备用服务器,当主服务器不可用时启用down
- 标记服务器永久不可用Nginx支持多种负载均衡算法:
upstream backend {
# 默认就是轮询
server backend1.example.com;
server backend2.example.com;
}
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
server backend3.example.com;
}
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
upstream backend {
fair;
server backend1.example.com;
server backend2.example.com;
}
Nginx Plus提供主动健康检查功能:
upstream backend {
zone backend 64k;
server backend1.example.com;
server backend2.example.com;
health_check interval=5s fails=3 passes=2 uri=/health;
}
开源版可通过第三方模块或被动健康检查实现:
upstream backend {
server backend1.example.com max_fails=3 fail_timeout=30s;
server backend2.example.com max_fails=3 fail_timeout=30s;
}
upstream backend {
server backend1.example.com;
server backend2.example.com;
keepalive 32; # 保持的连接数
}
upstream backend {
zone backend 64k; # 为worker进程间共享配置分配内存
server backend1.example.com;
server backend2.example.com;
}
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
upstream web_app {
server 10.0.0.1:8080 weight=3;
server 10.0.0.2:8080;
server 10.0.0.3:8080 backup;
keepalive 16;
}
server {
listen 80;
location / {
proxy_pass http://web_app;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
upstream mysql_servers {
least_conn;
server db1.example.com:3306;
server db2.example.com:3306;
server db3.example.com:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_servers;
}
ip_hash
时,不能使用weight
参数keepalive
指令需要配合proxy_http_version 1.1
和proxy_set_header Connection ""
使用ngx_http_upstream_module
提供的变量实现通过合理配置upstream模块,可以构建高性能、高可用的后端服务架构。