APP下载

基于Nginx的高校图书馆站群开源架构应用研究

2018-11-29蒋南

新世纪图书馆 2018年8期
关键词:系统架构图书馆

蒋南

摘 要 论文介绍了如何在CentOS6环境下,利用开源软件Nginx和Keepalived构建图书馆站群架构,结合南京师范大学图书馆“2016主页平台改版”的建设实践,提出构建高校图书馆站群架构的新思路。

关键词 Nginx 图书馆 Keepalived 反向代理 系统架构

分类号 G258.6

DOI 10.16810/j.cnki.1672-514X.2018.08.016

随着互联网的快速发展和图书馆信息化水平的不断提高,图书馆网站建设的规模日益扩大,内容不断丰富,有效地扩大了图书馆的影响,促进了图书馆和读者之间的信息交流。南京师范大学图书馆在2000年开始建设网站,到目前为止各类网站大约有30多个,服务器也达到了50多台。但是,由于建设时间跨度大、缺乏统一的管理规范,部分网站会出现访问无响应和黑客攻击等问题。为了解决这些问题,图书馆2016年利用Nginx的反向代理功能,配以Keepalived实现双机热备,整合图书馆各类资源和服务网站,重新构建了图书馆站群系统,达到了图书馆网站统一管理、统一维护和统一安全防范的要求,最大程度提高了图书馆网站的可用性、伸缩性和可扩展性[1]。

1 Nginx简介

Nginx(“Engine X”)是俄罗斯Igor Sysoev(伊戈尔·塞索耶夫)编写的一款高性能的HTTP和反向代理服务器。在高并发的情况下,Nginx是Apache服务器不错的替代品,它支持高达50 000个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。Nginx已经在俄罗斯最大的门户网站Rambler Media上運行多年,且俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。在国内,已经有新浪、豆瓣网和迅雷等多家网站使用Nginx作为Web服务器或反向代理服务器[2]。

与购买硬件负载均衡设备相比,采用2-clause BSD-like协议的Nginx具有更多优势。一是支持高并发,内存消耗少,成本低廉;二是配置文件非常简单,即使是非专业的系统管理员也能够看懂;三是能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组;四是系统性能稳定,节省带宽,内置健康检查功能;五是支持热部署,启动容易,支持全天候运行,并且支持在不中断服务的情况下升级软件。

根据W3Techs公布的数据,Nginx当前已经在Web服务器领域有了一定的地位,如图1所示,在排名前1000、10 000、10万和100万的网站中已经全面超过Apache。虽然Apache以49.2%的总量暂居首位,但是Nginx上升势头迅猛,可以预料不久的将来Nginx将成为全球最流行的服务器软件。

图1 全球网站服务器软件排行[3]

2 网站传统架构模式及存在的问题

随着图书馆资源的不断丰富,图书馆网站的规模也在日益扩大,图书馆系统管理员常用简单的LAMP架构来部署图书馆的应用和服务。该架构的特点是结构简单、容易实施以及和其他系统的关联性小[4-5]。以南京师范大学图书馆为例,在整个图书馆发展过程中,部署了大量资源和服务网站,这些网站大部分是一个应用对应一台服务器的单主机模式。少数业务应用采用将Web应用和数据库分开部署到两台服务器上面的独立主机模式,以增加整个系统的容错性,保证Web服务器的横向扩展。

简单的传统架构在稳定性、安全性和系统关联度上存在很多问题。一是各网站服务器由于单节点对外发布服务,极易出现宕机的情况,网站无法提供全天候不间断服务。二是由于Web服务器直接对外服务,暴露在外部网络,容易招受攻击而导致服务器瘫痪或网页被更改,网站和系统的安全性大大降低。三是单台服务器服务能力有限,无法应对高并发、大流量的用户访问。四是各网站相互隔离,无法进行关联,若想实现服务器之间的数据共享难度很大。为了解决上述问题,我们借鉴了大型网站架构模式,重新构建图书馆站群架构,并采用分层、高可用、缓存和异步等技术手段来最大程度提升整个网站系统的稳定性[4]。

3 图书馆高性能站群架构设计

图书馆网站传统架构的性能依赖于服务器单机的性能,这是整个架构的瓶颈所在。在新架构中不仅需要发挥服务器单机的最大性能,还需要有一个合理的网站架构,将图书馆所有的Web应用整合成一个站群有机体,最大程度发挥站群整体架构的优势来保障图书馆信息服务的正常开展。分层架构模式是最为常用的网站构建模式,架构内部每一层执行特定的功能。在新架构中根据服务器类别属性,可将整个架构分成三层:反向代理层、业务层和数据层。

反向代理层是整个架构的核心,负责整个站群的数据转发,我们在该层部署两台高性能服务器,安装Nginx反向代理服务,并通过Keepalived软件对Nginx实现双机热备(High Available),以增加整个架构的稳定性。该层还负责将原有图书馆主页、OPAC等服务器的外网IP地址通过VIP(虚拟网络地址)的方式绑定到双机上面以提供地址解析服务。

原有网站服务器改成内网IP后,将其放入业务层,对于图书馆主页、OPAC服务等关键业务,我们结合服务器虚拟化创建集群,以保障系统性能和高可用。

数据层主要包括后台业务生产系统和数据库系统等。以图书馆网站主页为例,我们将主页后台CMS内容管理系统部署到数据层,然后通过同步软件将待发布文件实时同步更新到所有的业务层主页集群服务器中。改造后的站群架构如图2所示。

图2 基于Nginx和Keepalived的图书馆站群架构

同改造前架构相比,新架构有诸多优势。一是系统可靠性大幅度增强。通过部署集群,可以实现应用的高可用,提供全天候不间断服务。二是网站系统可扩展性得到增强。反向代理可以理解为7层应用层的负载均衡,使用负载均衡之后可以非常便捷地横向扩展服务器集群,实现集群整体并发能力、抗压能力的提高。三是实现网站数据共享。各网站通过Nginx聚合到了一起,通过反向代理层可以实现不同网站之间跨域,从而方便地实现数据对接与共享。四是有效提高后端服务器性能。通过反向代理本地缓存功能,对后端服务器静态资源进行缓存,可以有效减少后端服务器的压力,从而提高网站整体性能。五是安全性进一步加强。由于真实服务器被部署在图书馆内网,新架构有效隐藏隔离了内部服务器,提高了系统安全性。

4 图书馆高性能站群具体实现

笔者以CentOS 6.8为系统环境,通过yum命令安装开源软件Nginx1.10.1稳定版和Keepalived1.1.20,从多个方面来分析图书馆高性能站群的具体实现。

4.1 基于Keepalived的Nginx服务器双机热备

Nginx本身是单点反向代理,Nginx服务器本身出现故障的话,就会导致整个站群都无法提供服务。为了解决这个问题,在新架构中可将开源软件Keepalived应用到Nginx服务器上面,实现Nginx服务器双机热备。Keepalived是通过VRRP协议来备份路由的高可靠性运行件,将Keepalived设计的服务模式应用到图书馆Nginx服务器上面,可以实现Nginx服务器的IP瞬间无缝交接,平滑切换,最大程度保障图书馆站群架构的稳定性[5]。

Keepalived双机热备方案中,两台机器(Master和Backup)同时运行,只有一台机器(Master) 提供对外服务。当该机出现故障的时候,另外一台(Backup)会马上自动接管并且提供服务,而且切换的时间非常短,一旦Master机器恢复正常,那么服务将再次被切回Master服务器。Master和Backup两台机器的Keepalived配置只有少许区别,主要如下:

vrrp_instance VI_1 {

interface eth0 #实例所绑定的网卡

state MASTER #实例初始化状态,备机修改为:state BACKUP

virtual_router_id 51 #組名,同一节点的组名必须一致

priority 100 #优先级,Backup:priority 80

……

virtual_ipaddress {

202.119.108.112/24 dev eth0 #配置对外服务虚拟IP地址,可以配置多个IP地址

202.119.108.113/24 dev eth0

}

……

}

Keepalived是通过竞选机制来确定主备的,高优先级竞选为Master,因此Master配置里面的priority必须要高于Backup机器[6]。测试及验证:拔掉节点Master的网线,虚拟IP会自动绑定到节点Backup上,再恢复Master节点的网线,虚拟IP又绑定回节点Master之上。在实际应用中,还可以借助Keepalived提供的vrrp_script及track_script来设置仲裁,以防止脑裂的可能[7]。

4.2 使用Nginx实现网站负载均衡

随着硬件技术的快速发展,越来越多的负载均衡设备涌现出来,但是其昂贵的价格却往往令人望而却步,因此利用开源软件实现负载均衡就成为当下图书馆的不二之选。

Nginx的负载均衡是一个基于内容和应用的七层交换负载均衡,以反向代理服务器方式实现。因此使用Nginx实现服务器负载均衡的关键在于ngx_http_upstream_hash_module模块的使用和设置。Nginx的upstream模块的负载均衡算法有:轮询、权重轮循均衡、按IP的hash结果分配、按响应时间来分配和按URL的hash结果来分配[8]。考虑到图书馆网站的具体情况,采用了ip hash的方式来分配,通过将同一客户端的请求发往同一个后端服务器,可以解决session保持问题。下面以图书馆OPAC服务为例,创建OPAC集群,关键代码如下:

upstream opacservers{ #定义upstream名字opacservers,供反向代理引用

ip_hash; #通过ip_hash方式轮询

server 192.168.1.116; #指定后端服务器1

server 192.168.1.117; #指定后端服务器2

}

location /{

proxy_pass http://opacservers/; #反向代理地址

……

}

Nginx的upstream模块相当于把后端的服务器地址放在了一个地址池里,而proxy模块则是从这个池子里调用了这些服务器。通过上述设置,可以创建图书馆OPAC服务集群,当后台服务器有一台出现故障宕机后,图书馆OPAC服务不会中断,所有的客户端请求将被发送到另外一台服务器上面,从而保持图书馆关键性应用的持续性,提高服务的可靠性。

4.3 基于Nginx的Web内容高性能缓存

Nginx反向代理服务器具有缓存功能,内容缓存是显著提高Web站点性能最有效的方法之一,通过Nginx的proxy_cache模块对网站静态内容进行缓存,既节省了与后端 Web 服务器的通讯开销,大大加快了访问速度,同时也减轻了后端 Web 服务器的负但[9]。

以缓存图书馆主页为例,首先Nginx反向代理服务器(Nginx_Master)对访问请求进行缓存检测,如果本地没有相应缓存(MISS)就通过后台主页集群获取相关内容,然后保存到Nginx_Master服务器本地,同时对客户端进行响应;如果本地已有相关内容的缓存(HIT),那么Nginx将直接对客户端的请求进行响应,具体过程如图3所示。

图3 Nginx的web内容缓存示意图

Nginx反向代理服务器web缓存关键配置如下:

proxy_cache_path /home/webpages_cache levels=1:2 keys_zone= webcache:2000m inactive=15d max_size=10g; #定义名称为webcache的nginx缓存

location ~* \.(gif|jpg|jpeg|png|bmp|swf|js|css)$ #通过正则表达式对特定文件进行缓存

{

proxy_cache webcache; #使用web缓存区webcache

proxy_cache_valid 200 206 304 301 302 90d; #对不同http状态码缓存设置缓存时间

……

}

Nginx 能通过内存缓存和传统的硬盘缓存进行工作,最热的数据放入内存,不经常访问的内容会缓存到硬盘,可以通过配置inactive参数来定制缓存释放机制。

4.4 通過Nginx实现跨域

在网络中,域是独立运行的一个单位,而在网络操作系统中,域属于逻辑组织的单元,区隔和标签了网络的安全边界。在各个不同的域之间进行互访,需要建立一个类似于信任关系的语法桥梁。只有实现了跨域,两个域之间才可以互访,实现数据共享[10]。默认浏览器不能执行其他网站的脚本,这是由浏览器的同源[11]策略造成的,是浏览器对JavaScript施加的安全限制。所谓同源是指域名、协议和端口均相同。比如:http://lib.njnu.edu.cn/index.html调用http://opac.njnu.edu.cn/api/,由于主域名不同而无法实现数据交互。实现跨域的办法虽然比较多,比如服务器端的XmlHttpRequest、document.domain+iframe和window.name等,不过这些方法都需要目标服务器进行配合,而通过Nginx我们可以方便地实现域名转发,将http://opac.njnu.edu.cn/lapi/这个地址通过Nginx的域名转发功能转换成http://lib.njnu.edu.cn/lapi/,从而实现跨域,关键配置如下:

location /lapi{ #对lib.njnu.edu.cn域名的lapi子目录进行配置

proxy_pass http://opac.njnu.edu.cn/lapi/;

#转发目标地址

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

通过Nginx实现跨域是最简单的跨域方式,支持所有浏览器,支持session,不需要修改任何代码,并且不影响服务器性能。我们只需要配置Nginx,将多个真实服务器的URL转发到相同的域名、协议和端口上面,从而实现图书馆内各系统的数据共享与对接。

4.5 通过Nginx实现TCP反向代理

通常Nginx是基于HTTP层的反向代理,不过从Nginx1.9版本开始支持TCP协议的反向代理,实现基于TCP端口的转发。Nginx的TCP代理功能和HTTP反向代理有所不同:请求TCP端口的所有流量将会发送到目标服务器,而在HTTP反向代理中可以细化哪些请求分发到哪些服务器。Nginx的TCP代理不仅仅局限于web的url请求,还可以转发如memcached、mysql和oracle等点到点的请求。下面以南京师范大学图书馆汇文系统Oracle数据库为例,实现Oracle数据库的负载均衡。

南京师范大学图书馆汇文系统的运行方式是两台小型机(内网IP)通过共享存储的方式实现双机并行,并且同时对外服务。由于多校区的原因,之前在客户端设置上面只能选择连接一台数据库服务器,现在可通过Nginx构建Oracle数据库反向代理,实现了两台小型机负载均衡和高可用,不仅提高了效率,也免去了频繁修改客户端配置的麻烦。关键代码如下:

stream{

upstream proxy_tcp {

hash $remote_addr consistent;

server 192.168.1.88:1521 weight=10 max_fails=3 fail_timeout=60s;

server 192.168.1.89:1521 weight=5 max_fails=3 fail_timeout=60s;

}

server {

listen 1521; #反向代理服务器监听端口

proxy_pass proxy_tcp; #实现TCP转发

proxy_connect_timeout 10s;

proxy_timeout 600s;

}

}

上述配置可以实现反向代理服务器的1521端口和内网192.168.1.88和192.168.1.89两台服务器1521端口的转发,并且实现流量负载均衡。这样即使一台服务器进行关机维护,图书馆的汇文oracle服务也不会中断,真正做到数据库高可用。

5 系统架构验证

通过以上配置与实施,图书馆构建了一个全新的图书馆高性能站群架构,通过这个架构可实现高可用、可扩展和轻量级的目标。在实际生产环境中通过apache的httpd-tools工具中的ab命令对新老架构进行压力测试(测试服务器为DELL PowerEdge R710,硬件环境均相同),测试命令为:ab -n 50000 -c 1000 http://opac.njnu.edu.cn/tpl/css/bootstrap.css,该命令对网站总共发起50 000次访问请求,每次访问的并发数为1000,测试结果如表1所示。

测试数据表明,新架构得益于Nginx缓存、Gzip压缩等功能,在总耗时、吞吐率和网络流量等参数上面均高于传统架构,在高并发情况下,新架构受益于Nginx的先进模型,服务器CPU利用率控制得非常好,不会出现老架构在高并发情况下服务器CPU被全部占满的现象。南京师范大学图书馆站群新架构部署至今未出现图书馆Web应用宕机事件,整个架构运行稳定、效果良好。

6 结语

本文提出了在图书馆多服务器环境下构建基于Nginx和Keepalived的图书馆站群开源架构方案。该方案通过开源软件来实现图书馆高可用站群的部署,充分发挥图书馆服务器的性能,提高了图书馆Web服务的可用性和并发量,但在运行过程中存在着一些不足,需要改进。一是反向代理Web缓存处理静态文件(如图片、文本文件等)比较理想,但是不适合做即时数据查询、即时评论等页面的缓存,因为在缓存时间内相应的页面无法得到即时更新。对于这个问题,性能要求高的应用,只能通过部署服务器集群的方式来解决。二是本文OPAC服务器负载均衡采用的是基于ip_hash的方式来实现的,虽然解决了session保持问题,但是这种方式没有起到均衡负载的目的。如果既要做到session共享又要实现负载均衡,最有效的方法就是把session放入redis[12]内存数据库。

猜你喜欢

系统架构图书馆
图书馆
气味图书馆
欢迎到图书馆做客
面向管理信息系统开发的软件工厂技术研究
人工智能在智能机器人系统中的应用研究
基于云计算的多媒体网络学习平台系统架构
企业大数据建设的技术瓶颈
去图书馆