欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【系统部署知识汇总】第11章——Nginx分发算法

程序员文章站 2022-06-03 22:53:10
...

Nginx 分发算法

本节内容
01
 分发算法介绍
02
常⽤分发算法
03
算法实现测试

集群分发算法介绍 01

• 分发算法:
如何将⽤户请求按照⼀定的规律分发给业务服务器
• 思考
假如你有1000块钱,你怎么分配给身边的3个好朋友呢?

02 Nginx集群默认算法

upstream module
nginx的upstream⽬前⽀持4种⽅式的分配
1、轮询(默认)
每个请求按时间顺序逐⼀分配到不同的后端服务器,如果后端服务器down掉,能⾃动剔除。
 2、weight
指定轮询⼏率,weight和访问⽐率成正⽐,⽤于后端服务器性能不均的情况。
 3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问⼀个后端服务器,可以解决session的问题。 
4、fair(第三⽅)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
 5、url_hash(第三⽅)
按访问url的hash结果来分配请求,使每个url定向到同⼀个后端服务器,后端服务器为缓存时⽐较有效。

Nginx业务服务器状态

每个设备的状态设置为:

1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越⼤,负载的权重就越⼤。
3.max_fails :允许请求失败的次数默认为1.当超过最⼤次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout: 失败超时时间,在连接Server时,如果在超时时间之内超过max_fails指定的失败次数,会认为在fail_timeout时间内Server不可⽤。`默认为10s。`
5.backup: 其它所有的⾮backup机器down或者忙的时候,请求backup机器。所以这台机器压⼒会最轻。

基于请求头的分发

1)基于host分发
2)基于开发语言分发
3)基于浏览器的分发
4) 基于源ip

03 Nginx算法测试

声明

• 实验机器: Vmware 虚拟机 24G
• ⽹卡:桥接
• 系统:centos7.5
• 防⽕墙:关闭
• Selinux:关闭
• ⽹段:192.168.10.0/24
主机名 IP ⻆⾊
Master.ayitula.com 192.168.10.40 主分发器
Backup.ayitula.com 192.168.10.41 备分发器
Web01.ayitula.com 192.168.10.42 数据服务器1
Web02.ayitula.com 192.168.10.43 数据服务器2

轮询分发

upstream web {
 server 192.168.10.42;
 server 192.168.10.43; 
}
 server {
 listen 80;
 server_name localhost;
 location / {
 proxy_pass http://web;
 }
 }

基于权重的分发

upstream web {
 server 192.168.10.42 weight=1;
 server 192.168.10.43 weight=2; 
}
 server {
 listen 80;
 server_name localhost;
 location / {
 proxy_pass http://web;
 }
 }

iphash

ip_hash
upstream web {
 ip_hash;
 server 192.168.10.42;
 server 192.168.10.43;
}
 server {
 listen 80;
 server_name localhost;
 location / {
 proxy_pass http://web;
 }
 }
ip_hash算法能够保证来⾃同样源地址的请求,都分发到同⼀台主机

基于host分发

http {
upstream web1 {
server 192.168.10.42;
}
upstream web2 {
server 192.168.10.43; 
}
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;
	 }
 }

基于开发语⾔分发

http { 
 	upstream php {
	server 192.168.10.42;
	}
	upstream html {
	server 192.168.10.43;
	}
	
	server {
		 location ~* \.php$ {
			proxy_pass http://php;
		 } 
	 }
		 location ~* \.html$ {
			proxy_pass http://html;
		} 
	}

基于浏览器分发

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;
	 }
 }
}

基于源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;
 }