回顾:
Nginx模块:
http:ngx_http_proxy_module
proxy_pass---完成反代
fastcgi:ngx_http_fastcgi_module
fastcgi_pass---完成反代
缓存逻辑:
定义缓存:
proxy_cache_path
fastcgi_cache_path
调用缓存:
proxy_cache
fastcgi_cache
LB Cluster:
硬件:F5 BigIP,NetScaler,A10
软件:
四层调度:lvs,nginx(stream module),haproxy(mode tcp)
七层调度:nginx(http_upstream module),haproxy(mode http),httpd(blance module),ats,...
session sticky:
Source IP:sh,persistence(会话持久)
Cookie:
session replication---会话集群,一般采用组播的方式来传递,但这种方式不适用与较大规模的场景
session server:session服务器,session不保存在本地,一般是内存级别的存储,有两种常用解决方案:memcached,redis

注意:上几节课反代的都是单台服务器,upstream模块可以把后端多台主机定义成服务器组,组有自己的内部挑选算法

视频中的课件:
Nginx(4)
ngx_http_upstream_module
The ngx_http_upstaream_module module is used to define groups of servers that can be referenced by the proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass,and memcached_pass directives.
(1)upstaream name {...}
定义后端服务器组;引入一个新的上下文;只能用于http{}上下文中;
默认的调度方法是wrr;
(2)server address [parameters];
定义服务器地址和相关的参数;
地址格式:
IP[:PORT]
HOSTNAME[:PORT]
unix:/PATH/TO/SOME_SOCK_FILE
参数:
weight=number
权重,默认为1
max_fails=number
失败尝试的最大次数
fail_timeout=time
设置服务器为不可用状态的超时时长
backup
把服务器标记为"备用"状态
down
手动标记其为不可用
(3)least_conn
最少连接调度算法;当server拥有不同的权重时为 wlc;当所有后端主机的连接数相同时,则使用wrr进行调度;
(4)ip_hash
源地址hash算法;能够将来自同一个源IP地址的请求始终发往同一个upstream server;
(5)hash key [consistent]
基于指定的key的hash表实现请求调度,此处的key可以文本、变量或二者的结合;
consistent:参数,指定使用一致性hash算法;
示例:
hash $request_uri consistent
hash $remote_addr
hash $cookie_name
(6)keepalive connections;
可使用长连接的连接数量;每worker与后端服务器保持的最大空闲长连接数量

博客作业:以上所有内容
课外实践:实践tengine和Openresty;

操作:
一台前端反代,两台后端服务器
前端反代:172.16.0.6,192.168.0.254
vim /etc/nginx/conf.d/ilinux.conf
server {
listen 80;
server_name www.ilinux.io;
location / {
root /data/nginx/html;
proxy_pass http://websrvs;---upstream定义的组
}
}
vim /etc/nginx/nginx.conf
在http上下文中定义下列一行:---upstream定义的组
upstream websrvs {---权重默认都是1轮询,如果修改就变为加权轮询
ip_hash;---其实就是根据客户端的ip来保持会话粘性,这个选项没有值,使用这个选项,就不能使用backup选项,这里也可以使用cookie绑定,但是是商业版的功能,这个选项=hash $remote_addr;也可以绑定uri,提高缓存命中率,那么如何根据uri来缓存呢?uri经过hash计算和后端服务器总权重取模,结果相同的走相同的服务器,但是有个问题,如果有一台服务器down机,会导致所有服务器的缓存都失效。所以对2的32次方取模,映射法(取模),一致性哈希算法(uri对2的32次方取模,后端服务器ip地址也对2的32次方取模,并把所有服务器分布在一个圆环上,uri也分布在圆环上,按照顺时针方向离那个服务器近,就调度至哪台服务器,即使服务器down了也没有关系,也有问题,会形成偏斜问题,解决方法就是添加虚拟节点,让每个节点只控制一小段距离)---也可以用hash $request_uri consistent---默认是取模,加了consistent就是一致性哈希算法
server 192.168.10.11:80 weight=2 down;---down人为的把后端服务器down掉
server 192.168.10.12:80 fail_timeout=1 max_fails=3;---默认自带健康状态监测,超时时间为1s,失败次数为3次
server 127.0.0.1:80 backup;---如果两个服务器都挂了,指定一个sorry server,但是这样写会参与调度的,后边要加backup
}
此时客户端访问crul http://www.ilinux.io/index.html,可以看到是轮询访问server1和server2的

UPSS1:192.168.10.11
ifconfig eno16777736 192.168.10.11/24 up
systemctl start httpd.service---启动服务
ss -tnl---查看80端口有没有启动起来
vim /var/www/html/index.html
<h1>Upstream Server1</h1>

UPSS2:192.168.10.12
rpm -q httpd---查看是否安装了此服务
vim /var/www/html/index.html
<h1>Upstream Server2</h1>
systemctl start httpd.service---启动服务
ifconfig eno16777736 192.168.10.11/24 up