目录
知识点1:网站流量分析指标
什么是pv?
什么是uv?
什么是IP?
知识点2:正向代理和反向代理
知识点3:负载均衡实验
什么是负载均衡?
IP地址规划:
实验拓扑图
知识点4:负载均衡策略
1、请求轮询
2、增加权重
3、最少连接数
4、ip_hash 策略
知识点5:获取访问机器的真实ip地址
1、在负载均衡器上修改http请求报文头部字段,谈价一个X_Real-IP字段
2、修改web服务器的nginx配置文件,在日志格式里面添加http_x_real_ip字段
知识点6:nginx的四层负载均衡和七层负载均衡
七层负载均衡:
四层负载均衡
nginx四层负载均衡和七层负载均衡的区别
知识点7:lvs负载均衡和nginx负载均衡的区别
层数的区别
效率的区别
PV(page view),即页面浏览量,通常是衡量一个网络新闻频道或网站的主要指标
UV(unique visitor),指的是访问某个站点或点击某个网站的不同ip地址的人数
在同一天内,uv只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数
IP表示拥有特定唯一IP地址的计算机访问您的网站的次数,
###########################################################################################
正向代理:
代理的对象为客户
代理清楚知道客户要访问的目标
反向代理:
代理的对象为服务器
代理不知道客户要访问的目标
###########################################################################################
负载均衡就是将用户的访问请求,平均的分配给后端服务器
load balance 负载均衡服务器:192.168.44.132
web1 真实web服务器 :192.168.44.166
web2 真实web服务器:192.168.44.141
web3 真实web服务器:192.168.44.205
首先在web1,web2,web3,三台web服务器安装nginx软件,使用一键安装nginx脚本安装
一键安装nginx脚本:
[root@web1 ~]# cat onekey_install_nginx.sh
#!/bin/bash
#解决软件的依赖关系,需要安装的软件包
yum install epel-release -y
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make psmisc net-tools lsof vim geoip geoip-devel wget -y
#新建liming用户和组
id liming || useradd liming -s /sbin/nologin
#下载nginx软件
mkdir /liming99 -p
cd /liming99
wget https://nginx.org/download/nginx-1.21.6.tar.gz
#解压软件
tar xf nginx-1.21.6.tar.gz
#进入解压后的文件夹
cd nginx-1.21.6
#编译前的配置
./configure --prefix=/usr/local/scliming99 --user=liming --group=liming --with-http_ssl_module --with-threads --with-http_v2_module --with-http_stub_status_module --with-stream --with-http_geoip_module --with-http_gunzip_module
#如果上面的编译前的配置失败,直接退出脚本
if (( $? != 0));then
exit
fi
#编译
make -j 2
#编译安装
make install
#修改PATH变量
echo "PATH=$PATH:/usr/local/scliming99/sbin" >>/root/.bashrc
#执行修改了环境变量的脚本
source /root/.bashrc
#firewalld and selinux
#stop firewall和设置下次开机不启动firewalld
service firewalld stop
systemctl disable firewalld
#临时停止selinux和永久停止selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
#开机启动
chmod +x /etc/rc.d/rc.local
echo "/usr/local/scliming99/sbin/nginx" >>/etc/rc.local
#修改nginx.conf的配置,例如:端口号,worker进程数,线程数,服务域名
sed -i '/worker_processes/ s/1/2/' /usr/local/scliming99/conf/nginx.conf
sed -i '/worker_connections/ s/1024/2048/' /usr/local/scliming99/conf/nginx.conf
sed -i -r '36c \\tlisten 80;' /usr/local/scliming99/conf/nginx.conf
sed -i -r '37c \\tserver_name www.liming.com;' /usr/local/scliming99/conf/nginx.conf
#killall nginx进程
killall -9 nginx
#启动nginx
/usr/local/scliming99/sbin/nginx
修改web服务首页index.html
[root@web1 html]# cat index.html
this is nginx-web1 192.168.44.166
[root@web2 html]# cat index.html
this is nginx-web2 192.168.44.141
[root@web3 html]# cat index.html
this is nginx-web3 192.168.44.205
修改load balance 负载均衡服务器nginx的配置文件nginx.conf
在http块里面定义一个负载均衡器,然后创建一个路由规则,使用创建的upstream节点
# 定义上游服务器集群,定义一个负载均衡器
upstream myweb1{
server 192.168.44.166;
server 192.168.44.141;
server 192.168.44.205;
}
server {
listen 80;
location / {
# 使用myweb1分配规则,即刚才定义的upstream节点
proxy_pass http://myweb1;
修改完配置文件以后刷新一下nginx服务,然后再访问load balance服务器就会将流量采用轮询的方式分发到三台真实web服务器上面
############################################################################################
依次转发给配置的服务器,即上个实验,默认是以轮询的方式来分发流量访问
使用服务器权重,还可以进一步影响ngixn负载均衡算法,谁的权重越大,分发到的请求就越多
修改负载均衡服务器配置文件
# 定义上游服务器集群,定义一个负载均衡器
upstream myweb1{
server 192.168.44.166 weight=3;
server 192.168.44.141 weight=1;
server 192.168.44.205 weight=1;
}
server {
listen 80;
location / {
# 使用myweb1分配规则,即刚才定义的upstream节点
proxy_pass http://myweb1;
}
接下来访问负载均衡服务器,它会根据权重的多少来分发流量,权重越大,分发到的请求就越多
############################################################################################
在连接负载最少的情况下,nginx会尽量避免过多的请求分发给繁忙的应用程序服务器,而是将新请求分发给不太繁忙的服务器,避免服务器过载
轮询法不能识别在给定的时间里保持了多少连接,因此可能发生,服务器B服务器收到的连接比服务器A少但是它已经超载,比如B服务器虽然收到的连接数少,但是都保持连接,没有断开,A服务器虽然收到的连接数多,但是实际大都断开连接,这时候就需要优先选择活跃连接数最少的服务器
# 定义上游服务器集群,定义一个负载均衡器
upstream myweb1{
least_conn;
server 192.168.44.166;
server 192.168.44.141;
server 192.168.44.205;
}
server {
listen 80;
location / {
# 使用myweb1分配规则,即刚才定义的upstream节点
proxy_pass http://myweb1;
}
############################################################################################
每个请求按访问的ip分配hash,即一个客户端第一次请求nginx后,会分配到hash,下次改客户端请求 ##的结果还是一样的,不会改变,解决session问题。
# 定义上游服务器集群,定义一个负载均衡器
upstream myweb1{
ip_hash;
server 192.168.44.166;
server 192.168.44.141;
server 192.168.44.205;
}
server {
listen 80;
location / {
# 使用myweb1分配规则,即刚才定义的upstream节点
proxy_pass http://myweb1;
}
############################################################################################
当我们使用负载均衡服务器来分发流量以后,在真实web服务器上的访问日志是谁的ip?负载均衡服务器的还是真实访问ip的?
可以看到,web1机器上nginx的访问日志是负载均衡服务器的ip地址,那么如何让web服务器知道真实访问机器的IP地址?
让web服务器日志显示真实访问机器的IP
将nginx内部的remote_addr 这个变量的值,赋值给X_Real-IP这个变量,X_Real-IP这个变量会在http协议的请求报文里面添加一个X_Real-IP的字段,后端的real server服务器上的nginx就可以读取这个字段的值
server {
listen 80;
location / {
# 使用myweb1分配规则,即刚才定义的upstream节点
proxy_pass http://myweb1;
proxy_set_header X-Real-IP $remote_addr;
}
log_format main '$remote_addr - $http_x_real_ip $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
修改配置文件以后重新启动服务
[root@web1 conf]# nginx -t
nginx: the configuration file /usr/local/scliming99/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/scliming99/conf/nginx.conf test is successful
[root@web1 conf]# nginx -s reload
测试访问负载均衡服务器后查看日志文件
############################################################################################
七层负载均衡主要工作在网络七层ISO协议的第七层,即应用层。由于在应用层主要是处理对应的应用层协议的相关数据,如HTTP协议,而无法操作传输层TCP连接相关细节,故在七层负载均衡当中,负载均衡器主要是基于应用层协议的相关数据来进行请求转发,
所谓四层就是基于IP+端口的负载均衡,它通过用户请求的端口来决定将请求转发至哪台后端服务器。就是通过第三层(网络层)的IP地址并加上四层(传输层)的端口号,来决定哪些流量需要做负载均衡。对需要负载均衡的流量进行NAT转换,然后转发至后端服务器节点,并记录这个TCP或者UDP的流量是由哪台后端服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
七层负载均衡是工作在第七层,只能给web应用,使用http协议的
四层负载均衡是根据端口进行转发的,支持的服务数量比七层多
四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效率比七层负载均衡的要高。
四层负载均衡不识别域名,而七层负载均衡识别域名。
############################################################################################
lvs只支持四层负载均衡
nginx支持四层和七层负载均衡
lvs的效率更高,lvs已经在内核里内置了,不需要安装,数据通过网卡解封装后,经过kernel space,然后lvs直接调用
nginx工作在user space,nginx需要等内核将数据处理以后送到user space,然后nginx再处理,所以lvs比nginx工作少一层,lvs效率较高
############################################################################################