nginx分发算法

nginx分发算法upstream

分发算法有:轮询,weight(权重),ip_hash(每个访客固定访问一个后端服务器),fair(按响应时间分类),url_hash(每个url定向一个后端服务器)
轮询和weight适合静态页面,不适合动态页面
ip_hash 适合动态页面

基于请求分发:

  1. 基于host分发
  2. 基于开发语言分发
  3. 基于浏览器分发
  4. 基于源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;
 }
  1. 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
  2. 请求url为http://192.168.10.42/a/b/c/index.php
    $request_uri 指文件目录 /a/b/c/index.php
    这个字段会随着分发器传递给服务器
原创文章 88 获赞 66 访问量 6万+

猜你喜欢

转载自blog.csdn.net/xgy123xx/article/details/104492366