您现于de位置乃:亚博 > APP学习

亚博 2020-02-03 APP学习 48

APP常见de运行模式

关于APP目前比较常见de5大运行模式:

1)CGI(通用网关接口/ Common Gateway Interface)

2)FastCGI(常驻型CGI / Long-Live CGI)

3)CLI(命令行运行 / Command Line Interface)

4)Web模块模式(Apache等Web服务器运行de模式)

5)ISAPI(Internet Server Application Program Interface)

备注:于APP5.3以后 APP不再有ISAPI模式 安装后也不再有app5isapi.dll这个文件.要于IIS6上使用高版本APP 必须安装FastCGI 扩展 然后使IIS6支持FastCGI.

1.1 CGI模式

CGI即通用网关接口(Common Gateway Interface) 它乃1段程序 通俗de讲CGI就象乃1座桥 把网页和Web服务器中de执行程序连接起来 它把HTML接收de指令传递给服务器de执行程序 再把服务器执行程序de结果返还给HTML页.CGI de跨平台性能极佳 几乎可以于任何操作系统上实现.CGI已经乃比较老de模式了 这几年都很少用了.

每有1个用户请求 都会先要创建CGIde子进程 然后处理请求 处理完后结束这个子进程 这就乃Fork-And-Execute模式. 当用户请求数量非常多时 会大量挤占系统de资源如内存 CPU时间等 造成效能低下.所以用CGI方式de服务器有多少连接请求就会有多少CGI子进程 子进程反复加载乃CGI性能低下de主要原因. 

如果不想把 APP 嵌入到服务器端软件(如 Apache)作为1个模块安装de话 可以选择以 CGI de模式安装.或者把 APP 用于不同de CGI 封装以便为代码创建安全de chroot 和 setuid 环境.这样每个客户机请求1个APP文件 Web服务器就调用app.exe(win下乃app.exe,linux乃app)去解释这个文件 然后再把解释de结果以网页de形式返回给客户机. 这种安装方式通常会把 APP de可执行文件安装到 web 服务器de cgi-bin 目录.CERT 建议书 CA-96.11 建议不要把任何de解释器放到 cgi-bin 目录. 这种方式de好处乃把Web Server和具体de程序处理独立开来 结构清晰 可控性强 同时缺点就乃如果于高访问需求de情况下 CGIde进程Fork就会成为很大de服务器负担 想 象1下数百个并发请求导致服务器Fork出数百个进程就明白了.这也乃为什么CGI1直背负性能低下 高资源消耗de恶名de原因.

1.2 FastCGI模式

FastCGI乃CGIde升级版本 FastCGI像乃1个常驻 (long-live)型de CGI 它可以1直执行着 只要激活后 不会每次都要花费时间去 Fork 1次 (这乃 CGI 最为人诟病de fork-and-execute 模式).

FastCGI乃1个可伸缩地 高速地于HTTP server和动态脚本语言间通信de接口.多数流行deHTTP server都支持FastCGI 包括Apache Nginx和lighttpd等 同时 FastCGI也被许多脚本语言所支持 其中就有APP.

FastCGI接口方式采用C/S结构 可以将HTTP服务器和脚本解析服务器分开 同时于脚本解析服务器上启动1个或者多个脚本解析守护进程.当HTTP服务器每次遇到动态程序时 可以将其直接交付给FastCGI进程来执行 然后将得到de结果返回给浏览器.这种方式可以让HTTP服务器专1地处理静态请求或者将动态脚本服务器de结果返回给客户端 这于很大程度上提高了整个应用系统de性能.

【原理】

1)Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);

2)FastCGI进程管理器自身初始化 启动多个CGI解释器进程 (可见多个app-cgi.exe或app-cig)并等待来自Web Serverde连接;

3)当客户端请求到达Web Server时 FastCGI进程管理器选择并连接到1个CGI解释器.Web server将CGI环境变量和标准输入发送到FastCGI子进程app-cgi;

4)FastCGI子进程完成处理后将标准输出和错误信息从同1连接返回Web Server.当FastCGI子进程关闭连接时 请求便告处理完成.FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行于 WebServer中)de下1个连接.于正常deCGI模式中 app-cgi.exe于此便退出了.

于CGI模式中 您可以想象 CGI通常有多慢.每1个Web请求APP都必须重新解析app.ini 重新载入全部dll扩展并重初始化全部数据结构.使用FastCGI 所有这些都只于进程启动时发生1次.1个额外de好处乃 持续数据库连接(Persistent database connection)可以工作.

备注:APPdeFastCGI进程管理器乃APP-FPM(APP-FastCGI Process Manager)

【优点】

1)从稳定性上看 FastCGI乃以独立de进程池来运行CGI 单独1个进程死掉 系统可以很轻易de丢弃 然后重新分配新de进程来运行逻辑;

2)从安全性上看 FastCGI支持分布式运算.FastCGI和宿主deServer完全独立 FastCGI怎么down也不会把Server搞垮;

3)从性能上看 FastCGI把动态逻辑de处理从Server中分离出来 大负荷deIO处理还乃留给宿主Server 这样宿主Server可以1心1意作IO 对于1个普通de动态网页来说, 逻辑处理可能只有1小部分 大量de乃图片等静态.

【缺点】

说完了好处 也来说说缺点.从我de实际使用来看 用FastCGI模式更适合生产环境de服务器.但对于开发用机器来说就不太合适.因为当使用 Zend Studio调试程序时 由于 FastCGI会认为 APP进程超时 从而于页面返回 500错误.这1点让人非常恼火 所以我于开发机器上还乃换回了 ISAPI模式.对某些服务器de新版本支持不好 对分布式负载均衡没要求de模块化安装乃否乃更好de选择.目前deFastCGI和Server沟通还不够智能 1个FastCGI进程如果执行时间过长会被当成乃死进程杀掉重起 这样于处理长时间任务de时候很麻烦 这样做也使得FastCGI无法允许联机调试.因为乃多进程 所以比CGI多线程消耗更多de服务器内存 APP-CGI解释器每进程消耗7至25兆内存 将这个数字乘以50或100就乃很大de内存数. 

1.3 CLI模式

APP-CLI乃APP Command Line Interfacede简称 如同它名字de意思 就乃APP于命令行运行de接口 区别于于Web服务器上运行deAPP环境(APP-CGI ISAPI等). 也就乃说 APP不单可以写前台网页 它还可以用来写后台de程序. APPdeCLI Shell脚本适用于所有deAPP优势 使创建要么支持脚本或系统甚至与GUI应用程序de服务端 于Windows和Linux下都乃支持APP-CLI模式de. 

【优点】

1)使用多进程 子进程结束以后 内核会负责回收资源;

2)使用多进程 子进程异常退出不会导致整个进程Thread退出 父进程还有机会重建流程;

3)1个常驻主进程 只负责任务分发 逻辑更清楚.

我们于Linux下经常使用"app –m"查找APP安装4切├┱咕湍薃PP命令行运行模式;有兴趣de同学可以输入"app –h"去深入研究该运行模式. 

1.4 模块模式

模块模式乃以mod_app5模块de形式集成 此时mod_app5模块de作用乃接收Apache传递过来deAPP文件请求 并处理这些请求 然后将处理后de结果返回给Apache.如果我们于Apache启动前于其配置文件中配置好了APP模块

(mod_app5) APP模块通过注册apache2deap_hook_post_config挂钩 于Apache启动de时候启动4?橐越邮蹵PP文件de请求. 

除了这种启动时de加载方式 Apachede模块可以于运行de时候动态装载 这意味着对服务器可以进行功能扩展而不需要重新对源代码进行编译 甚至根本不需要停止服务器.我们所需要做de仅仅乃给服务器发送信号HUP或者AP_SIG_GRACEFUL通知服务器重新载入模块.但乃于动态加载之前 我们需要将模块编译成为动态链接库.此时de动态加载就乃加载动态链接库. Apache中对动态链接库de处理乃通过模块mod_so来完成de 因此mod_so模块不能被动态加载 它只能被静态编译进Apachede核心.这意味着它乃随着Apache1起启动de. 

Apache乃如何加载模块de呢?我们以前面提到demod_app5模块为例.首先我们需要于Apachede配置文件httpd.conf中添加1行:

LoadModule app5_module modules/mod_app5.so

该运行模式乃我们以前于windows环境下使用apache服务器经常使用de 而于模块化(DLL)中 APP乃与Web服务器1起启动并运行de.(它乃apache于CGIde基础上进行de1种扩展 加快APPde运行效率).这里我们使用了LoadModule命令 该命令de第1个参数4?閐e名称 名称可以于模块实现de源码中找到.第2个选项乃该模块所处de路径.如果需要于服务器运行时加载模块 可以通过发送信号HUP或者AP_SIG_GRACEFUL给服务器 1旦接受到该信号 Apache将重新装载模块 而不需要重新启动服务器. 

1.5 ISAPI模式

ISAPI(Internet Server Application Program Interface)乃微软提供de1套面向Internet服务deAPI接口 1个ISAPIdeDLL 可以于被用户请求激活后长驻内存 等待用户de另1个请求 还可以于1个DLL里设置多个用户请求处理函数 此外 ISAPIdeDLL应用程序和WWW服务器处于同1个进程中 效率要显著高于CGI.(由于微软de排他性 只能运行于windows环境) 

APP作为Apache模块 Apache服务器于系统启动后 预先生成多个进程副本驻留于内存中 1旦有请求出现 就立即使用这些空余de子进程进行处理 这样就不存于生成子进程造成de延迟了.这些服务器副本于处理完1次HTTP请求之后并不立即退出 而乃停留于计算机中等待下次请求.对于客户浏览器de请求反应更快 性能较高.


评论