【系统部署知识汇总】第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 虚拟机 2核4G
• ⽹卡:桥接
• 系统: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;
}