nginx分发算法
nginx分发算法upstream
分发算法有:轮询,weight(权重),ip_hash(每个访客固定访问一个后端服务器),fair(按响应时间分类),url_hash(每个url定向一个后端服务器)
轮询和weight适合静态页面,不适合动态页面
ip_hash 适合动态页面
基于请求分发:
- 基于host分发
- 基于开发语言分发
- 基于浏览器分发
- 基于源ip
分发算法
1.轮询
upstream web {server 192.168.10.41;server 192.168.10.42;
}
server {listen 80;server_name www.bac.com;location / {proxy_pass http://web;}
}
默认比例1:1
权重weight
upstream web {server 192.168.10.41 weight=1;server 192.168.10.42 weight=2;
}
server {listen 80;server_name www.bac.com;location / {proxy_pass http://web;}
}
按比例分配,每次1个请求分给41服务器,2个请求分给42服务器
性能差的服务器比例少,性能好的服务器比例大
ip_hash
upstream web{ip_hash;server 192.168.10.41;server 192.168.10.42;
}
保证一个用户信息给一个业务服务器
ip_hash后 一台机器只能访问一个数据服务器
down
添加down字段后,该服务器不参与分发,机器损坏
upstream web{server 192.168.10.41;server 192.168.10.42 down;
}
bakcup
该服务器作为备份服务器,只有在其他服务器忙不过来时,参与分发
upstream web{server 192.168.10.41;server 192.168.10.42 backup;
}
ip_hash不支持backup和权重
关掉web01的nginx,或者web01繁忙时,就会到web02处理
基于请求头分发
1.基于host分发
多集群,多个反向代理,多个upstream
http{upstream web1 {server 192.168.10.41;}upstream web2 {server 192.168.10.42;}server {listen 80;server_name www.web1.com;location / {proxy_pass http://web1;}}server {listen 80;server_name www.web2.com;location / {proxy_pass http://web2;}}
}
访问不同域名分发到不同服务器
2.基于开发语言分发
upstream命名可以自定义,匹配路由时匹配已php结尾或html结尾分别分发到不同服务器上
一个server代表一个虚拟服务器
http{upstream php {server 192.168.10.41;}upstream html {server 192.168.10.42;}server {listen 80;server_name www.web1.com;location ~* \.php$ {proxy_pass http://php;}}server {listen 80;server_name www.web2.com;location ~* \.html$ {proxy_pass http://html;}}
}
3.基于浏览器分发
判断不同类别浏览器
upstream elinks { server 192.168.10.42; }
upstream chrome { server 192.168.10.43; }
upstream any { server 192.168.10.42:81; }
server {listen 80;server_name www.web1.com;location / {proxy_pass http://any;if ( $http_user_agent ~* Elinks ) {proxy_pass http://elinks;}if ( $http_user_agent ~* chrome ) {proxy_pass http://chrome;}}
}
$http_user_agent返回用户代理(浏览器类型)
#模糊匹配:~匹配 !~不匹配 ~* 不区分大小写的匹配
#精确匹配:= !=
4.基于源ip分发
ip库,根据源ip做匹配,判断ip属于哪个地方
upstream bj.server {server 192.168.10.42;}
upstream sh.server {server 192.168.10.43;}
upstream default.server {server 192.168.10.42:81;}
geo $geo {default default;192.168.10.241/32 bj;192.168.10.242/32 sh;
}
location / {proxy_pass http://$geo.server$request_uri;}
- geo模块,判断访问nginx的属于哪个地方的
$geo做正则匹配,值可能为default或bj或sh
请求ip默认default -》geo值为 default
请求ip为192.168.10.241/32 -》geo值为bj
请求ip为192.168.10.242/ 32-》geo值为sh - 请求url为http://192.168.10.42/a/b/c/index.php
$request_uri 指文件目录 /a/b/c/index.php
这个字段会随着分发器传递给服务器
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
