WEB服务动静结合

By | 2019年9月5日

基本介绍

  1)WEB服务仅能处理静态请求,如果处理动态请求则需要对应的动态资源服务软件,即:应用程序服务软件
  2)常见的应用服务软件有:PHP、Java、Python等
  3)问题:WEB服务如何与外部应用程序通信?通常有以下几种方案:
    - CGI协议:基本没人使用,不安全以及性能极其低下
    - 模块方式:如:Apache内置PHP模块,用以处理PHP动态请求
    - FastCGI协议:如:NGINX的php-fpm
  4)CGI、内置模块、FastCGI这三种方式,性能最好的要属FastCGI,但是需要额外的进程
  5)注意:静态资源和动态资源都是以数据流(本质都是数据流)形式返回用户的:
    - 静态资源:WEB服务将页面文件以【数据流】形式封装到响应报文,然后返回用户
    - 动态资源:WEB服务将执行结果(注意:此时是结果非文件)以【数据流】形式封装到响应报文,然后返回用户

CGI协议介绍

  1)CGI(Common Gateway Interface):通用网关接口,早期WEB服务与外部应用程序(CGI程序)通信的协议/接口标准,几乎可以在任何操作系统上实现(跨平台性好)
  2)CGI协议允许WEB服务执行外部程序,并将外部应用程序执行的结果返回WEB服务,并最终返回用户
  3)工作原理:用户请求WEB资源,静态请求交由WEB服务自行处理;如果是动态请求,WEB服务会【fork()】一个子进程(CGI进程/应用程序服务进程),然后将动态请求交由子进程处理,处理完后的数据返回WEB服务,最终由WEB服务封装为HTTP响应报文返回用户,然后结束这个子进程
  4)每一次的动态请求都会【fork()】一个子进程,周而复始的进行。所以,通过CGI协议处理动态请求,有多少连接请求就会创建多少CGI子进程,子进程反复加载是CGI方式性能低下的主要原因,当用户请求数量非常多时,会大量挤占系统的资源如内存、CPU时间等,造成效能低下

WEB内置模块介绍

  1)后来出现了一种更高级的方式,即:WEB服务可以内置Perl解释器或PHP解释器,也就是将这些解释器做成模块的方式,WEB服务会在启动时就会加载这些模块
  2)工作原理:用户请求WEB资源,静态请求交由WEB服务处理;如果是动态请求,WEB服务会通过内置模块来进行响应、解析、处理,省得重新fork一个进程,效率提高了。动静请求都是由WEB服务自身处理的

FastCGI协议介绍

  1)WEB服务、应用程序均为守护进程,二者基于FastCGI协议通过套接字通信
  2)FastCGI协议采用的是C/S架构,分为客户端(WEB服务)和服务端(应用程序服务)
  3)大多数WEB服务都支持FastCGI协议,包括Apache、Nginx、LigHTTPd等。同时,FastCGI协议也被许多应用程序服务所支持,如:当前比较流行的动态语言PHP
  3)工作原理:用户请求WEB资源,静态请求交由WEB服务处理;如果是动态请求,WEB服务会通过【FastCGI协议】将请求发给应用程序服务进行处理,应用程序会将处理完的结果返回WEB服务,最终由WEB服务封装为HTTP响应报文返回用户。此时,WEB服务和应用程序服务均为守护进程(可以启动多个FastCGI的守护进程)
  4)与CGI协议的区别:

 

相关链接

  1)https://www.zhihu.com/question/30672017
  2)https://blog.csdn.net/linuxheik/article/details/51865292
  3)https://www.awaimai.com/371.html
  4)https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
  5)http://www.ttlsa.com/web/fastcgi-cgi-diff/

发表评论