反向代理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
-
因为访问的目标IP,和回复数据的IP必须一致
-
调度器中: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个功能可分开使用。
- 实现VRRP,即高可用,热备份
- 自动配置LVS
- 健康检查功能
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消耗低
- 配置性低,没有太多可配置性,减少人为错误。
- 应用面广,几乎可以为所有应用提供负载均衡。
-
不支持正则,不能实现动静分离。
3、HAProxy
- 优点 支持session、cookie功能
- 可以通过URL进行健康检查
- 效率、负载均衡速度,高于Nginx,低于LVS
- HAProxy支持TCP,可对Mysql进行负载均衡。
- 调度算法丰富
-
正则弱于Nginx
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)
- Nginx入门级简介,包括安装,基本使用,负载均衡,动静分离,反向代理,缓存应用等功能。
- 反向代理失败?nginx配置proxy_set_header Host $host的作用
- Nginx配置文件详细说明,包括基本配置,反向代理配置,expire缓存过期,适合接入CDN的配置
- 反向代理基本概念和配置服务器的三种方法
- 解决nginx使用proxy_pass反向代理时,cookie丢失的问题
- Apache配置反向代理、负载均衡和集群(mod_proxy方式)
- 在Nginx服务器中配置mod_proxy反向代理的方法
- nginx 反向代理web应用将https请求转成http请求时,必须注意事项
- Qt之QComboBox(基本应用、代理设置)
- 反向代理服务器原理及搭建,开放的反向代理服务软件应用nginx和nat123的使用
- 高性能反向代理软件HAProxy(一)之基本概念
- 使用nginx反向代理后如何在后台web应用中获取用户ip
- Proxy()和 Reflect代理的基本使用
- squid反向代理基本概述及性能事项
- Proxy代理模式之应用
- Nginx 反向代理服务器的基本配置(八)
- nginx 反向代理的基本配置(以Ubuntu 16.04LTS为例)
- apache的mod_proxy 反向代理
- 高性能反向代理软件HAProxy(二)之应用举例
- nginx反向代理proxy_set_header自定义header头无效的问题