第十三周学习内容:nginx和lvs

第十三周作业:

1、详细描述常见nginx常用模块和模块的使用示例。

      nginx的三大主要功能:http服务、反代服务以及邮件服务。作为http服务其性能要优于httpd,可以用来解决c10k问题,利用了信号驱动和异步I/0架构,在很小内存消耗的情况下,承载了大量的并发连接。而作为反代服务其可以基于七层做判断,做到负载均衡,性能也非常优越。

      nginx的架构是由主程序(master)管理子进程(worker),然后每个worker都能处理多个请求,有通过http协议调用本地磁盘的静态资源,有通过fast cgi向fpm server调用动态资源,还可以通过cache loader和cache manager管理本地缓存等。nginx也是高度模块化的,支持动态装卸载,模块分为三大类:核心模块、标准模块和第三方模块。

      nginx的主配置文件/etc/nginx/nginx.conf。和httpd一样,也支持/etc/nginx/conf.d/*.conf这种自定义的配置文件,配置指令都是“名称 值”得格式,结尾必须加“;”。主配置文件可分为四部分:主配置段,用来定义nginx进程自身的特性;http配置段,用http{}框起来,用来定义http服务的相关配置,默认网页路径为/usr/share/nginx/html;邮件配置段,用mail{}框起来;反代配置段,用stream{}框起来。

      安装nginx,修改配置文件,创建测试主页,启动服务,最简单的nginx关于http的服务就完成了。

      Linux学习(第十三周)_第1张图片

      Linux学习(第十三周)_第2张图片

      image.png

      image.png

      Linux学习(第十三周)_第3张图片

      常用模块:(1)基于IP地址的访问控制模块,利用allow和deny,放行指定地址、拒绝指定地址访问。

      Linux学习(第十三周)_第4张图片

      表示仅允许10.0.0.7访问,其他的全拒绝

      Linux学习(第十三周)_第5张图片

      10.0.0.7不受影响

      Linux学习(第十三周)_第6张图片

      10.0.0.8主机访问就被拒绝

      (2)基于用户的访问控制模块:auth_basic+“名字”或off,表示开启或关闭基于用的访问控制;auth_basic_user_file指明用户认证文件所在位置。文件的创建方式可使用htpasswd。

      安装httpd-tools

      image.png

      使用htpasswd命令创建认证文件

      image.png

      修改配置文件

      Linux学习(第十三周)_第7张图片

      再次访问就要输入用户名和密码了

      Linux学习(第十三周)_第8张图片

      (3)状态页模块:stub_status,指明在哪个URL向外输出即可。

      修改配置文件

      Linux学习(第十三周)_第9张图片

      访问网页时,后面添加/status/,即可访问状态页。状态页显示的内容:active connections,当前活动连接数;accept,接受请求数;handled,处理请求数;requests,收到请求数;reading,正在接受请求过程中的连接数;writing,正在发送响应过程中的连接数;waiting,正在等待客户端发出请求的空闲连接数。

      Linux学习(第十三周)_第10张图片

      (4)日志模块:log_format,指明日志格式。在主配置文件中,默认定义了main格式,其中main后面跟的所有以“$”号开头的是内置变量,标识要记录的信息。access_log,定义访问日志存储路径和具体名字。    

      Linux学习(第十三周)_第11张图片

      (5)压缩模块:gzip on/off,压缩开关。gzip_comp_level,压缩级别,默认是1。gzip_disable,禁用压缩的地方,一般用来针对浏览器,后可跟正则表达式。gzip_type,压缩类型。

      修改配置文件

      Linux学习(第十三周)_第12张图片

      请求稍大一些的静态资源,打开浏览器自带的调试功能,可以看到是以gzip格式发送的。

      Linux学习(第十三周)_第13张图片

      (6)SSL模块:ssl on/off,SSL开关;ssl_certificate,知名证书文件;ssl_protocols,支持的ssl协议版本;ssl_sesstion-cache,ssl的内建缓存,建议使用share格式;ssl_session_timeout,有效时长;ssl_certificate_key,指明私钥。

      搞定证书文件,包括生成私钥、生成证书、给CA签名等。

      image.png

      修改配置文件

      Linux学习(第十三周)_第14张图片

      使用https进行访问

      Linux学习(第十三周)_第15张图片

      (7)重写模块:当用户访问某URL时,将其重写或重定向文另一个路径,还可以把用户的http请求重写为https。rewrite+正则表达式+替换内容,将访问正则表达式的请求,替换为替换内容中的内容。在重写配置命令的最后还可以加上标志位,共有四种:当有多条重写语句时,流程是依次执行的,标志位last表示匹配到并重写后将返回到最外面,重新进行一次匹配,若匹配到其他location,则剩余的rewrite都不会在执行;break表示跳过余下所有的重写配置,以此url执行其他非重写的配置语句;redirect表示重写此url,并把报文发还给客户端,客户端再向新url重新发起请求,已重定向的方式定义此rewrite配置,不过是临时重定向;permanent,意义和上一条一样,只是变成了永久重定向。

      修改配置文件,将所有对png文件发起的请求,都会被重写为jpg。

      Linux学习(第十三周)_第16张图片

      这样在没有png资源的情况下,对png文件发起请求,也会被访问到。

      Linux学习(第十三周)_第17张图片

      (8)引用模块:用来防盗链的,valid_referers,定义合法引用。后面可以跟上none表示只有报文首部没有referer报头才是合法的,其他情况都是不合法的;后面还可以跟block表示referer报头为空也是合法的;还可以跟具体主机名,表示只有该主机引用才是合法的。

      定义配置文件

      Linux学习(第十三周)_第18张图片

2、简述Linux集群类型、系统扩展方式及调度方法 。

      在生产环境中,单台主机的并发响应能力有限,若不能满足服务的需求,一般有两种解决方案,一是scale up向上扩展,也就是升级主机的配置;另一种是scale out向外扩展,是使用多台主机捆绑起来提供相同的服务,让并发能够分散处理,从而达到提高响应能力的效果,这种解决方案也叫作lb cluster,负载均衡集群。在这种集群中,有多台主机提供相同服务,共用同一个数据库,共用一个网络存储,甚至还会用同一个缓存服务器等,需要有个调度器去统一协调,按照统一的调度方法把报文合理的分配至各台主机。然而这个调度器,数据库,网络存储服务器等都只使用一台的话,会造成压力很大,发生故障会导致整个服务宕机,这也叫单点故障风险。所以引入了高可用集群,可以做到多台主机之间互为冗余备份,有主有备,定时传递心跳信息,一旦主服务器发生故障,备用服务器会抢占主服务器的位置,为用户或其他主机提供相同服务。除此之外,还有一种叫高性能集群,是依靠推挤硬件来提升单台主机的性能能,也就是scale up,在生产环境中使用的不多,但在实验环境中有可能会用得到,top500每季度会评一次的超级计算机就是其运用。

      负载均衡集群的调度方法:根据其调度时是否考虑服务器当前的负载情况可分为静态和动态。静态,仅根据算法本身进行调度:RR(轮询),按顺序一个包一个主机的分配;WRR(加权轮询),在RR的基础上加上了权重的概念,权重大的被分配的多,权重小的被分配的少;SH(源哈希),不管什么用户都根据源地址将其绑定在某台主机上,当用户第一次请求时依然会以轮询的方式将其分配到某台主机,同时会将用户IP地址做哈希计算,将值与服务器的IP地址绑定记于一张哈希表中,以后该用户再访问时,就将被固定分配到那台主机上了;DH(目的哈希),原理和SH一样,只是将目标地址做哈希计算,并将其与服务器绑定,经常用于正向代理的情况,众多客户使用多台正向代理服务器访问外网,为了提高缓存命中率就将目标地址绑定在某台正向代理服务器上,效果显著。动态,根据后端服务器的负载状态进行分配,负载值被称为overhoad:LC(最少连接),overhoad=活动连接数*256+非活动连接数,负载值小的被分配;WLC(加权最少连接),overhoad=(活动*256+非活动)/权重,也是越小越容易被分配,这也是LVS默认的调度规则;SED(最短期望延迟),overhoad=(活动+1)*256/权重,已不在考虑费活动连接数,并且把0活动连接数的情况考虑进去了;NQ(不排队),SED的升级版,从SED的公式可以看出,有可能会出现负载值差距很大的情况。基于这个问题,NQ就是在SED的基础上,先以轮询的方式一个一个分配,然后再看overhead,尽量不要造成排队的情况。除此之外,还有两种动静结合的调度规则LBLC,把动态和DH相结合;LBLCR,带复制功能的LBLC,可以吧忙的服务器上的绑定移一部分到空闲服务器上。

3、简述lvs四种集群有点及使用场景  。

      lvs(Linux Virtual Server),是工作在四层的负载均衡程序,由于在四层无需进入用户空间,所以也就无需监听套接字,不受端口数量的限制,对于用不起F5,但并发数又很大的企业可以使用。lvs的工作类型公有四种:lvs-nat;lvs-dr;lvs-tun;lvs-fullnat。lvs中的术语:调度器叫VS,后端服务器叫RS,VS有两个地址:面向客户端的地址叫VIP,面向后端主机的地址叫DIP,RS的地址叫RIP,客户端的地址叫CIP。

      lvs-nat:多目标IP的DNAT,最简单的一种结构,最简单的一种结构,根据iptables中提到过的架构netfilter,用户报文到达INPUT链,查看是否匹配得到ipvs中的规则,匹配到的话转换其目标IP地址并发送给后端服务器,后端服务器处理完毕后必须将报文发回给调度器,所以调度器的DIP必须为后端主机的网关,调度器会再次改变源IP地址并发给用户,整个过程中用户默认是不知道任何关于后端服务器的信息的,其中VIP一般为公网地址,而DIP和RIP是位于同一网段的私网地址。

      

      lvs-dr:在前一种工作类型中,调度器的压力极大,因为所有的报文都要通过其中专,lvs-dr类型通过特殊结构,让后端服务器在回包时可以直接找到客户。首先RS与VS在同一交换机上,RIP与DIP位于同一网段且都是公网地址,然后将VIP设置于各台主机的虚拟接口上,如lo0、物理接口:0等,再关闭RS的ARP通告和ARP响应,这样当客户把报文发给VIP并到交换机时,自然会找到VS了,因为只有VS响应此ARP请求。VS查看ipvs规则,不会去修改目的IP地址,而是修改源目MAC地址将其转发给后端服务器,由于后端服务的虚拟接口上有VIP,所以其也会接受报文并做出响应,此响应报文是要直接发给客户的,所以一定要让回包的源地址为RS的VIP,这样就有效减轻了调度器的负担了。

      

      lvs-tun:在前两种类型中,DIP与RIP必须在同一网段,这在物理上就限制了RS与VS必须在同一机房。而lvs-tun类型是通过隧道技术,让分隔两地的主机也能作为集群工作。和lvs-dr类型相似,也是请求报文经过vs,响应报文有后端服务器直接发给用户,但不用限制ARP了。在用户报文到达VS后,VS会在二层帧头和三层报头之间添加一个IP报头,将源目地址设为DIP与RIP并发给RS,RS收到后先拆开第一层IP报头,知道是lvs-tun模型,再拆第二层,也就是真正的IP报头,获得客户CIP,做出响应时就以源VIP,目CIP发送报文,此模型在生产环境中不多见。

      

      lvs-fullnat:在无需大费周章的使用隧道技术的情况下,跨越网段部署lvs。其不是标准类型,需要编译安装。工作原理和nat一样,只是vs在转换时,不仅能改变目标地址,也能改变源地址,把源地址改为DIP,这样RS在回包时会按图索骥找到DIP,VS再将其转换回CIP并发送给客户,这样就可以在客户和RS都不知道对方的情况下,在VS的掌控下进行通信了。但VS的压力依然巨大,而且安装起来不是很方便,所以使用的也不多。

      

总结:NAT/FULLNAT:响应报文都是经由VS的;DR/TUN:仅请求报文经由VS。NAT:只修改目的IP地址;FULLNAT:修改源和目的IP地址;DR:dip与rip在同一网段;TUN:dip与rip不在同一网段。

4、描述LVS-NAT、LVS-DR的工作原理并实现配置。

      lvs由两部分组成ipvsadm和ipvs,ipvs是内核功能,一般是系统安装时已编译进内核了。而ipvsadm是一个程序包,用来配置规则的命令行工具。配置命令其实非常简单,但要准备好环境。

      lvs-nat:准备三台主机,一台作为调度器,拥有两块网卡,一块配置vip,一块配置dip;两台作为后端服务器,配置rip,与dip在同一网段,但与vip不在同一网段,并且两台服务器上都准备好相同的web服务,为了测试,准备两张名字相同,内容不同的页面。

      主机1:vip:10.0.0.9/dip:192.168.10.11

      Linux学习(第十三周)_第19张图片

      主机2:rip:192.168.10.10

      Linux学习(第十三周)_第20张图片

      主机3:rip:192.168.10.12

      Linux学习(第十三周)_第21张图片

      主机2,3都准备好一张测试页,并且启动web服务。

      Linux学习(第十三周)_第22张图片

      Linux学习(第十三周)_第23张图片

      主机1上使用ipvsadm命令,配置规则。表示添加服务,目标地址为10.0.0.9:80,调度规则使用rr;再添加两台rs进此规则中,配置就完成了。

      Linux学习(第十三周)_第24张图片

      使用简单的循环语句做测试。

      Linux学习(第十三周)_第25张图片

      lvs-dr:准备三台主机,一台vs,两台rs,vip都配置在虚拟接口上,rip和dip都配置在物理接口上,且都位于同一网段。

      主机1:vip:10.0.0.100/dip:10.0.0.9

      Linux学习(第十三周)_第26张图片

      主机2:vip:10.0.0.100/rip:10.0.0.8

      Linux学习(第十三周)_第27张图片

    主机3:vip:10.0.0.100/rip:10.0.0.10

      Linux学习(第十三周)_第28张图片

      主机2、3上关闭arp请求和arp响应。

      image.png

      主机2、3上配置路由,所有访问10.0.0.100的报文都经由lo:0出。

      image.png

      主机2、3上配置测试页。

      Linux学习(第十三周)_第29张图片

      Linux学习(第十三周)_第30张图片

      准备工作完毕,接着就是主机1上的ipvs配置了。

      Linux学习(第十三周)_第31张图片

      还是使用循环命令进行测试,但必须再换台主机。

      Linux学习(第十三周)_第32张图片