反向代理Proxy的基本应用

Nginx反向代理

一、7层代理

  • 代理器,也叫调度器
  • 7层代理,是指工作在7层,使用http协议。只能做WEB服务器集群

1、定义集群

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..

upstream webserver {
         server 192.168.2.100:80;
         server 192.168.2.200:80;
        }
.. ..

# 使用upstream定义后端服务器集群,集群名称任意(如webserver)
# 使用server定义集群中的具体服务器和端口
# 注意:因为定义的WEB集群,所以应该写在:http{} 中。

2、调用集群

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

http {
.. ..
	upstream webserver {
                server 192.168.2.100:80;
                server 192.168.2.200:80;
    }
.. ..
server {
        listen        80;
        server_name  localhost;
        
        location / {
            proxy_pass http://webserver;		# 转发给前面定义的集群,写上名称。
        }
}

# proxy_pass:转发。优先级比 root html 高,所以在location中放的位置无关
'proxy_pass在做7层代理转发时必须在location / {} 中。

3、调度算法

  • nginx反向代理的默认调度算法是:轮询。

  • 如需要修改,在upstream {} 中写上相应算法。

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
	upstream webserver {
                ip_hash;						# 源地址哈希算法:相同客户端访问相同服务器
                server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;
                server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;
        }

'属性:weight:权重;     max_fails:最大失败次数;		fail_timeout:失败后间隔几秒再测试

二、4层代理

  • 对工作在4层,使用TCP/UDP协议的服务进行调度。
  • nginx的版本在1.9之前只支持WEB代理。
  • 1.9版本后支持所有服务集群。增加代理模块:–with-stream

1、增加模块:–with-stream

[root@proxy ~]# cd  nginx-1.12.2
[root@proxy nginx-1.12.2]# ./configure   \
> --with-http_ssl_module                              # 开启SSL加密功能
> --with-stream                                       # 开启4层反向代理功能
[root@proxy nginx-1.12.2]# make && make install       # 编译并安装

2、定义集群


  • 注意:这里不再是WEB集群。要写在http {} 外面。
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

stream {																			# 生成一个服务器池
     upstream backend {												# 定义一个集群,取个名字
            server 192.168.2.100:22;      		# 后端SSH服务器的IP和端口
            server 192.168.2.200:22;
}
            server {
              ... ... 
             }
}

http {
.. ..
}

3、调用集群

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
stream {
		upstream backend {
				server 192.168.2.100:22; 
				server 192.168.2.200:22;
		}
		server {
				listen 12345;                   		# Nginx监听的端口
				proxy_pass backend;									# 注意,这里不用写:http://
				proxy_connect_timeout 10s;      		# 连接的超时时间,可以不写。
				proxy_timeout 20s;
		}
}

http {
... ...
}

#一个端口只能被一个服务使用。
'此处的案例测试的是SSH服务。但是由于在实验中本身就是通过SSH连接的。所以端口监听随便写一个。

4、指定端口号连接

[root@client ~]# ssh 192.168.4.5 -p 12345

-p:指定访问端口

三、总结

1、7层代理

http {
	upstream '集群名' {
		server IP1:80;
		server IP2:80  weight=1 max_fails=1 fail_timeout=20;
	}
	server {
		listen 80;
		servre_name '域名';
		
		loction / {
			proxy_pass http://集群名							# 这里proxy_pass必须放在location里面。
		}
	}
}

2、4层代理

stream {
	upstream 集群名 {
		server IP1:端口;
		server IP2:端口;
	}
	
	server {
		listen '端口';
		proxy_pass '集群名';
		proxy_connect_timeout 20s;
		proxy_timeout 20s;
	}
}


HAproxy集群

  • HAproxy的工作原理是跟Nginx一样的。

1、装包

[root@haproxy ~]# yum -y install haproxy

2、配置


  • 重点:在HAProxy中,一个listen就是定义一个集群
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
global
 log 127.0.0.1 local2   						# [err warning info debug]
 chroot /usr/local/haproxy
 pidfile /var/run/haproxy.pid 			# haproxy的pid存放路径
 maxconn 4000     									# 最大连接数,默认4000
 user haproxy
 group haproxy
 daemon       											# 创建1个进程进入deamon模式运行
 defaults
 mode http    											# 默认的模式mode { tcp|http|health } 
 option dontlognull  								# 不记录健康检查的日志信息
 option httpclose  									# 每次请求完毕后主动关闭http通道
 option httplog   									# 日志类别http日志格式
 option forwardfor  								# 后端服务器可以从Http Header中获得客户端ip
 option redispatch  								# serverid服务器挂掉后强制定向到其他健康服务器
 timeout connect 10000 							# 如果backend没有指定,默认为10s
 timeout client 300000 							# 客户端连接超时
 timeout server 300000 							# 服务器连接超时
 maxconn  3000  										# 最大连接数
 retries  3   											# 3次连接失败就认为服务不可用,也可以通过后面设置
-------------------------------------------------------------
'以下为查看网页状态信息的。给管理员自己看的。
listen stats 0.0.0.0:1080   				# 监听端口(一般选择较少用到的端口号)
    stats refresh 30s   						# 统计页面自动刷新时间
    stats uri /stats   							# 统计页面url
    stats realm Haproxy Manager 		# 进入管理解面查看状态信息
    stats auth admin:admin  				# 统计页面用户名和密码设置
--------------------------------------------------------------
'以下即为一个标准的集群模板:
listen  websrv 0.0.0.0:80						# websrv集群名称(可自定义)
   balance roundrobin								# 算法。可不写,默认是轮询。
   server  web1 192.168.2.100:80 check inter 2000 rise 2 fall 5
   server  web2 192.168.2.200:80 check inter 2000 rise 2 fall 5
   
   
# check inter 2000 :每隔2000毫秒一次健康检查。2000可不写,有默认值。
# rise 2 :连接2次才认为成功;   fall 5  :失败5次才确定失败     (都有默认值的,可不写)

3、起服务

[root@haproxy ~]# systemctl start haproxy
[root@haproxy ~]# systemctl enable haproxy


LVS集群

一、集群概念

  • 将很多服务器集中组成一个计算机组,通过高速网络互联,并以单一系统的模式进行管理。-
  • 任务调度 是集群系统中的核心技术

集群的目的(好处)

  • 提高性能
  • 降低成本
  • 提高可扩展性
  • 增强可靠性

分类

  • 高性能计算集群HPC
  • 负载均衡集群LB
  • 高可用集群HA:避免单点故障

二、LVS集群相关

1、组成

  • 前端:负载均衡层
  • 中间:服务器群组层
  • 底端:数据共享存储层

2、相关术语


  • Director Server:调度服务器
  • Real Server:真实服务器
  • VIP:虚拟IP
  • RIP:真实IP
  • DIP:调度器连接节点服务器地址

3、工作模式


  • NAT模式:调度器直接实现,大并发访问时不采用。
  • TUN模式:隧道模式,以隧道方式实现。调度器与服务器群可不在同一局域网,可通过公网连接,但是需要用隧道方式组成局域网。
  • DR模式:默认模式,直连路由模式(从调度器进,由调度器转发给服务群,由服务器直接返回服务给客户端)
  • Full-Nat:暂未收录进内核,升级后的模式,参考官网

4、负载均衡调度算法


常用算法:

  • 轮询(Round Robin)RR
  • 加权轮询(Weighted Round Robin)wrr
  • 最少连接(Least Connections)lc
  • 加权最少连接(Weighted Least Connections)wlc
  • 源地址哈希(Source hash)sh :类似于nginx代理里的:ip_hash
  • 目标地址哈希dh

注意:普通轮询会出现负载不均衡的情况。此时,就应该使用最少连接方式。

5、原理相关


  • LVS 是路由器原理(不是代理):数据包转发+NAT
  • nginx代理:由代理器在中间环节负责相关工作,有多次解包、封闭、发送、再解包的过程,较为繁杂。

所以,在性能上:LVS > nginx代理

6、原理示例


  • 数据包:源IP(SA)、目标IP(DA)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VynfYVCG-1588323189416)(…/…/…/%E6%96%87%E6%A1%A3/%E4%B8%AA%E4%BA%BA%E6%95%B4%E7%90%86%E7%9A%84%E7%AC%94%E8%AE%B0/%E7%9F%A5%E8%AF%86%E5%9B%BE%E9%9B%86/LVS%E5%9C%B0%E5%9D%80%E4%BC%AA%E8%A3%85%E5%8E%9F%E7%90%86.png)]

三、LVS 准备

装包

  • 软件包:ipvsadm

LVS是集合在内核里面的,本身是没有软件的。

但是需要一个工具来把相关命令传送给LVS。该工具即为ipvsadm

ipvsadm命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SM3l8sEW-1588323189419)(…/…/…/%E6%96%87%E6%A1%A3/%E4%B8%AA%E4%BA%BA%E6%95%B4%E7%90%86%E7%9A%84%E7%AC%94%E8%AE%B0/%E7%9F%A5%E8%AF%86%E5%9B%BE%E9%9B%86/ipvsadm%E5%91%BD%E4%BB%A4%E9%9B%86.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tomN72lI-1588323189420)(…/…/…/%E6%96%87%E6%A1%A3/%E4%B8%AA%E4%BA%BA%E6%95%B4%E7%90%86%E7%9A%84%E7%AC%94%E8%AE%B0/%E7%9F%A5%E8%AF%86%E5%9B%BE%E9%9B%86/ipvsadm%E5%91%BD%E4%BB%A4%E7%A4%BA%E4%BE%8B.png)]

  • 永久保存所有规则
[root@proxy ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm

四、部署LVS-NAT集群

1、配置环境

  • web服务器:配置好网关
  • 调度器:安装工具ipvsadm

2、打开路由

~]# echo 1 > /proc/sys/net/ipv4/ip_forward		# 临时的
~]# vim  /etc/sysctl.conf											# 修改配置文件,设置永久规则
   net.ipv4.ip_forward = 1										# 增加一行

3、创建集群

[root@proxy ~]# ipvsadm -A -t 192.168.4.5:80 -s wrr
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.100 -m|i|g -w
[root@proxy ~]# ipvsadm -a -t 192.168.4.5:80 -r 192.168.2.200 -m|i|g -w
[root@proxy ~]# ipvsadm -LN
[root@proxy ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm

五、部署LVS-DR集群

1、DR模式,注意事项


  • WEB服务群组需要和client在同一个网段
    • 因为WEB需要直接返回网页给client
  • WEB需要伪装成调度器的IP
    • 因为访问的目标IP,和回复数据的IP必须一致
  • 需要修改内核防止IP冲突
  • 同一网卡需要配置两个不同的IP,调度器:VIP、DIP;服务器:RIP、VIP(伪装)
    • 调度器中:DIP为主,VIP为从。
    • DIP:连接后端服务器群;VIP:用于服务客户端

2、涉及的两个准则


  • 发起ping时,作为主动发起的主机,在发送包中用的是主IP
  • 发起数据请求时,返回数据必须是发送数据时的目标IP作为源IP返回数据,才能接收,否则会丢弃。

3、操作步骤


3.1、设置Proxy的VIP、DIP
  • VIP:提供给客户端;DIP:连接后端服务器
[root@proxy ~]# cd /etc/sysconfig/network-scripts/
[root@proxy ~]# cp ifcfg-eth0 ifcfg-eth0:0
[root@proxy ~]# vim ifcfg-eth0

[root@proxy ~]# vim ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.4.15
PREFIX=24
[root@proxy ~]# systemctl restart network
3.2、设置:VIP
  • WEB服务器的伪装IP
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 ~]# cp ifcfg-lo ifcfg-lo:0
[root@web1 ~]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.4.15
NETMASK=255.255.255.255
NETWORK=192.168.4.15
BROADCAST=192.168.4.15
ONBOOT=yes
NAME=lo:0
3.3、防止地址冲突
  • 在WEB服务器中的配置文件/etc/sysctl.conf 中写入不响应伪装IP的规则。
[root@web1 ~]# vim /etc/sysctl.conf								#	手动写入如下4行内容
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
# 当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
# 本机不要向外宣告自己的lo回环地址是192.168.4.15

[root@web1 ~]# sysctl -p													# 由于配置文件写入后不会立即生效,需要刷新一下。
3.4、重起IP服务
[root@web2 ~]# systemctl restart network
[root@web2 ~]# ifconfig


'由于Redhat7和CentOs7中有两个网络服务:NetworkManager、network。有可能会有冲突。
'如果出现冲突,导致无法重起。可以先关掉N,再重起n。
[root@web1 ~]# systemctl stop NetworkManager
[root@web1 ~]# systemctl restart network
3.5、部署LVS-DR模式调度器
[root@proxy ~]# ipvsadm -A -t 192.168.4.15:80 -s wrr
[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -g -w 1
[root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -g -w 1
[root@proxy ~]# ipvsadm -Ln
[root@proxy ~]# ipvsadm-save -n >  /etc/sysconfig/ipvsadm


Keepalived

一、概念

1、前情

  • 虽然在性能上,LVS > Nginx代理,但是,在功能上:LVS < Nginx代理。
  • 且最重要的是:LVS 没有健康检查功能
  • LVS、Nginx调度集群都是属于负载均衡集群,有一个致命的缺点:就是只有一台调度器,一旦调度器坏了,那么整个集群都会宕掉。

2、原理

  • 与网络课程中路由器的VRRP是一致的。VRRP:虚拟网关。
  • Keepalived:可实现高可用集群。

3、Keepalived

  • 是一种可配置调度器集群的高可用软件。

软件名:Keepalived

服务名:Keepalived

二、3个功能

  • 这3个功能可分开使用。
  1. 实现VRRP,即高可用,热备份
  2. 自动配置LVS
  3. 健康检查功能

1、实现VRRP,高可用

  • 根据VRRP原理,在两台调度器之间生成一个浮动的VIP,相当于做一个虚拟调度器。
  • 然后以优先级原理进行划分主从。

在配置文件中修改:

[root@web1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
  notification_email {
    admin@tarena.com.cn                		# 设置报警收件人邮箱
  }
  notification_email_from ka@localhost    # 设置发件人
  smtp_server 127.0.0.1                		# 定义邮件服务器
  smtp_connect_timeout 30
  router_id  web1                        	# 设置路由ID号(实验需要修改)
}

------------------------------------------------------------------------
vrrp_instance VI_1 {
  state MASTER                				# 主服务器为MASTER(备服务器需要修改为BACKUP)
    interface eth0										# 定义网络接口
  virtual_router_id 51								# 主备服务器VRID号必须一致
  priority 100                				# 服务器优先级,优先级高优先获取VIP
  advert_int 1
  authentication {
    auth_type pass										# 定义连接需要密码,
    auth_pass 1111        		# 主备服务器密码必须一致(这是防止攻击方冒用调度器,实际工作中要重视)
  }
  virtual_ipaddress {          				# 谁是主服务器谁获得该VIP(实验需要修改)
		192.168.4.80 
	}    
}

2、自动配置LVS

  • 在Keepalived的配置文件中。每一个==virtual_server{}==都相当于一个ipvsadm -A,即定义一个调度器。
  • 在virtual_server{}中,每一个real_server{} 都相当于ipvsadm -a,即增加真实机。
  • 注意:配置了LVS,肯定会出现地址冲突。服务器集群记得写入配置:/etc/sysctl.conf
[root@proxy ~]# vim /etc/keepalived/keepalived.conf
global_defs {
..........
}
vrrp_instance VI_1 {
..........
}
------------------------------------------------------------------------
'此处,定义调度器,注意:写的IP为VIP,相同集群的调度器使用同一VIP。

virtual_server 192.168.4.15 80 {        # 设置ipvsadm的VIP规则(实验需要修改)
  delay_loop 6
  lb_algo rr                            # 设置LVS调度算法为RR
  lb_kind DR                            # 设置LVS的工作模式为DR(实验需要修改)
  protocol TCP													# 协议
  #persistence_timeout 50								#(实验需要注释)
'注意这样的作用是保持连接,开启后,客户端在一定时间内始终访问相同服务器


----------------------------------------------------------------  
'添加真实机1

  real_server 192.168.4.100 80 {     		# 设置后端web服务器真实IP(实验需要修改)
    weight 1                         		# 设置权重为1
    
    TCP_CHECK {                     		# 对后台real_server做健康检查(实验需要修改)
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    }
  }
--------------------------------------------------------------------
'添加真实机2

 real_server 192.168.4.200 80 {       	# 设置后端web服务器真实IP(实验需要修改)
    weight 2                          	# 设置权重为1
    TCP_CHECK {                      		# 对后台real_server做健康检查(实验需要修改)
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    }
  }
}

3、实现健康检查

3.1、原理

一般针对服务器或网页的检测方法为:

  • ping IP #最简单。缺陷是:在主机完好时,可ping通,但对应的服务是坏的。
  • curl http:// IP #稍好。缺陷是:主机、网页完好,但是网页被攻击、篡改时,无法识别。
  • 在curl的基础上,将curl进行哈希计算,根据哈希特性,可以监测网页是否被改动。
3.2、3种健康检查
  • TCP_CHECK {} #仅检查端口
  • HTTP_GET { usr{} } #下载该网页,并对较哈希值。但一个测试只能针对一个网页。实际工作中,一般只选择首页、随机几个页面进行测试。
  • SSL_GET { usr{} } #针对加密https网点的检查,机制跟HTTP_GET是一样的。
  • 健康检查放在real_server{}中
3.3、格式
[root@proxy ~]# vim /etc/keepalived/keepalived.conf
global_defs {
..........
}
vrrp_instance VI_1 {
..........
}


virtual_server IP 端口 {
.............

	real_server IP 端口 {

'第1种:
	TCP_CHECK {													# 只需要设置检查时间
		connetc_timeout 3									#
		nb_get_retry 3										# 测试连接失败,需要3次才认定失败
		delay_before_retry 3							# 间隔3s 检测一次
	}

'第2种:
	HTTP_GET {
		usr {
			path=/index.html								# 测试的页面
			digest=823uhfnj8347yhfnv38i			# 较验哈希值
		}
		connect_timeout 3
		nb_get_retry 3
		delay_before_retry 3
	}
	
'第3种:
	SSL_GET {
		usr {
			path=/index.html								# 测试的页面
			digest=823uhfnj8347yhfnv38i			# 较验哈希值
		}
		connect_timeout 3
		nb_get_retry 3
		delay_before_retry 3
	}
	
	}
}

4、启服务注意事项

  • 启动Keepalived会自动添加一个drop的防火墙规则,需要清空!
[root@web1 ~]# iptables -F
[root@web1 ~]# setenforce 0
  • 查看VIP信息
[root@web1 ~]# ip addr show eth0
[root@web2 ~]# ip addr show eth0


三种集群调度软件对比

1、Nginx

  • 优点
    • 工作在7层,可针对http做分流策略
    • 从1.9版本开始支持4层代理
    • 正则表达式比HAProxy强大
    • 安装、配置、测试简单,通过日志可解决多数问题
    • 并发量可达到几万次
    • Nginx还可作为Web服务器使用
  • 缺点
    • 健康检查只能通过端口,无法使用URL检查
    • 性能在三种集群软件中最低。

2、LVS

  • 优点
    • 负载能力强,工作在4层,对内存、CPU消耗低
    • 配置性低,没有太多可配置性,减少人为错误。
    • 应用面广,几乎可以为所有应用提供负载均衡。
  • 缺点
    • 不支持正则,不能实现动静分离。
    • 如果网站架构庞大,LVS-DR配置比较繁琐
    • 配置性低,没有太多配置。所以在3种软件中,功能最少。

3、HAProxy

  • 优点
    • 支持session、cookie功能
    • 可以通过URL进行健康检查
    • 效率、负载均衡速度,高于Nginx,低于LVS
    • HAProxy支持TCP,可对Mysql进行负载均衡。
    • 调度算法丰富
  • 缺点
    • 正则弱于Nginx
    • 没有自身的日志,依赖于syslogd。

4、总结

  • 以下总结性的对比,并不是权威,随着技术发展,会有变化,只作为参考。实际工作中以需求为主。
  • 性能:LVS > HAProxy > Nginx
  • 功能:Nginx > HAProxy > LVS
  • 正则:Nginx > HAProxy (LVS不支持)
  • 在工作中,一般网站在搭建前期,并发量不高的情况下,优先选择:Nginx或者HAProxy。后期并发量增加到一定量级后,再升级成4\7层调度集群。

7层调度集群:(参考)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihwHJqwo-1588323189421)(…/…/…/%E6%96%87%E6%A1%A3/%E4%B8%AA%E4%BA%BA%E6%95%B4%E7%90%86%E7%9A%84%E7%AC%94%E8%AE%B0/%E7%9F%A5%E8%AF%86%E5%9B%BE%E9%9B%86/7%E5%B1%82%E8%B0%83%E5%BA%A6%E9%9B%86%E7%BE%A4(%E5%8F%82%E8%80%83%E6%A8%A1%E5%9E%8B)].png)

4\7层调度集群:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zoDe7zXc-1588323189422)(…/…/…/%E6%96%87%E6%A1%A3/%E4%B8%AA%E4%BA%BA%E6%95%B4%E7%90%86%E7%9A%84%E7%AC%94%E8%AE%B0/%E7%9F%A5%E8%AF%86%E5%9B%BE%E9%9B%86/4%E3%80%817%E5%B1%82%E8%B0%83%E5%BA%A6%E9%9B%86%E7%BE%A4(%E5%8F%82%E8%80%83%E6%A8%A1%E5%9E%8B)].png)

扩展:以上3种软件集群都是免费软件。在4\7层调度集群中,如果对性能要求更高。可以购买F5公司生产的big-ip 硬件调度器。(约30万RMB)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值