一个请求由不同的服务
进行处理,默认以轮询方式处理请求
upstream hyperf {
#Hyperf HTTP Server 的 IP 及 端口
server 127.0.0.1:9501;
server 127.0.0.1:9502;
server 127.0.0.1:9503;
server 127.0.0.1:9504;
server 127.0.0.1:9505;
}
server {
listen 80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name api.yuwei.cc;
ssl_certificate /etc/nginx/ssl/api.yuwei.cc.pem;
ssl_certificate_key /etc/nginx/ssl/api.yuwei.cc.key;
access_log /dev/null;
error_log /var/log/nginx/error_api.yuwei.cc.log;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://hyperf;
}
轮询策略
轮询(默认)
weight 默认为 1,请求按时间顺序逐一分配到不同的后端服务,会自动剔除停机的后端服务
名称 | 说明 |
---|---|
fail_timeout | 请求超时时间,与 max_fails 结合使用 |
max_fails | 请求超时次数,与 fail_timeout 结合使用 |
fail_time | 服务器自动停机的时长,默认 10s |
backup | 标记服务为备用服务,当主服务停止时,请求会被发送到这里 |
down | 标记的服务永久停机 |
权重
指定轮询几率,weight 和访问比率成正比
upstream hyperf {
#Hyperf HTTP Server 的 IP 及 端口
server 127.0.0.1:9501 weight=3;
server 127.0.0.1:9502 weight=2;
server 127.0.0.1:9503;
server 127.0.0.1:9504;
server 127.0.0.1:9505 weight=2;
}
- 权重越高分配到需要处理的请求越多
- 此策略可以与 least_conn 和 ip_hash 结合使用
-
ip_hash
请求按访问 ip 的 hash 分配,每个访客会固定访问一个后端服务,可以解决 Session 不能跨服务器的问题
upstream hyperf {
ip_hash;
#Hyperf HTTP Server 的 IP 及 端口
server 127.0.0.1:9501 weight=1;
server 127.0.0.1:9502 weight=2;
server 127.0.0.1:9503 weight=3;
server 127.0.0.1:9504 weight=4;
server 127.0.0.1:9505 weight=5;
}
nginx v1.3.1 之前的版本不能在 ip_hash 中使用权重(weight)
- ip_hash 不能与 backup 同时使用
- 此策略适合有状态服务,比如 Session
- 当有服务器需要剔除,必须手动 down 掉
least_conn
请求按连接数分配,连接数少的优先分配; 适合请求处理时间长短不一造成服务过载的情况upstream hyperf {
least_conn;
#Hyperf HTTP Server 的 IP 及 端口
server 127.0.0.1:9501 weight=1;
server 127.0.0.1:9502 weight=2;
server 127.0.0.1:9503 weight=3;
server 127.0.0.1:9504 weight=4;
server 127.0.0.1:9505 weight=5;
}
第三方策略
fair
nginx-upstream-fair:https://github.com/gnosek/nginx-upstream-fair
请求按响应时间来分配,响应时间短的优先分配upstream hyperf {
ip_hash;
#Hyperf HTTP Server 的 IP 及 端口
server 127.0.0.1:9501;
server 127.0.0.1:9502;
server 127.0.0.1:9503;
server 127.0.0.1:9504;
server 127.0.0.1:9505;
}
url_hash
nginx_upstream_hash:https://github.com/evanmiller/nginx_upstream_hash
请求按访问 URL 的 hash 分配,使每个 URL 定向到同一个后端服务,后端服务为缓存时比较有效upstream hyperf {
#在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用 hash 算法
hash $request_uri;
hash_method crc32;
#Hyperf HTTP Server 的 IP 及 端口
server 127.0.0.1:9501;
server 127.0.0.1:9502;
server 127.0.0.1:9503;
server 127.0.0.1:9504;
server 127.0.0.1:9505;
}