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状态:
测试: