利用反向代理服务器对基于Web的选课系统的性能优化
2020-11-13黄聪颖滕建
黄聪颖 滕建
摘要:多数高校已建立以“客户服务器”为通信模型的多个信息化系统,但教务管理等业务系统仍存在短时间突发访问集中、访问量大导致服务器响应缓慢甚至宕机情况发生。从系统架构优化的角度,部署Caddy开源网页服务器作为反向代理服务器,通过缓存加快用户访问速度,保障业务系统服务器安全。在抗击新型冠状病毒肺炎期间,为解决校外师生集中访问校内资源的需求,缓解VPN压力,通过开放网络防火墙中反向代理服务器而非业务系统服务器的80、443等端口向校外师生提供网页服务,实现了在保障业务系统服务器安全的前提下“停课不停教、不停学”。
关键词:选课系统;Caddy;缓存;HTTP/2;TLS1.3
中图分类号:TP311
文献标志码:A
WebbasedCourseSelectionSystemPerformanceOptimizeviaReverseProxyServer
HUANGCongying1,TENGJian2
(1.SchoolofMathematicsandPhysics;2.CenterofInformationScience&Technology,
BeijingUniversityofChemicalTechnology,Beijing100029,China)
Abstract:Manyinformationsystemswhichtake“clientserver”asthecommunicationmodelhavebeensetupincollegesanduniversities.However,therearesomeproblemsinbusinesssystemssuchascourseselectionsystemstillhaveshorttermobstructedduetosuddenaccessconcentrationandthelargeamountofaccesses,resultinginslowresponseorevendowntimeoftheserver.Inthispaper,fromtheperspectiveofsystemarchitectureoptimization,CaddyWebServerisdeployedasareverseproxyservertospeedupuseraccessspeedandensurethesecurityofbusinesssystemserver.DuringthefightagainstCOVID19,inordertosolvetheneedsofoutercampusteachersandstudentstoconcentrateonaccessingschoolresources,alleviatethepressureofVPN,thedesigncanprovideWebservicestooutercampusteachersandstudentsthroughthe80and443portsofreverseproxyserverinsteadofthebusinesssystemserver.
Keywords:courseselectionsystem;Caddyserver;cache;HTTP/2;TLS1.3
0引言
概述通過网络进行选课是教学管理现代化、信息化的体现之一,但是选课系统又有其特殊性——每个学生都想尽快的选到自己心仪的课程,这就导致了在开始选课的前几个小时会出现短时间大量学生同时访问选课系统的情况,从而出现选课系统响应缓慢,无法加载的现象,见此情形学生们更会继续刷新导致选课系统持续高负载,形成恶性循环[1]。
北京化工大学一贯重视本科和研究生教务管理信息化建设,不断提升教务管理工作的质量和水平。学校本科教务管理系统于2004年上线运行,于2016年进行系统版本升级,研究生管理系统于2013年上线。两系统都采用B/S架构,满足学分制培养、通识教育培养模式,支持校院两级管理模式,具有培养方案管理、教学计划管理、学籍管理、排课管理、成绩管理等功能模块,涵盖了教学管理的各个环节。学生通过浏览器访问业务系统,即访问网上选课系统完成选课、课程查询、成绩查询等操作。
1现状与原因分析
北京化工大学教务管理系统架构为两台实体宿主机虚拟化为一台Linux操作系统逻辑机做负载均衡,并使用ApacheTomcat作为服务端。ApacheTomcat是一个开源的JavaServlet容器,它能很好地处理JSP动态页面,同时也自带有Connecter处理HTTP请求,但其处理静态资源时的性能与Apache等网页服务器相比较差,在高并发时尤其明显[2]。同时,当用户选课时,无论是静态的页面资源的加载,还是数据库的操作,都会非常消耗磁盘I/O的性能。结合当前机械硬盘和固态硬盘的4K性能差距,若教务管理系统服务器不是使用固态存储设备的话,磁盘极容易成为性能瓶颈[3]。因此,在选课期间的前1小时内,学生访问教务管理系统经常会出现如主页加载过长,甚至长达近1分钟、出现无原因提示登录超时导致被下线、管理端提示服务器CPU满载等问题。
2解决方案
保证教务管理系统的平稳运行,保障日常教学工作有序开展,采取在教务管理系统和客户端中间部署反向代理服务器的稳妥方案。主要优点如下:1)提高业务系统服务器安全。外网用户通过反向代理访向教务系统服务器,只能获取反向代理服务器的IP地址和端口号,无法获取业务系统服务器IP地址和端口号,且反向代理服务器上未保存任何信息资源,所有网页程序都保存在教务管理系统服务器上,对反向代理服务器的攻击并不能教育管理系统受到破坏。2)分担网络压力。在业务系统服务器前放置Nginx和Caddy反向代理服务器,在DNS服务器上映射教育网和公网IPv4、IPv6地址记录,分担访问压力,开放网络防火墙中反向代理服务器而非业务系统服务器的80、443等端口,同时反向代理服务器的缓存功能也加快了用户的访问速度。3)加快了对业务系统服务器的访问速度,实现对HTTP请求页面内容进行压缩、缓存,以及可向用户提供独立于业务系统服务器的的安全超文本传输协议HTTPS和安全传输层协议TLS,有效保证了服务器与用户之间的数据传输的保密性和完整性。
综上所述,采取分别使用Nginx和Caddy作为服务端,在教务管理系统前端部署两套反向代理服务器的方案,如图1所示。
通过DNS做负载均衡分担网络请求,从而提高服务器處理大量并发服务能力。
Nginx(“EngineX”)是俄罗斯IgorSysoev(伊戈尔·塞索耶夫)编写的一款高性能的网页和反向代理服务器。在高并发的情况下,Nginx是Apache服务器不错的替代品,它支持高达500000个并发连接数的响应,而内存、CPU等系统资源消耗却非常低,运行非常稳定。Nginx已在俄罗斯最大的门户网站RamblerMedia上运行多年,且俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。在国内,已经有新浪、豆瓣网和迅雷等多家网站使用Nginx作为网页服务器或反向代理服务器[5],Nginx、Caddy等网页服务器性能及应用这些服务器的网站百分比统计,如表1、表2所示。
Caddy是由GitHub用户MatthewHolt开发的一个开源的、使用Golang编写、支持HTTP/2的软件网页服务器。它使用Golang标准库提供HTTP功能,原生拥有了Golang的多线程高并发的特性。其显著的特性是通过集成ACME协议,从证书供应商LetsEncrypt处获取ECC算法数字证书并默认启用安全的超文本传输协议HTTPS,是第一个无
需额外配置即可提供HTTPS特性网页服务器。Caddy可以直接作为网页服务器,也可以作为反向代理和负载均衡器提供服务。使用Caddy网页服务器的网站百分比历史趋势、流行度及流量市场地位,如图2、图3所示。
Caddy网页服务器通过插件的形式实现其多数功能,并通过一个名为Caddyfile的配置文件进行配置,支持超文本传输协议HTTP/2版本及传输层加密协议TLS1.3,采用gzip压缩技术,虚拟主机可支持基于传输层UDP协议的QUIC协议,该协议正处于试验阶段,互联网工程任务组(IETF)已提议将其命名为HTTP/3版本[6]协议[7]。
尽管相比于Caddy,Nginx拥有更高的静态页面响应性能,但在北京化工大学的选课系统的优化部署中,本文更倾
向于使用易于上手,设计之初原生支持多线程,HTTP/2以及自动签发数字证书的Caddy,故下文的具体方案均基于Caddy来配置。
3性能优化
3.1主要策略
1)缓存静态资源到内存中,当用户访问页面时,可直接从内存读取文件大小不大于1MB的“小”文件,无需从硬盘读取,因内存具有极高的4K吞吐性能,故可解决磁盘瓶颈。
2)开启文件压缩程序“gzip”,节省网络带宽,缓解网络瓶颈。
3)采用HTTP/2协议,将原来HTTP/1.1用的6条TCP连接用1条TCP连接进行连接复用,减少TCP连接建立握手时的开销,避免出现队头阻塞[8]。
4)提供传输层加密协议TLS1.3的EarlyData,实现0RTT的支持[9]。
5)采用“TCPBBR”拥挤调度算法,代替Linux默认的“Cubic”算法,以增加高负载,高丢包时的TCP网络利用率[10]。
3.2具体实现
1)将DNS服务器中教务管理系统的解析记录映射到Caddy服务器的IPv4和IPv6地址上,即将Caddy服务器为教务管理系统的反向代理服务器,修改Caddy配置,利用“ip_hash”调度规则对多台教务系统Tomcat网页服务器配置负载均衡。
2)对来自http:80端口的访问请求进行HTTP303重定向到https:443端口,用以防止中间人攻击以及启用http/2协议。此处返回303状态码而不是301状态码,是保留对紧急情况出现时可平滑过渡到原有的不支持https的教务管理系统的兼容性[11]。
3)编译“http.cache”插件,添加“cache”参数,将Caddy作为缓存服务器,将图片,CSS,JS文件等静态资源都进行了缓存,有效的减少对tomcat的访问。
4)添加“gzip”参数,对网络数据进行压缩,减少不必要的网络开销。
5)添加“log”参数,对访问行为进行记录,以进行后续分析。
6)添加“keepalive”参数,减少重复建立TCP链接对上游服务器带来的负载。
7)添加“header_upstream”参数,并设置XRealIP,XForwardedFor参数为固定的反向代理服务器的IPv4地址,以保留和原不支持IPv6的教务管理系统的兼容性,防止POST选课请求时返回“未知错误”的提示。
8)添加“try_duration”参数,以提供教务管理服务器负责均衡功能。
9)编译“http.prometheus”模块,利用Prometheus和Grafana程序提供一个可视化的统计面板,用来实时监控Caddy的工作状态。
3.3应急方案
1)当出现页面访问异常时,可立即将DNS记录进行修改,将映射修改为原教务管理系统服务器IP地址。因Caddy服务器已设置303SeeOther临时重定向,当用户关闭浏览器再重新打开时,会重新访问DNS服务器对域名进行解析,将不再访问反向代理服务器而连接回教务管理系统。
2)利用supervisord守护脚本监视Caddy进程的运行情况,保证其在意外退出后能自动重启,实现出错后快速恢复的目标。
3.4模拟测试结果
本文使用压力测试工具hey对教务管理系统进行测试。参数为c1000z5mdisablekeepaliveh2(即启用http/2协议并禁止httpkeepalive,设置并发连接数为1000,持续测试5分钟),测试前通过ulimitn65536命令解除shell资源限制,代理服务器响应结果为1.09秒。当提高并发数至2000时,响应时间仅为1.52秒,两次测试得到的响应时间结果都远小于直接压力测试教务管理系统服务器的响应时间,效果较好,对比结果如表3所示。
因设置了缓存机制,返回的分组包头里会加入xcachestatus字段并记录在日志里用于分析,此字段有miss、hit、bypass及skip共4种状态。2019年12月26日至2020年1月10日正选课期间,进行小范围实战测试,通过分析日志文件access.log,如表4、图4、图5所示。
用户请求的缓存命中率高达41%。若除去由POST请求产生的Cachebypass和因uid变化造成的miss,缓存的命中率会更高。有效加快了用户的访问速度。
4总结
抗击新型冠状病毒肺炎疫情以来,北京化工大学为保障“停课不停教、不停学”,针对“本科教务管理系统”、“在线综合教育平台”和“Moodle教学平台”部署Caddy反向代理服务。2月17日为开学第一日,全校师生通过反向代理服务器访问我校教学、教务等系统的网站浏览量(PV)为:电脑端6,392,467次,同比前一日上升89%,“优慕课”APP为2,689,619次,同比前一日上升114%。15时20分,TCP连接数为9330,到达当日峰值,同比前一日上升337%,如图5所示。通过反向代理服务,有效地分流VPN服务器访问压力,保障了教学、科研、管理工作有序开展。
参考文献
[1]许雯.基于Web的选课系统的设计与性能优化[J].科技与创新,2017(16):127.
[2]JUSTUniversity.(静态资源处理)nginx比tomcat强在哪?[EB/OL].(2019June26).https://juejin.im/post/5d1301c4f265da1b7b319a82.
[3]从机械硬盘到SSD:高性能I/O之路[EB/OL].搜狐网(2016August5).http://www.sohu.com/a/109200399116463
[4]Comparisonofwebserversoftware[EB/OL].Wikipedia,(2020July27).https://en.wikipedia.org/wiki/Comparisonofwebserversoftware.
[5]张宴.实战nginx:取代Apache的高性能Web服务器[M].北京:电子工业出版社,2010.
[6]HypertextTransferProtocolVersion3(HTTP/3)[EB/OL].(2020September11).https://quicwg.org/basedrafts/draftietfquichttp.html.
[7]Caddy[EB/OL].維基百科,(2020January15).https://en.wikipedia.org/wiki/Caddy(webserver).
[8]IETFRFC7540[EB/OL].(2015May).https://tools.ietf.org/html/rfc7540.
[9]IETFRFC8446[EB/OL].(2018August).https://tools.ietf.org/html/rfc8446#section4.2.10.
[10]NealCardwell,YuchungCheng,C.StephenGunn,etal.BBR:CongestionBasedCongestionControl[J/OL].https://queue.acm.org/detail.cfm?id=3022184.
[11]HTTP303FromWikipedia,thefreeencyclopedia[EB/OL].(2020January28).https://en.wikipedia.org/wiki/HTTP303.
(收稿日期:2020.03.25)