如何将用户请求按照一定的规律分发给业务服务器。主要分为Nginx集群默认算法和基于请求头分发算法。
nginx的upstream 目前支持4种方式的分配
nginx有很多第三方模块,各位可以去下载使用
https://www.nginx.com/resources/wiki/modules/
每个设备的状态设置参数:
实验机 :四台虚拟机,一台测试机,一台分发器,两台web服务器。
网卡:vmnet4
系统:CentOS8.0
SELinux&防火墙:关闭
网段:192.168.0.0/24
upstream web {
server 192.168.0.42;
server 192.168.0.43;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
前面已经测试验证了轮询算法分发。
配置backup参数
upstream web {
server 192.168.0.42;
server 192.168.0.43 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
先正常访问测试
[root@client ~]# curl 192.168.0.40
web1
[root@client ~]# curl 192.168.0.40
web1
[root@client ~]# curl 192.168.0.40
web1
关停第一个节点情况,访问尝试:
[root@web1 ~]# systemctl stop httpd
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# curl 192.168.0.40
web2
启动第一个节点测试
[root@web1 ~]# systemctl start httpd
[root@client ~]# curl 192.168.0.40
web1
[root@client ~]# curl 192.168.0.40
web1
[root@client ~]# curl 192.168.0.40
web1
通过配置权重,可以让性能好的服务器承担更多的负载
upstream web {
# 设置权重比例1:2
server 192.168.0.42 weight=1;
server 192.168.0.43 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
测试
[root@client ~]# curl 192.168.0.40
web1
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# curl 192.168.0.40
web1
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# curl 192.168.0.40
web2
ip_hash算法能够保证来自同样源地址的请求都分发到同一台主机。 需要注意:ip_hash算法不支持backup、weight设置。默认权重为1。
upstream web {
ip_hash; # 指定ip_hash即可,默认weight权重比例1: 1
server 192.168.0.42;
server 192.168.0.43;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
}
测试
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# curl 192.168.0.40
web2
[root@client ~]# curl 192.168.0.40
web2
切换到另外一台不同网段的主机
MacBook-Pro:~ hello$ ifconfig
vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether 00:50:56:c0:00:08
inet 172.16.121.1 netmask 0xffffff00 broadcast 172.16.121.255
MacBook-Pro:~ hello$ curl 172.16.121.134
web1
MacBook-Pro:~ hello$ curl 172.16.121.134
web1
MacBook-Pro:~ hello$ curl 172.16.121.134
web1
不同的URL我去找不同的机器访问,就是把url计算出一个值然后除以机器的数量取余 ,需要安装第三方插件
nginx分发器上,将nginx主程序包和下载好的第三方软件包放在同一个目录下解压
[root@master ~]# cd nginx-1.15.12/
[root@master ~]# ./configure --prefix=/usr/local/nginx --add-module=/root/ngx_http_consistent_hash-master
第三方模块的安装方法
[root@master ~]# make & make install
[root@master ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web {
consistent_hash $request_uri;
server 192.168.0.42 ;
server 192.168.0.43 ;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@master ~]# /usr/local/nginx/sbin/nginx
在web主机上生成测试页面
[root@web1 ~]# for i in `seq 1 10`; do echo "web1_$i" > /var/www/html/$i.html; done
[root@web2 ~]# for i in `seq 1 10`; do echo "web2_$i" > /var/www/html/$i.html; done
这样我们就知道测试的时候访问的是哪台机器的页面文件了
测试访问
[root@client ~]# for i in `seq 1 10`; do curl http://192.168.0.40/$i.html; done
web1_1
web1_2
web1_3
web2_4
web2_5
web1_6
web2_7
web1_8
web2_9
web2_10
这个方式一般用在我们的缓存上,目的是为了命中率,什么是命中率,也就是说同样是下数据,你要是从源下就是没有命中,从缓存下就是命中