nginx反向代理,lvs-nat和lvs-dr类型,lvs-基于防火墙打标记,lvs健康状态检测

nginx反向代理,负载均衡:

	ngx_http_proxy_Module 反向代理模块: 

		(1) proxy_pass URL;
			注意:proxy_pass后面的路径不带URL时,会将location的URL传递给后端主机

		配置实列:
			server {
			listen 80;
			server_name www.ilinux.io;
			location /admin {
					proxy_pass http://192.168.1.110:80/;  #如果location定义/admin ,而且192.168.1.111后面加了"/",就是直接访问192.168.1.110/
			}

			location /admin {
					proxy_pass http://192.168.1.111:80;  #如果location中的定义了/admin,而且192.168.1.111后面没有加"/",那么就是直接把admin补在后面,就是http://192.168.1.111/admin
			}

			location ~* \.(jpg|png)$ {
					proxy_pass http://192.168.1.133:80; #把访问.jpg|.png结尾文件请求,都发给后端主机192.168.1.133 
			}

		
		(2)proxy_set_header field value;
			设定发往后端主机的请求报文的请求首部的值,环境:http server location

			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
	
		配置实列:
				location / {
				proxy_pass http://192.168.1.111:80;
				proxy_set_header X-Real-IP $remote_addr;  #把客户端的ip地址直接发送给后端主机
				add_header X-Via $server_addr;  #把代理服务器自身ip,响应给客户端
				}

			1.修改后端主机httpd配置文件: LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
			2.重启后端web服务,然后访问日志记录就是直接记录的客户端的ip,不在是代理服务器ip


		(3)proxy_caceh_path 
			定义可用于proxy功能的缓存:context; http   (必须配置,性能提升明显)

			1.修改代理服务器nginx.conf:
				在http段添加:
				proxy_cache_path /data/nginx/cache levels=1:1:1 keys_zone=pcache:10m max_size=2g;  # /data/nginx/cache,需要自己先行创建,属主,属组改为nginx
		
			2.修改代理服务器虚拟主机配置文件:
				在server段添加:
				proxy_cache pcache;  #引用nginx.conf文件中定义的变量 "keys_zone=pcache"
				proxy_cache_key $request_uri; #把什么当作键
				proxy_cache_valid 200 302 10m; #缓存保留时间,超过10十分启动清理
				proxy_cache_valid 400 2m;  
				proxy_cache_use_stale http_502;  #是否开启缓存中的内容响应



		(4)	fastcgi_param parameter value;
			代理服务器配置nginx动态代理;提前配置好后端服务器web服务

		编辑nginx代理服务器配置文件:
			server {
				listen 80;
				server_name www.ilinux.io;  #代理主机的域名
				index index.html index.php;  

				location ~* \.php$ {
					fastcgi_pass 192.168.1.111:9000;  #后端主机ip地址,端口默认9000
					fastcgi_index index.php;
					include fastcgi_params;
					fastcgi_param  SCRIPT_FILENAME   /data/nginx/www$fastcgi_script_name;  #/data/nginx/www 是后端主机的网站目录
				}
			}


		(5)fastcgi_cache_path paht; 定义在代理服务器http段中
			定义fastcgi的缓存:缓存位置为磁盘上的文件系统,有path所制定的路径来定义

			levels=levels #缓存目录的层级数量,以及每一及的目录数量 leves=one:two:three 
				levels=1:2:2

			keys_zone=name:size  #k/v映射的内存空间的名称及大小

			inactive=time #非活动时长 

			max_size=size  #磁盘上用于缓存书记的缓存空间上限


		(6)fastcgi_keep_conn on|off;  
			保持连接,发请求时保持


		(7)fastcgi_cache_valid [ code]time;
			不同的响应码各自的缓存时长

nginx动静分离实列:

	nginx.conf中http段添加:
		fastcgi_cache_path /data/nginx/fcgicache levels=1:2 keys_zone=fcache:10m max_size=2g;	

	编辑nginx代理服务器配置文件:
		server {
		listen 80;
		server_name www.ilinux.io; 
		index index.html index.php;

		location / {
				proxy_pass http://192.168.1.112:80;
			}

		location ~* \.php$ {
				fastcgi_pass 192.168.1.111:9000;
				fastcgi_index index.php;
				include fastcgi_params;
				fastcgi_param  SCRIPT_FILENAME    /data/nginx/www$fastcgi_script_name; 
				fastcgi_keep_conn on;
				fastcgi_cache fcache;  
				proxy_cache_key $request_uri;
				proxy_cache_valid 200 302 10m;
				proxy_cache_valid 301 1h;
				proxy_cache_valid any 1m;
			}
			}

	(8)ngx_http_upstream_module #七层负载均衡
		1.upstream name {...}
			定义后端服务器组,引入一个新的上下文;只能用于http{}上下文中

			weight=number  
				权重,默认为1 
			max_conns=number 
				最大并发连接数
			max_fails=number
				失败尝试的最大次数
			fail_timeout=time 
				设置服务器为不可用状态的超时时长
			backup 
				设置为备用主机 ,不能和hash同时使用
			down
				手动标记不可用
	
		2.hash key [consistent];
	
			hash $request_uri consistent 
				把同一个url请求,发往同一台主机
			hash $remote_addr 
				把同一个ip来的请求,发往同一台主机
			hash $cookie_name
		
		3.keepalive connections;
			可使用长连接的连接数量,没worker与后端服务器操持的最大空闲长连接数量
		
	负载均衡配置示例:
			修改nginx.conf配置文件: 
			在http段添加:/etc/nginx/nginx.conf
				upstream webserver {
					server 192.168.1.111:80 weight=1;
					server 192.168.1.112:80 weight=2;
			}

			负载均衡虚拟主机: /etc/nginx/conf.d/vhost.conf
				server {
					listen 80;
					server_name www.ilinux.io;

					location / {	
						proxy_pass http://webserver;
					}
				}


	(9)ngx_stream_core_module  
		1.listen address:port [ssl][udp]
			监听的端口:
				默认为tcp协议:
				udp:监听udp协议的端口

	(10)ngx_stream_proxy_module  #四层负载均衡
		1.proxy_pass address;

		2.proxy_timeout timeout;
			默认10m
		
		3.proxy_connect_timeout itme;
			设置ngixn与代理服务器尝试建立连接的超时时长,默认60s

			配置示例:
				stream {
					upstream httpdser { 
						server 192.168.1.111:80;
						server 192.168.1.112:80;
					}	

					server {
						listen 80;
						proxy_pass httpdser;
						proxy_timeout 60s ;
						proxy_connect_timeout 10s ; 				
					}
				}

lvs-nat和lvs-dr实现方法:

lvs简介:
	LVS集群的类型:
	lvs-nat:修改请求报文的目标ip,多目标ip的DNAT
	lvs-dr:操纵封装新的MAC地址
	lvs-run:在原请求ip报文之外新加一个ip首部
	lvs-fullnat:修改请求报文的源ip和目标ip

	#RS的意思是指后端真实服务器 (real server)
	#RIP的意思是指 (real server IP)
	#DIRECTOR的意思是指(lvs主机)
	#DIP的意思是指(director IP)
	#VS的意思是指(virtual server)
	#VIP的意思是指(virtual server IP)
	
	lvs-nat:
		多目标ip的DNAT,通过将请求报文的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
		 (1)RIP和DIP必须在同一个IP网络,且应该使用私网地址,RS的网关要指向DIP
		 (2)请求报文和响应报文都必须经由director转发,director易于成为系统瓶颈
		 (3)支持端口映射,可修改请求报文的目标PORT
		 (4)vs必须是linux系统,rs可以是任何系统
		 (5)lvs主机需要打开核心转发

	lvs-dr:各主机均需要配置VIP,解决地址冲突的方式有三种
		通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑出的RS的RIP所在接口的MAC地址,源IP/PORT,以及目标IP/PORT均保持不变
		lvs主机和各RS都得配置使用VIP

		 (1)确保前端路由器将目标IP为VIP的请求报文发往lvs主机
		  	(a)在前端网关做静态绑定
			(b)在RS上使用arptables 
			(c)在RS上修改内核参数以限制arp通告及应答级别 #下面的实验采取的这个方法
				arp_announce 
					0:默认,把本机上的所有接口的所有信息向每个接口的网络进行通告
					1:尽量避免向非直连网络进行通告
					2:必须避免向非本网络通告
				arp_ignore 
					0:默认值,表示可以使用本地任意接口上的配置地址进行响应
					1:仅在请求的目标ip配置在本地的接收到请求报文的接口上时,才响应

		 (2)RS的RIP可以使用私网地址,也可以是公网地址,RIP与DIP在同一IP网络,RIP的网关不能指向DIP,以确保响应报文不会经由director
		 (3)RS跟director要在同一个物理网络
		 (4)请求报文要经由director,但响应不能经由director,而是有RS直接发往client 
		 (5)不支持端口映射

	lvs-tun:
		转发方式;不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外在封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑出的目标RS,RS直接响应给客户端(源IP是VIP,目标IP是CIP)
		 (1)DIP,VIP,RIP都应该是公网ip
		 (2)RS的网关不能,也不肯指向DIP
		 (3)请求报文要经由director,但响应不能经由director 
		 (4)不支持端口映射
		 (5)RS的OS的支持隧道功能

	lvs-fullnat:
		通过同时修改请求报文的源ip地址和目标ip地址进行转发
			请求报文: CIP-->DIP VIP-->RIP
			响应报文: RIP-->VIP DIP-->CIP

		 (1)VIP是公网ip,RIP和DIP是私网地址,且通常不在一个IP网络,因此,RIP的网关一般不会指向DIP
		 (2)RS收到的请求报文源地址是DIP,因此,只需响应给DIP,到director还要将其发完client
		 (3)请求和响应报文都经由director
		 (4)支持端口映射 
		
	注意:此类型默认不支持,


总结:
	lvs-nat, lva-fullnat:请求和响应报文都经由lvs主机
		lvs-nat:RIP的网关要指向DIP
		lvs-fullnat:RIP和DIP未必在同一ip网络,但要能通信
	
	lvs-tun,lvs-dr:请求报文要经由lvs主机,但响应报文有RS直接发往client
		lvs-dr:通过封装新的MAC得首部,通过MAC网络转发
		lvs-tun:通过在原IP报文之外封装新的IP首部实现转发,支持远距离通信

ipvs scheduler:
	根据其调度时是否考虑各RS当前的负载状态,可分为静态和动态方法两种

		静态方法:仅根据算法本身进行调度
			RR: 轮询
			WRR: 加权轮询
			SH: 实现会话绑定 源IP地址hash,将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
			DH: 目标的值哈希,将发往同一个目标地址的请求始终转发给第一挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡

		动态方法:主要根据每RS当前的负载状态及调度算法进行调度
			overhead=

			LC:least connections 
				overdead=activeconns*256+inactiveconns
			WLC:weighted LC 
				overhead=(activeconns*256+inactiveconns)/weight 
			SED:shortest expection delay 
				overhead=(activeconns+1)*256/weigth 
			NQ:never queue 

			LBLC:locality-based LC 动态的DH算法 
			LBLCR:LBLC with replication 带复制功能的LBLC

ipvsadm命令:
	管理集群服务:增,改,删 
		增,改:
			ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p[timeout]]
		删:
			ipvsadm -D -t|u|f service-address 

		service-address:
			-t|u|f:
				-t:tcp协议的端口,VIP:TCP_PORT
				-u:udp协议的端口,VIP:DUP_POST 
				-f:firewall MASK,是一个数字

			-s :指定集群的调度算法,默认为wlc

	管理集群上的RS:增,删,改 
		增,改:
			ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

		删:
			ipvsadm -d -t|u|f service-address -r server-address 

			service-address:
				rip:[port]

		选项:
		 lvs类型
			-g:gateway,dr类型
			-i:ipip,tun类型 
			-m:masquerade,nat类型 
			-w:权重
			-C:清空定义的所有内容

		查看: ipvsadm -Ln 
			ipvsadm -L |l [option]
				--numeric :数字格式显示端口
				--exact :精确显示计数器的值
				--connection :显示连接状态
				--stats:统计数据
				--rate:速率数据

	保存和重载:
		ipvsadm -S = ipvsadm-save 
		ipvsadm -R = ipvsadm-restore 
	ipvsadm-save >/etc/sysconfig/ipvsadm  #保存配置文件
	ipvsadm-restore </etc/sysconfig/ipvsadm  #重读配置文件

1.配置lvs-nat类型 : 提前准备三台主机,一台lvs,两台server
在这里插入图片描述

提示:防火墙和selinux提前关闭

配置lvs:
	添加本机为lvs,指定调度算法为轮询
	[root@lvs ~]#ipvsadm -A -t 10.117.20.221:80 -s rr 

	添加192.168.1.11为后端主机,-m 指定类型为nat
	[root@lvs ~]#ipvsadm -a -t 10.117.20.221:80 -r 192.168.1.11 -m 

	添加192.168.1.12为后端主机,-m 指定类型为nat
	[root@lvs ~]#ipvsadm -a -t 10.117.20.221:80 -r 192.168.1.12 -m
	
	打开核心转发
	[root@lvs ~]#sysctl  -w net.ipv4.ip_forward=1

配置RS默认网关:
	[root@s1 ~]#route add default gw 192.168.1.10 dev ens33
	[root@s2 ~]#route add default gw 192.168.1.10 dev ens33

查看状态:
在这里插入图片描述

测试:
在这里插入图片描述

修改:
	修改lvs调度算法为加权轮询:
	[root@lvs ~]#ipvsadm -E -t 10.117.20.221:80 -s wrr 
	修改权重为2:
	[root@lvs ~]#ipvsadm -e -t 10.117.20.221:80 -r 1192.168.1.11 -m -w 2
	修改权重为3:
	[root@lvs ~]#ipvsadm -e -t 10.117.20.221:80 -r 192.168.1.12 -m -w 3

	删除指定RS主机:
	ipvsadm -d -t 10.117.20.221:80 -r 192.168.1.11

	把请求转到本机:
	ipvsadm -a -t 10.117.20.221:80  -r 127.0.0.1  -g

	保存:
	ipvsadm-save >/etc/sysconfig/ipvsadm  #保存配置文件
	ipvsadm-restore </etc/sysconfig/ipvsadm  #重读配置文件
	
	lvs-nat:
		设计要点:
			(1)RIP与DIP在同一网络,RIP的网关要指向DIP
			(2)支持端口映射 
			(3)lvs主机要打开核心转发功能

2.配置lvs-dr类型 : 提前准备三台主机,一台lvs,两台server,三台都需要在同一网络
dr类型的核心观念:
1:请求报文是由客户端发送给lvs主机,然后再由lvs主机在发送给RS后端服务器
2:响应报文是由RS后端服务器直接响应给客户端,所以响应报文不会经过lvs主机
在这里插入图片描述

1.修改两台主机的arp内核参数,用脚本实现
#!/bin/bash 
#配置lvs-dr,修改内核参数

case $1 in
start)
	echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
	;;
stop)
	
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
	echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
	;;
*)
	echo "use start|stop"
	exit 1
	;;
esac

#然后在两台server主机上分别执行脚本

2.在两台server主机上分别添加VIP地址,两台配置一样
	ifconfig lo:0 192.168.1.99 netmast 255.255.255.255 broadcast 192.168.1.99 up

	lo:0 192.168.1.99 #设备名称和IP地址
	netmast 255.255.255.255 #32位掩码,指只有一个ip 192.168.1.99
	broadcast 192.168.1.99 #广播地址仅自己
	up #启用

RS1 vip地址:
在这里插入图片描述
RS2 vip地址:
在这里插入图片描述

3.配置两台server主机的路由,两台主机配置一样
 route add -host 192.168.1.99 dev lo:0  #指定所有报文都经由这个地址

RS1路由信息:
在这里插入图片描述
RS2路由信息:
在这里插入图片描述

4.在lvs主机上添加VIP地址 
	ifconfig ens33:0 192.168.1.99 netmast 255.255.255.255 broadcast 192.168.1.99 up

LVS vip地址:
在这里插入图片描述

5.配置lvs主机:
[root@lvs ~]#ipvsadm -A -t 192.168.1.99:80 -s rr 
[root@lvs ~]#ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.111 -g
[root@lvs ~]#ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.112 -g
[root@lvs ~]#ipvsadm -Ln  

在这里插入图片描述

客户端测试:[root@like ~]#for i in {1..20};do curl http://192.168.1.99/ ;done

在这里插入图片描述

配置RS主机最终脚本:

#!/bin/bash 
#配置lvs-dr
#修改内核参数
#添加VIP地址
#修改路由

vip='192.168.1.99' 
mask='255.255.255.255'
iface='lo:0'
broadcast='192.168.1.99'

case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ifconfig $iface $vip netmask $mask  broadcast $broadcast up   
        route add -host $vip $iface 
        ;;
stop)
        ifconfig $iface down
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
        ;;
*)
        echo "use start|stop"
        exit 1
        ;;
esac

3.基于防护墙打标记;注意(提前配置好director主机和RS主机的vip地址)

FWM:firewall mask 
	netfilter:

		--set-mark value 
借助于防火墙标记分类报文,而后基于标记定义集群服务,可将多个不同的应用使用同一个集群服务进行调度;

打标记方法:
	iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $port -j MARK --set-mark NUMBER

基于标记定义集群:
	ipvsadm -A -f NUMBER [option]


基于打标记方法定义lvs集群:
	[root@lvs ~]# iptables -t mangle -A PREROUTING -d 10.117.20.99  -p tcp -m multiport --dports 80,443 -j MARK --set-mark 3
	[root@lvs ~]# #ipvsadm -A -f 3 -s rr
	[root@lvs ~]#ipvsadm -a -f 3 -r 10.117.20.221 -g
	[root@lvs ~]#ipvsadm -a -f 3 -r 10.117.20.222 -g
	[root@lvs ~]#iptables-save > /etc/sysconfig/iptables
	[root@lvs ~]#ipvsadm-save > /etc/sysconfig/ipvsadm

4.lvs persistent:持久连接,注意(提前配置好director主机和RS主机的vip地址)

持久连接模板:实现无论使用任何调度算法,在一段时间内,能够实现将来自同一个地址的请求始终发往同一台RS主机

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout]

port affinity:
	每端口持久:每个端口对应定义一个集群服务,每集群服务单独调度
	每防火墙标记持久:基于防火墙标记定义集群服务,可实现将多个端口上的应用统一调度,即所谓的port worker_cpu_affinity

	[root@lvs ~]#ipvsadm -A -t 10.117.20.99:0 -s rr -p
	[root@lvs ~]#ipvsadm -a -t 10.117.20.99:0 -r 10.117.20.221 -g
	[root@lvs ~]#ipvsadm -a -t 10.117.20.99:0 -r 10.117.20.222 -g
	[root@lvs ~]#ipvsadm-save > /etc/sysconfig/ipvsadm

查看lvs:
在这里插入图片描述
测试: 如果第一次请求,调度到了S2这台服务器,那么在规定时间内,在发出的请求,都会调度到这台服务器上面
在这里插入图片描述

5.lvs健康状态监测-ldirectord, 功用:会自动检测后端服务器是否在线,如果掉线自动移除,上线自动添加;注意(提前配置好director主机和RS主机的vip地址)

下载地址: ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/ldirectord-3.9.5-3.1.x86_64.rpm

1.安装:
	[root@lvs ~]#yum install ./ldirectord-3.9.5-3.1.x86_64.rpm
	[root@lvs ~]#cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
	[root@lvs ~]#vim /etc/ha.d/ldirectord.cf 
	 配置实列:
		# Sample for an http virtual service
		virtual=10.117.20.99:80    #VIP地址
		real=10.117.20.221:80 gate  #RS服务器地址
		real=10.117.20.222:80 gate   #RS服务器地址
		fallback=127.0.0.1:80 gate 
		service=http
		scheduler=rr
		#persistent=600
		#netmask=255.255.255.255
		protocol=tcp
		checktype=negotiate
		checkport=80
		request="index.html"
		#receive="Test Page"  
		#virtualhost=www.x.y.z  

	[root@lvs ~]#service ldirectord start  

查看lvs:

在这里插入图片描述

手动关闭一台服务器,看一下效果:

在这里插入图片描述
会自动移除掉线的服务器:
在这里插入图片描述

再重启把关闭的服务启动:
在这里插入图片描述
再次查看:
在这里插入图片描述

6.使用防火墙标记的方法,进行健康状态监测,;注意(提前配置好director主机和RS主机的vip地址)

1.启动iptables,配置规则:
[root@lvs ~]#iptables -t mangle -A PREROUTING -d 10.117.20.99 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 3

查看iptables-mangle表规则:
在这里插入图片描述

2.[root@lvs ~]#vim /etc/ha.d/ldirectord.cf
在这里插入图片描述

3.[root@lvs ~]#service ldirectord restart
4.[root@lvs ~]#iptables-save > /etc/sysconfig/iptables

查看lvs状态:
在这里插入图片描述
测试:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值