引用参考:https://juejin.im/post/5821c24e570c350060bef4c3
环境说明:
windows 下4台服务器,真实机IP:192.168.2.107,其中
服务器 |
IP |
说明 |
nginx1 |
172.17.0.3 |
nginx服务器1 |
nginx2 |
172.17.0.4 |
nginx服务器2 |
server1 |
172.17.0.5 |
服务器1 |
server2 |
172.17.0.6 |
服务器2 |
server3 |
172.17.0.7 |
服务器3 |
1 2 3 4 5 6 7 8
| C:\Users\mma>docker ps CONTAINER ID PORTS NAMES 73e6f2096612 6379/tcp, 0.0.0.0:201->22/tcp, 0.0.0.0:881->80/tcp, 0.0.0.0:3361->3306/tcp, 0.0.0.0:9004->9001/tcp nginx1 805ef8d42fa6 6379/tcp, 0.0.0.0:202->22/tcp, 0.0.0.0:882->80/tcp, 0.0.0.0:3362->3306/tcp, 0.0.0.0:9005->9001/tcp nginx2 e91b4a662023 6379/tcp, 0.0.0.0:203->22/tcp, 0.0.0.0:883->80/tcp, 0.0.0.0:3363->3306/tcp, 0.0.0.0:9006->9001/tcp server1 01bb4850cc8c 6379/tcp, 0.0.0.0:204->22/tcp, 0.0.0.0:884->80/tcp, 0.0.0.0:3364->3306/tcp, 0.0.0.0:9007->9001/tcp server2 e500cbd1efad 6379/tcp, 0.0.0.0:205->22/tcp, 0.0.0.0:885->80/tcp, 0.0.0.0:3365->3306/tcp, 0.0.0.0:9008->9001/tcp server3
|
主要需要暴露http服务端口
负载均衡
概念
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
我们知道单台服务器的性能是有上限的,当流量很大时,就需要使用多台服务器来共同提供服务,这就是所谓的集群。
负载均衡服务器,就是用来把经过它的流量,按照某种方法,分配到集群中的各台服务器上。这样一来不仅可以承担更大的流量、降低服务的延迟,还可以避免单点故障造成服务不可用。一般的反向代理服务器,都具备负载均衡的功能。
负载均衡功能可以由硬件来提供,比如以前的F5设备。也可以由软件来提供,LVS可以提供四层的负载均衡(利用IP和端口),
架构图
负载均衡策略
加权轮询
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
图中有两点需要注意,第一,如果可以把加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器;第二,当所有后端机器都down掉时,nginx会立即将所有机器的标志位清成初始状态,以避免造成所有的机器都处在timeout的状态,从而导致整个前端被夯住。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| http { upstream zhimma { server 192.168.2.107:883 weight=5; server 192.168.2.107:884 weight=6; server 192.168.2.107:885 weight=7; } server{ listen 80; server_name zhimma.ma; location / { proxy_pass http://zhimma; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
|
除了 weight 之外,还有别的配置项
1 2 3 4
| upstream phpServers { server 192.168.2.107:883 weight=5 max_fails=1 fail_timeout=20 max_conns=100; server 192.168.2.107:883 weight=6 backup down }
|
max_fails
默认为1。某台Server允许请求失败的次数,超过最大次数后,在failtimeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxynextupstream, fastcginextupstream, uwsginextupstream, scginextupstream, and memcachednext_upstream指令来处理这次错误的请求。
fail_timeout
默认为10秒。某台Server达到maxfails次失败请求后,在failtimeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
backup
备份机,所有服务器挂了之后才会生效
down
标识某一台server不可用
max_conns
限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置 表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。
3.IP HASH
ip_hash(ip绑定)
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
ip hash算法的核心实现如下:
1 2 3 4 5
| for(i = 0;i < 3;i++){ hash = (hash * 113 + iphp->addr[i]) % 6271; }
p = hash % iphp->rrp.peers->number;
|
从代码中可以看出,hash值既与ip有关又与后端机器的数量有关。经过测试,上述算法可以连续产生1045个互异的value,这是该算法的硬限制。对此nginx使用了保护机制,当经过20次hash仍然找不到可用的机器时,算法退化成轮询。因此,从本质上说,ip hash算法是一种变相的轮询算法,如果两个ip的初始hash值恰好相同,那么来自这两个ip的请求将永远落在同一台服务器上,这为均衡性埋下了很深的隐患。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| http { upstream zhimma { ip_hash; server 192.168.2.107:883; server 192.168.2.107:884; server 192.168.2.107:885; } server{ listen 80; server_name zhimma.ma; location / { proxy_pass http://zhimma; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
|
fair
通用hash、一致性hash
session_sticky
配置详情
负载均衡服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; upstream zhimma { server 192.168.2.107:883 weight=3; server 192.168.2.107:884 weight=4; server 192.168.2.107:885 weight=5; } server{ listen 80; server_name zhimma.ma; root /home/www/tourism/laravel_store/public; index index.html index.htm; location / { proxy_pass http://zhimma; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
}
|
业务服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| [root@e91b4a662023 conf.d]# pwd /etc/nginx/conf.d [root@e91b4a662023 conf.d]# ls zhimma.ma.conf root@e91b4a662023 conf.d]# cat zhimma.ma.conf server { listen 80; server_name zhimma.ma; root /home/www/zhimma/server1; index index.php index.html index.htm;
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
location / {
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } try_files $uri $uri/ /index.php$is_args$args; } }
|
重启nginx ,配置hosts,访问zhimma.ma:881
,就能看的切换的效果了