计算机系统应用  2022, Vol. 31 Issue (4): 99-109   PDF    
基于Docker容器的快速开发网页服务器
谢兆贤, 曹香美, 王超     
曲阜师范大学 网络空间安全学院, 曲阜 273100
摘要:C/S模式是早期的开发网页服务器架构, 它使用复杂、成本高并且缺少通用性. B/S模式通过将系统功能集中到服务器中弥补了使用复杂成本高的缺点, 但是没有对用户端的环境和数据传输率进行深入测试和研究, 使得过多的外部用户访问网页, 给服务器带来压力. 针对传统C/S模式和B/S模式的局限性, 引入Docker容器化开发思路, 分别融合Nginx和Flask方法, 构建DoNginx模式与DoFlask模式, 通过修改和建立镜像实现网页服务器的开发. 这两种模式综合了Docker的轻量级、Nginx的低消耗、Flask的稳定性的优势, 实现了模式的优化. 设计CPU、完整性、吞吐量性能测试实验, 与传统B/S模式进行深度分析对比. 实验表明, DoNginx模式资源利用率高, DoFlask模式环境兼容性和可靠性更强, 且均优于传统B/S模式, 具有很好的框架设计贡献和实验性能.
关键词: Docker    Flask    Nginx    网页服务器    镜像    微服务框架    负载均衡    
Rapid Development of Web Server Based on Docker Container
HSIEH Chao-Hsien, CAO Xiang-Mei, WANG Chao     
School of Cyber Science and Engineering, Qufu Normal University, Qufu 273100, China
Abstract: The C/S mode is an early architecture for developing Web servers, which is complex, costly, and lacking in generality. The B/S mode makes up for the disadvantages of complex use and high cost by concentrating system functions in the server, but it does not conduct in-depth testing and research on the environment and data transmission rate of the user end, which brings too many external visits to the Web page and puts pressure on the server. Given the limitations of the traditional C/S mode and B/S mode, this study introduces the idea of Docker container development and integrates it with Nginx and Flask methods respectively to construct the DoNginx mode and the DoFlask mode, which develop the Web server by modifying and establishing mirror images. The two modes combine the advantages of Docker’s lightweight, Nginx’s low consumption, and Flask’s stability to realize mode optimization. The CPU, integrity, and throughput performance tests are designed to make a comprehensive comparison with traditional B/S mode. Experiments show that the DoNginx mode has a high resource utilization rate, and the DoFlask mode has stronger environmental compatibility and reliability. Both modes are superior to the traditional B/S mode in the above aspects, boasting great contributions to the framework design and good experimental performance.
Key words: Docker     Flask     Nginx     Web server     image     microservices framework     load balancing    

B/S模式是浏览器/服务器模式, 用户界面完全在浏览器中运行. 大多数通过浏览器和各种网络办公系统访问的网站都是采用B/S模式开发的. B/S模式是 “瘦客户端”, 核心功能都集中处理在服务器端, 所以需要较低的硬件配置. 但是几乎所有客户端的处理逻辑都运行在服务器端, 给服务器造成很大的压力[1].

随着云计算的快速发展, 人们开始使用容器在云与云之间快速构建软件的环境. 由于容器具备可移植性的特性, 所以容器的使用量有逐年上升的趋势. 早在2015年的时候, 仅有13%的使用者, 2018年增加29%的使用者. 从文献[2]对997名IT专业人士的调查, 有将近49%的受访者反馈曾经使用过Docker容器. 以Docker容器的市场价值来看, 2017年的时候仅为7.6亿美元[3], 目前也已经增加到27亿美元. 以此显示, 容器在云计算领域的重要性, 逐年增加当中.

Docker是直接建立在操作系统上的虚拟化技术, 它可以直接使用本地的操作系统. 然而, Docker容器不只提供轻量化的虚拟环境, 与其它的虚拟化工具相比更具优越性. 所以, 在容器的形式打包和部署应用程序渐渐成为新趋势的情况下, Docker容器已经可以在云基础架构中得到广泛的部署, 例如: Amazon EC2 Container Service, Google Container Engine, Rackspace和Docker Data Center[4].

根据云计算平台的架构, 图1实现HTML的应用, 使用容器技术部署的Web服务器, 分成3层结构. 第1层是基础设施即是服务(Infrastructure-as-a-Service, IaaS), 是云计算的最底层, 主要用来提供基础资源, IaaS中间件的解决方案主要由Amazon, VMWare和IBM[5]等大公司提供. 第2层是平台即是服务(PaaS). 显示一台物理机中, 可以安装多台不同操作系统的虚拟机, 于每个虚拟机内安装Docker容器引擎. 在Docker容器中下载特定容器镜像, 使用容器构建网页服务器以及进行数据库的管理. 第3层为软件即是服务(Software-as-a-Service, SaaS). 这是与客户连接的一层, 大多数通过网页浏览器进行接入. 在云计算平台上使用容器部署网页应用程序, 使用HTML等技术开发网页应用程序, 最后交付给客户最直接的网页浏览网址或者手机软件APP.

图 1 容器于网页应用的云计算平台

所以, 文献[6]初步提出在Docker环境下, Java Web快速搭建平台的设计理念, 为开发网页服务器提供一个新的思路. 然而, 在网页服务器的开发过程, 经常遇见产品的开发环境和客户的使用环境不尽相同. 所以, 每次面对一个新硬件环境的时候, 就需要重新安装一次. 这样, 容易发生人为操作的错误, 导致产品的开发、测试、维护成本增加的问题; 此外, 还会造成重复加载, 造成整体开发速度缓慢的问题. 为了有效地避免发生以上的问题, Docker容器做为一个轻量级的应用容器引擎, 不只可以解决环境不兼容的问题, 还可以保持操作环境的一致性, 减少重复安装环境的行为, 提升开发效率. 即便目前使用Docker容器技术应用在网页服务器的研究很多, 例如: Docker容器应用于Web边缘设备服务的部署[7]、Web应用自动缩放的功能[8]和网页服务器的负载均衡[9]等. 但是, 尚未有对于Docker容器于网页服务器开发模式的研究. 所以, 本文将以Docker容器为基础, 分别结合Nginx技术和Flask技术, 建立有效开发网页服务器的模式.

总之, 本文针对传统B/S模式部署的网页服务器进行研究, 主要的贡献有以下3点. (1)提出DoNginx和DoFlask两种新的部署网页服务器模式, 以Docker容器为基础, 应用于云平台开发网页服务器的方案. (2)分析这两种模式与传统的模式的区别, 测试CPU占用率、产品交付完整性和数据吞吐量3种性能. 得出以Docker容器开发的网页服务器, 更具高效性和完整性. (3)实现网页开发的标准化和流程化, 提升轻量级网页服务器的开发效率.

文章结构上, 引言说明服务器的使用和背景, 分析目前开发网页服务器存在的问题, 介绍虚拟化技术, 其余的说明如下. 在第1节, 介绍网页服务器相关的研究工作. 第2节讲述B/S、DoNginx和DoFlask等3种开发网页服务器的模式. 第3节, 对这3种模式的性能进行分析和比较. 最后的结束语, 总结本文以及未来的研究方向.

1 相关工作 1.1 国内外研究近况

文献[7]提出一种基于Web服务部署的方法, 为了解决Docker API使用困难的问题, 研究更加抽象的HTTP API, 用于部署、更新、终止边缘设备上的容器.

从文献[8]可得, 人们为了满足Web高效率的需求, 会购买大量服务器或是高阶服务器进行简单的工作, 过度高效的硬件容易造成资源的浪费, 低配置的硬件将无法满足高度流量的环境. 所以, 提出混合云无限缩放Web应用的构思, 设计一个基于Docker容器的混合云平台, 实现Web应用的自动扩展, 进行容器部署和具备自动缩放特性的应用程序.

文献[10]中提到, Nginx是具备开源、轻量级、和高性能特性的服务器, 由于它的高性能和易于扩展的优点, 近年来受到开发人员的欢迎, 并且应用广泛. 通过Nginx和HTTP的处理流程, 得以动态地调整服务器的权重, 取得较佳的服务器性能.

文献[11]对Nginx的体系模块、框架结构的内部架构和实现的原理进行研究. 使用C++语言, 对Nginx的源码进行封装和扩展.

文献[12]验证Docker镜像在Python语言环境下运行的可行性, 将一台虚拟机上的Python文件打包成镜像, 上传到云平台. 然后, 在另一台虚拟机中拉取镜像, 完成两台虚拟机之间软件的交付. 这种做法, 为本文使用的Flask技术奠定基础, 因为Flask技术是基于Python的Web开发技术, 可以快速建立可交付部署的网页平台.

文献[13]说明FTP服务器上传和下载文件的功能, 同时设计与实现FTP的远程管理系统. 最终, 通过FTP远程管理系统实现FTP服务器, 缩短传输数据和提交数据的时间. 它不仅使普通客户和管理员不再记录复杂的FTP命令, 而且大大减少管理员的工作量, 提高工作效率.

1.2 符号定义

本文中涉及到的符号与意义, 见表1.

表 1 符号表

2 系统架构和模式

首先介绍FTP工具在物理机和虚拟机之间传输信息的流程, 然后介绍Docker容器的框架. 最后, 分别提出3种模式的设计与实现.

2.1 系统架构 2.1.1 FTP传输原理

FTP协议是一个在计算机网络上, 能够对用户端和服务器之间进行文件传输的应用层协议. 同时, FTP服务器进程可以为多个用户端的进程提供服务. 当FTP用户端连接FTP服务器, 遵循FTP的协议与服务器传送文件, 完成上传下载文件任务[14].

通过FTP工具与虚拟平台之间进行通信. 在虚拟的环境中, 将文件复制到Docker容器下, 实现Nginx与HTML和Flask与HTML的交互通讯, 使Nginx和Flask可以执行HTML、JavaScript和CSS文件. 此时, 在虚拟机中的Docker, 便可以拉取Nginx镜像与创建Flask镜像, 分别将Nginx和Flask下的镜像配置文件进行部署与执行. FTP工具与Docker的关系, 如图2所示.

图 2 FTP传输文件关系

2.1.2 Docker架构

图3的Docker网页服务器架构, 显示Nginx技术和Flask技术的关系, 组成说明如下:

(1) Docker client:Docker的用户端, 是操作命令的终端. 可以在主机直接执行Docker命令, 在用户端同时与多个Docker的守护程序通信.

(2)Docker daemon:守护Docker的进程, 监听 Docker API的请求与管理Docker的对象, 例如: 镜像、容器、网络、和卷. 守护程序还可以与其它的守护程序通信, 进行管理Docker的服务.

(3)Docker image: Docker的镜像, 是一个只读文件, 用来创建运行容器. 一个镜像可以创建很多个容器, 以Dockerfile 文件指令集创建Docker镜像. 镜像包含Ubuntu、Nginx、MySQL和PHP等官方镜像, 也包括自创建镜像文件.

(4) Docker container:Docker容器, 负责应用程序的运行. 容器独立运行一个或一组应用或服务, 每个容器之间各自独立, 容器的开启、停止、和删除, 与其它容器无关. 启动镜像后生成的容器, 会自动生成容器ID和名称, 也可以自行命名容器的名称.

(5)Docker registry:Docker的仓库, 集中存放镜像文件的场所. 仓库分为公开仓库(public)和私有仓库(private)两种形式, 仓库内存放的每个镜像文件, 都有不同的标签. 在Docker Hub官网上创建的Docker账户, 容许新创建的镜像到官网, 实现镜像再利用.

图 3 Docker架构图

2.2 系统模式

本节对DoNginx模式和DoFlask模式分别设计运行序列图, 以及运行时间优化算法, 与传统B/S模式作对比, 对网页服务器进行设计与实现.

2.2.1 传统B/S模式

B/S模式即浏览器(browser)和服务器(server)架构模式, 是对C/S模式的改进架构模式. 用户端界面是通过浏览器来实现, 极少事务逻辑在前端实现, 主要事务逻辑在服务器端实现. 这种模式将实现系统功能的主要工作集中到服务器上, 具有无需安装用户端、易于在Web上发布信息和易于扩展等优点[15]. 同时, 简化了系统的开发、维护和使用.

图4显示B/S模式构建网页服务器的运行序列关系, 包含用户端界面、控制机制、服务器和数据库. 用户端界面即浏览器, 负责显示结果, 是用户操作系统的接口. 控制机制即中间件, 运行在浏览器和服务器之间, 负责传递信息. 服务器负责与数据库进行连接, 提供数据服务, 通过数据库返回结果.

图 4 B/S运行序列图

序列图显示开发过程, 有以下3个步骤.

首先, 开发人员通过过程①创建命令, 生成静态网页, 在用户端界面显示. 用户通过用户端界面通过过程②向服务器端发出请求, 由控制机制接收, 再通过过程③传送给服务器.

然后, 服务器接收请求命令, 通过过程④与数据库进行连接, 对数据进行存取等操作. 数据库使用过程⑤将结果反馈到控制机制, 控制机制将通过过程⑥结果继续反馈给用户端界面.

最后, 用户端界面将返回来的结果进行处理, 可以将系统的逻辑功能更好地展示出来, 再通过过程⑦显示界面.

通过式(1)计算编译运行代码文件的时间, 式(2)计算构建网页并运行的全部时间.

$ {T_{\rm{file}}}{\text{ = }}\sum\nolimits_{{{i = }}1}^{{n}} {W_{{i}}} $ (1)
$ T = {T_{\rm return}} - {T_{\rm begin}} = {T_{\rm run}} + {T_{\rm file}} $ (2)

B/S模式构建网页服务器的时间函数BSOpTime(n, T), 算法如算法1.

算法1. BSOpTime

输入:n.

输出: T.

Tbegin=clock();

for i=1 to n

   Tfile+=Wi;

Send Web to user;

Treturn=clock();

T=TreturnTbegin;

return T;

end

2.2.2 DoNginx模式

Nginx是一款高性能和轻量级的Web服务器. 它依据全新的服务器开发模型, 采用事件驱动架构处理请求, 不只可以隐藏自己的IP地址, 性能优异且占据内存小, 整体运行效率远超过传统的Apache和Tomcat[10]. 在虚拟平台, 使用Docker和Nginx技术开发Web服务器, 称之DoNginx模式.

图5显示DoNginx的运行序列关系, 包含客户所在的物理机、虚拟平台、Docker Hub、Nginx容器、FTP工具和管理平台等6个会话. 开发人员需要先创建开发项目代码, FTP工具负责将开发过程中的代码文件传到虚拟平台, 管理平台负责执行代码文件. 序列图显示的开发过程, 依序有以下3个步骤.

图 5 DoNginx运行序列图

首先, 开发人员通过过程①启动虚拟平台, 然后通过流程②向Docker Hub请求拉取Nginx镜像, 使用⑧返回拉取结果, 若拉取成功会返回成功结果, 如果失败返回失败信息. 接下来使用过程③启动镜像生成容器并命名, 若启动成功执行过程⑦返回容器ID, 若失败返回错误信息.

然后, 使用IP地址连接FTP工具, 进行过程④, FTP工具对密钥进行检测. 连接成功后, 选择要执行的代码文件上传到虚拟机, 记作VM. 然后查看上传的结果, 若上传成功, 则在虚拟机中查看文件信息; 若失败, 则返回错误的信息. 过程⑥会从虚拟机中复制开发人员上传的n个文件到Nginx容器内部指定的文件, 形成代码文件集F={F1, F2, …, Fn}.

最后, 过程⑤使用管理平台设置虚拟开发环境, 执行代码文件集F. 打开网页浏览器访问Nginx容器内部网页配置代码文件F, 成功出现需要开发的网页. 使用过程⑩返回给虚拟平台反馈信息, 然后物理机中通过过程⑨访问构建的网页.

通过式(3)得到上传文件到虚拟机的时间以及将所有文件复制到Nginx镜像的全部时间. 同时, 式(4)可以得出Nginx镜像运行的时间与构建网页时间的和. 加入拉取镜像的时间后, 可以取得全部的计算时间, 如式(5).

$ {T_{\rm file}}{\text{ = }}{T_{\rm upload}}{\text{ + }}\sum\nolimits_{i = 1}^{{n}} {{{F_i}}} $ (3)
$ {T_{\rm run}} = {T_{\rm Nginx}} + {T_{\rm web}} $ (4)
$ T = {T_{\rm return}} - {T_{\rm begin}} = {T_{\rm pull}} + {T_{\rm run}} + {T_{\rm file}} $ (5)

DoNginx模式构建网页服务器的时间函数DoNginxOpTime(n, T), 算法如算法2.

算法2. DoNginxOpTime

输入: n.

输出: T.

Tbegin = clock();

Send file.html + file.css + file.js to VM;

Tfile = Tupload;

Send file.html + file.css + file.js to Docker.Nginx;

for i = 1 to n

   Tfile += Fi;

Trun = run Nginx.image + Web;

Send Web to user;

Treturn = clock();

T1 = TreturnTbegin;

if T1 == Tpull + Trun + Tfile;

  return T= T1;

end

2.2.3 DoFlask模式

此模式是结合Docker和Flask技术, 开发网页服务器. 目前采用Python开发网页项目的主流框架, 包括Django和Flask. Django框架是广泛而全面; Flask框架偏向轻量级、简洁和灵活, 主要面向一些功能简单、需求简单和项目周期比较短的轻应用.

开发人员在Docker内, 创建Flask镜像, 如图6的DoFlask运行序列图, 呈现开发网页的序列流程关系. 它包含服务器、用户端、Docker Hub、虚拟平台以及管理平台. 在虚拟平台中, 开发人员需要先创建开发项目代码, 管理平台负责执行代码文件. 两者不同的地方是, Nginx需要虚拟平台从Docker Hub拉取镜像, Flask则需要服务器的虚拟平台自行创建镜像, 然后上传到Docker Hub, 再使用用户端虚拟平台拉取镜像. 如图6的服务器做为开发端服务器, 负责创建镜像, 用户端的虚拟平台负责测试结果.

图 6 DoFlask运行序列图

依照序列图显示, 整体的开发过程, 有以下4个步骤.

首先, 开发人员通过过程①创建镜像文件, 创建Python文件、requirements文件和Dockerfile文件. requirements文件用于记录所有依赖包及其精确的版本号, 以便新环境的部署. 然后, 导出打包项目, 依赖不同环境的依赖包和环境包, 以便后续迁移项目的使用. 在通过Dockerfile文件, 便可以自动创建镜像或自行定义创建. 然后, 启动开发端服务器, 在虚拟平台中通过②和⑦安装Python环境和Flask软件包. 若是安装成功, 则返回成功信息; 若失败, 则返回错误信息.

其次, 使用过程⑧创建Web包镜像, 即把过程①创建的文件打包, 使用如下命令.

$ sudo docker build <DockerfilePath> -t <ImageName> [:TAG]

当使用⑭检查创建结果, 若创建成功, 则返回成功信息. 使用过程③登录Docker Hub账户, 输入用户名密码, 进行检测. 通过过程⑨将镜像文件上传到Docker Hub中的仓库, 使用过程⑮返回上传结果, 若上传成功, 则在Docker Hub仓库中可以找到此镜像.

第三, 在用户端中使用过程④拉取上传到Docker Hub仓库的镜像, 并且使用过程⑩返回拉取结果. 通过过程⑤, 启动拉取成功的镜像; 使用过程⑥, 返回启动的容器ID.

最后, 在管理平台中, 通过过程⑪访问启动的Flask容器, 查看内部的Web配置文件. 使用IP地址访问浏览器, 从过程⑫返回访问结果.

式(6)得出上传镜像和拉取镜像的全部时间, 从式(7)可以计算全部的时间. 然而, 式(8)是运行Flask镜像时间与构建网页时间的和.

$ {T_{\rm file}} = {T_{\rm push}} + {T_{\rm pull}} $ (6)
$ T = {T_{\rm return}} - {T_{\rm begin}} = {T_{\rm run}} + {T_{\rm build}} + {T_{\rm file}} $ (7)
$ {T_{\rm run}} = {T_{\rm Flask}} + {T_{\rm web}} $ (8)

DoFlask模式构建网页服务器的时间函数DoFlaskOpTime(n, T), 算法如算法3.

算法3. DoFlaskOpTime

输入: n.

输出: T.

Tbegin = clock();

Server:

 Build image in Docker.Flask;

  Tpush = send image to Docker Hub;

User:

  Tpull = pull image in Docker Hub;

  Trun = run Flask.image + Flask.Web;

 Send Web to user;

  Treturn = clock();

  T1 = TreturnTbegin;

 if T1 == Tbuild + Trun + Tfile;

  return T = T1;

 end

2.3 数据库管理

图7的数据库管理运行序列关系, 包含虚拟平台、管理平台、Docker Hub和Docker 容器. 在虚拟平台的阶段, 使用Docker和phpmyadmin技术管理数据库. 开发人员需要先拉取镜像, FTP工具负责将开发过程中的代码文件传到虚拟平台, 管理平台则负责设置虚拟开发环境. 总之, 图7的序列图显示开发过程, 总结以下3个步骤.

首先, 开发人员通过过程①启动虚拟平台, 然后通过流程②向Docker Hub请求分别拉取MySQL、PHP、phpmyadmin镜像. 使用过程⑥返回拉取的结果, 若是拉取成功则会返回成功结果; 反之, 则返回失败信息. 接下来使用过程③run命令启动3种镜像, 分别生成各自的容器并命名. 若是启动成功, 则执行过程⑤, 返回容器ID; 若失败, 则返回错误信息.

然后, 使用IP地址访问phpmyadmin浏览器网页. 进行过程④, 管理平台对输入的用户名密码进行检测. 若是检测成功, 则登录到数据库. 使用网页版数据库管理工具对数据库进行操作, 并使用过程⑦, 返回结果; 若失败, 则返回错误信息.

最后, 通过SQL语句对数据库进行操作, 使用过程⑧, 反馈信息给虚拟平台, 让物理机可以直接访问数据库网页.

图 7 数据库管理运行序列图

式(9)计算拉取全部镜像的时间, 式(10)计算启动全部镜像与构建网页时间的和. 式(9)加式(10)加编译SQL语句时间为总时间, 如式(11).

$ {T_{\rm pull}} = \sum\nolimits_{i = 1}^n {{P_i}} $ (9)
$ {T_{\rm run}} = \sum\nolimits_{i = 1}^n {{P_i} + {T_{\rm web}}} $ (10)
$ T = {T_{\rm return}} - {T_{\rm begin}} = {T_{\rm pull}} + {T_{\rm run}} + {T_{\rm sql}} $ (11)

连接静态网页服务器和数据库的时间函数DBMOpTime(n, T), 算法如算法4.

算法4. DBMOPTime

输入: n.

输出: T.

Tbegin = clock();

for i = 1 to n

  Tpull += Pi;

  Trun += Pi;

  Trun = Trun + Tweb;

 Send Web to user;

  Treturn = clock();

  T1 = TreturnTbegin;

 if T1 == Tpull + Trun + Tsql

  return T = T1;

end

3 实验结果与分析

本节通过搭建Windows和虚拟机环境的实验场景, 设计了测试CPU、完整性、吞吐量的实验. 实验的配置环境的物理机操作系统为Windows 10, 64-bit X86系统. 物理机的处理器为Intel(R) Core(TM)i5-8265U CPU 1.60 GHz, 内存为8192 MB RAM, 硬盘为高速固态硬盘, 512 GB. 实验用的虚拟机操作系统为Ubuntu 16.04 LTS, 包括1个CPU和20 GB内存. 内设的实验软件环境, 如表2.

3.1 实验结果

通过传统B/S、DoNginnx和DoFlask三种模式, 对开发Web应用程序的过程进行实验, 以Google的cadvisor技术监控容器. 检测的过程, 针对CPU的占用情况、产品交付的完整性和服务器的吞吐量, 得到下面的结果.

3.1.1 CPU测试

图8显示CPU测试的结果, 观察各种方法在CPU的占用率. 依序图8(a)为传统B/S模式的CPU占用率, DoNginx模式CPU占用率为图8(b), 以及图8(c)的DoFlask模式CPU占用率. 图上显示, 传统方法的CPU占用率逐渐上升后趋于平稳. 其次, DoNginx模式的CPU虽然起伏不定, 但是占用率为最低. 最后, DoFlask模式在实验初期消耗大量CPU, 后期逐渐下降并趋于平稳. 这几个实验横轴均为4T, 每个T为30 s. 依照式(12)得出图8的平均值, 依序分别为56%, 24%, 和43%. 由此可知, DoNginx模式占用的CPU最低, 而B/S模式的占用率最高, 消耗的资源最多.

图 8 各种方法的CPU占用率

$ \overline X = \frac{{\displaystyle\sum\nolimits_{i = 1}^n {{X_i}} }}{n} $ (12)
表 2 实验软件及版本说明

3.1.2 吞吐量测试

图9为吞吐量的测试分析图, 显示各种方法的数据吞吐量. 依图9(a)–图9(c)的顺序显示, 传统B/S模式、DoNginx模式和DoFlask模式的吞吐量. 由此可知, 传统方法的吞吐量在2.5 Mb/s与7.5 Mb/s之间, 其次, DoNginx模式的吞吐量在中间部分逐渐上升后又稍微下降并趋于平稳. 然而, DoFlask模式的吞吐量起伏不定, 却始终高于5 Mb/s. 依照式(12)可以得出平均值, 依序为4.8 Mb/s、3.8 Mb/s和4.2 Mb/s. 故此, 结论是B/S模式数据吞吐量最大, 传输数据效率最快, 而DoNginx模式数据吞吐量最少.

3.1.3 产品交付完整性测试

测试的过程, 主要经过两个步骤: (1)在服务器部署Web应用程序, 完成后传输到用户端. (2)在用户端, 对Web应用程序进行检测.

在进行30个产品的传输后, 发现环境不兼容导致的错误有模块错位、数据消失以及样式出错等. 图10是测试后得出的结果, 传统B/S模式开发的产品, 传输到与开发环境不同的用户端后, 70%会出现以上错误, 需要开发人员继续进行维护. 而且出错率不稳定, 难以预测结果. 以DoNginx模式开发的产品, 传输到不同环境用户端后, 20%会出现错误. 使用DoFlask开发的产品, 出错率仅为5%, 并且数据保持稳定, 可以对未来的实验结果进行推测.

总结实验测试的结果. 首先, 使用DoNginx技术的CPU占用率最低、效率高、内存占用较少和产品交付的出错率较低; 其次, 使用DoFlask技术对CPU的占用率较低、占用内存最少, 并且具有环境兼容性, 大大提高产品交付的稳定性; 最后, 传统的B/S模式对CPU占用率最高、占用的内存最多和产品交付的出错率最高.

图 9 各种方法的吞吐量

图 10 各种方法的完整性测试

3.2 实验分析

本节对3种模式性能测试实验结果进行分析.

(1) 分析CPU占用率. 第一, 使用DoNginx设计方案得到的产品运行速率快、数据传输效率高、在浏览器调试代码方便、开发效率高且CPU占用率低. 第二, 使用DoFlask的设计方案使产品可靠性与稳定性, 大幅提高; 通过可以打包生成镜像的技术, 提高产品重复利用率. 第三, 经过大量验证性实验得到的数据知道, 使用Docker轻量级容器技术, 将会比使用传统B/S技术节约20%左右的CPU利用率, 平均减少50%的内存使用量.

综合以上分析, 图11显示系统每Ts (实验设置为30 s)收集CPU的利用率, 以及这3种模式在不同阶段的比较.

图11的0–T时间段部分, 可以看出此时DoFlask占用CPU最多. 然而, 传统B/S模式占用的CPU利用率比较少, 这是因为此时处于修改代码的状态; 2T–4T时间段是处于程序执行的状态. 在T–2T时间段的部分, 可以发现DoNginx和DoFlask都达到最大值, 因为这两种方案都处于执行的状态, 消耗资源最大. 然而, 在2T–3T的时间段, DoFlask处于创建镜像的状态, 无需消耗大量的资源. 3T–4T的时间段内, 在另一台服务器的DoFlask, 处于拉取镜像和执行程序的状态, 此时消耗资源较多. 所以, 可以得知无论在哪一阶段, DoNginx都是CPU占用率最低的技术, DoFlask紧随其后.

图 11 CPU占用率比较图

(2) 分析数据吞吐量. 经由图12的吞吐量比较图乃是以每一个T s (30 s)为单位, 收集数据传输吞吐量后分析, 有以下两点. 第一, 传统B/S模式部署网页的优点是传输数据速度快, 数据吞吐量大, 并且较为平稳. 第二, DoNginx和DoFlask技术在前期的数据传输量小, 后期逐渐增加, 这是因为T–3T时间段任务是拉取和生成镜像; 3T–4T时间段任务是执行程序.

图 12 数据吞吐量比较图

(3) 分析交付完整性. 使用DoFlask模式创建网页, 将开发网页服务器的文件打包生成镜像, 然后上传到云空间, 可以在其它服务器下载并启动此镜像. 这种方法完美的解决环境不兼容的问题, 保证交付产品的完整性. 所以DoFlask模式交付完整性最高.

根据以上的3点分析, 归纳内容如表3. 它显示各个系统模式的性能测试结果.

表 3 各模式的性能测试表

(4) 分析变异数状态. 根据收集的数据, 式(13)得出标准差, 使用式(14)得出变异数. 从变异数变异的程度, 可以看出3种模式彼此之间的不同.

$ \sigma {\text{ = }}\sqrt {\frac{{\displaystyle\sum\nolimits_{i = 1}^n {({X_i} - \overline X )} }}{N}} $ (13)
$ {{Var}} ({{x}}){{ = }}\frac{\sigma }{{\overline {{X}} }} $ (14)

总结得出表4, 发现CPU的变异程度大于完整性测试, 完整性测试大于数据吞吐量. B/S模式的CPU占用率和吞吐量的变异程度较高, 完整性测试变异程度最高. DoNginx模式的CPU占用率变异程度最高, 吞吐量和完整性测试变异程度较低. DoFlask模式的CPU占用率和完整性测试变异程度最低, 吞吐量变异程度较高. 所以, B/S模式总体变异数最大也最不稳定; DoNginx模式变异数较低, 较为稳定; DoFlask模式变异数最低, 最为稳定.

综合B/S模式、DoNginx和DoFlask模式建构的网页服务器过程, 分析测试的性能后得出结论: 利用DoFlask模式建构网页服务器比传统B/S模式和DoNginx下的建构交付完整性提高20%–65%个级别, CPU占用率较低, 并且缩小内存占用量, 明显具备开发上的优势.

表 4 CPU和吞吐量的变异数状态

4 结论与展望

针对现有的B/S模式开发网页服务器存在数据传输慢、资源占用大且不兼容的缺点, 提出了新型的Docker技术分别结合Nginx和Flask的模型. 对3种开发模型进行研究和测试, 根据3种模式在开发性能和兼容性的不同, 推断出最适合开发网页的模式为DoFlask模式, 为开发人员和运维人员节省大量开发交付与等待的时间, 降低产品环境更新过程中可能的出错率. 此外, 服务器虚拟化技术打破单应用单服务器的传统部署模式, 提高硬件资源的利用率, 简化服务器的运维管理工作, 从而降低管理费用.

无论用DoNginx或者DoFlask结合数据库技术, 都可以快速地搭建Web系统. 对于一般的初学者而言, 需要了解和掌握全部的技术, 还是需要一定的时间学习和探索. 未来可以结合这两种技术, 提供即便没有开发经验的初学者, 只要填入需求, 依照发展的新算法, 便能够自动推荐并且直接生成基本网页的系统.

参考文献
[1]
Zhang SJ. Development and forecast analysis of english network teaching aid platform under B/S technology framework. 2020 12th International Conference on Measuring Technology and Mechatronics Automation (ICMTMA). Phuket: IEEE, 2020. 68–71.
[2]
Elliott D, Otero C, Ridley M, et al. A cloud-agnostic container orchestrator for improving interoperability. 2018 IEEE 11th International Conference on Cloud Computing (CLOUD). San Francisco: IEEE, 2018. 958–961.
[3]
Sultan S, Ahmad I, Dimitriou T. Container security: Issues, challenges, and the road ahead. IEEE Access, 2019, 7: 52976-52996. DOI:10.1109/ACCESS.2019.2911732
[4]
陈雁, 黄嘉鑫. 基于Kubernetes应用的弹性伸缩策略. 计算机系统应用, 2019, 28(10): 213-218. DOI:10.15888/j.cnki.csa.007106
[5]
Kozlovszky M, Törőcsik M, Schubert T, et al. IaaS type cloud infrastructure assessment and monitoring. 2013 36th International Convention on Information and Communication Technology, Electronics and Microelectronics (MIPRO). Opatija: IEEE, 2013. 249–252.
[6]
税正威. 基于Docker的Java Web快速开发部署平台的设计与实现[硕士学位论文]. 北京: 北京邮电大学, 2018.
[7]
Ha JH, Kim J, Park H, et al. A Web-based service deployment method to edge devices in smart factory exploiting docker. 2017 International Conference on Information and Communication Technology Convergence (ICTC). Jeju: IEEE, 2017. 708–710.
[8]
Li YC, Xia YM. Auto-scaling web applications in hybrid cloud based on docker. 2016 5th International Conference on Computer Science and Network Technology (ICCSNT). Changchun: IEEE, 2016. 75–79.
[9]
Bella MRM, Data M, Yahya W. Web server load balancing based on memory utilization using docker swarm. 2018 International Conference on Sustainable Information Engineering and Technology (SIET). Malang: IEEE, 2018. 220–223.
[10]
Qin E, Wang YL, Yuan LP, et al. Research on Nginx dynamic load balancing algorithm. 2020 12th International Conference on Measuring Technology and Mechatronics Automation (ICMTMA). Phuket: IEEE, 2020. 620–624.
[11]
戴伟. 基于Nginx高性能Web服务器的理论研究与性能改进[硕士学位论文]. 南京: 南京邮电大学, 2019.
[12]
张延冬, 邢艳芳. 基于Docker的运维平台设计. 计算机时代, 2018(4): 16-18, 22.
[13]
Li P, Zhang XZ. The design and implementation of Web-based FTP remote management system. 2012 Second International Conference on Business Computing and Global Informatization. Shanghai: IEEE, 2012. 774–777.
[14]
Bin C. Formalized description and analysis of FTP on petri net. 2015 International Conference on Intelligent Information Hiding and Multimedia Signal Processing (IIH-MSP). Adelaide: IEEE, 2015. 176–179.
[15]
Xie JH, Liu ZY. Based on C/S and B/S mixed mode telephone marketing system. 2012 International Conference on Industrial Control and Electronics Engineering. Xi’an: IEEE, 2012. 874–876.