理解网关接口之前,我们须要先弄清楚两个东西,Web做事器和Web运用程序。什么是Web做事器?什么是Web运用程序?虽然在我的Django小程序课程里面,有对这两者的差异展开来先容,但是这里考虑到很多同学并没有学习这门课,以是我们先把这两个观点弄清楚,否则在后面谈论起网关接口,也只会一知半解。
Web做事器
首先,什么是Web做事器。Web做事器是做事于网站后台的一个软件,是常驻于物理做事器的一个打算机程序。Web做事器可以向浏览器等Web客户端供应文档,也可以放置网站文件,让全天下浏览;可以放置数据文件,让全天下下载。目前最主流的三个Web做事器是Apache、 Nginx 、IIS。

Apache是天下利用排名第一的Web做事器软件。它可以运行在险些所有广泛利用的打算机平台上,由于其跨平台和安全性被广泛利用,是最盛行的Web做事器端软件之一。它快速、可靠并且可通过大略的API扩充,将Perl/Python等阐明器编译到做事器中。
Nginx是一款轻量级的Web做事器/反向代理做事器及电子邮件(IMAP/POP3)代理做事器,在BSD-like 协议下发行。其特点是霸占内存少,并发能力强,事实上Nginx的并发能力在同类型的网页做事器中表现较好,中国大陆利用Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
这里先大略谈论一下Nginx和Apache的差异,在资源上,Nginx占用的内存更少;在性能上,Nginx的并发能力更强;在社区方面,Nginx和Apache都拥有广泛的利用者,Apache的插件会比Nginx丰富一些。其余Nginx的功能比Apache要丰富一些,Nginx除了作为Web做事器以外,也常常作为反向代理做事器等利用,而Apache则紧张作为Web做事器去利用。
还有IIS,IIS是微软公司在Windows Server供应的一个Web做事器,一样平常支配在Windows系统上,也有一定的利用者。
Web运用程序
理解了Web做事器,我们接着理解一下Web运用程序。
Web运用程序一样平常指的是完成业务逻辑的程序,比如熟习Python措辞的,常常会用Django、Flask、Tornado等框架来完成业务逻辑的处理,接管要求,返回结果;熟习Java措辞的,则常常会利用Spring、Spring Boot来完成业务逻辑处理;熟习PHP措辞的,则常用ThinkPHP、Laravel、CI等等框架来完成Web后台的开拓;还有Golang、Node.js等等,都会有相应的框架来完成Web要求的处理。
这些便是定义为Web运用程序的东西,也便是我们常说的Web框架,比如一个Pythoner问其余一个Pythoner,你一样平常利用什么Web框架呀?这个便是Web运用程序。
那么Web做事器和Web运用程序有啥差异?其实在前面的描述里面,我已经说的比较清楚了,Web运用程序紧张是完成业务逻辑的处理,Web做事器则紧张是进行外部要求的吸收和转发。这里须要把稳的是,我们一样平常不应该把业务逻辑放在Web做事器上去处理,虽然说Web做事器支持广泛的脚本来进行拓展,但是我们一样平常情形下还是不应该把业务逻辑放在Web做事器去处理,比如拦截要求、鉴权处理等等的操作。
看到这里可能有些人又会有疑问了,在开拓Web运用的时候,我们直接就可以把运用跑起来接管要求了呀,为啥还须要Web做事器的存在。比如说利用Django的时候,直接输入命令python manage.py runserver,就可以吸收要求了,为啥还须要Web做事器呢。
这紧张是从性能上去考虑的,Web运用虽然在开拓阶段就可以通过一些命令来启动做事,但是这些功能紧张是供应调试所利用的,真正支配上线的时候,如果流量较大,性能是弗成的,以是须要有Web做事器的存在。Web做事器是专门用于吸收外部要求并处理的软件,以是Web做事器在性能上会比Web运用更佳,毕竟术业有专攻。Web做事器处理静态资源要求(CSS、JS、HTML、图片)等,性能会比Web运用更好。其余对付一些非静态资源的要求,则须要转发到后台Web运用。
到这里,我们基本分清楚Web做事器和Web运用的差异了,这里面我们把稳一个关键词“转发”,当Web做事器接管要求的时候,会把要求转发到后台Web运用去处理,我们本篇文章的主角,GI就事情在这个转发的过程中。
CGI
终于轮到主角“网关接口”。前面先容了GI事情的地方,接下来我们就来一起磋商一下现在有哪些GI,他们有哪些特点和差异。
首先是CGI,CGI是Common Gateway Interface (通用网关接口)的缩写。CGI是一项古老的技能。最初是在1993年由美国国家超级电脑运用中央(NCSA)为NCSA HTTPd Web做事器开拓的。CGI的事理非常大略粗暴,在支持CGI的Web做事器下,只须要写一个大略的脚本,然后在脚本中输出内容,这些内容就会返回给前台。举个大略的例子,利用Python实现一个hello.py:
#!/usr/bin/env pythonprint 'Hello, World! Hello CGI.'
然后把他改名为hello.cgi,支配到Web做事器下,当要求到达的时候,打印的字符串就会通过Web做事器返回到页面。我们常常称这种运用为console application (也可以称作command-line interface programs) 的程序,这样的脚本称为CGI脚本。
CGI事情完全的事理是这样的:
当用户访问我们的 Web 运用时,会发起一个 HTTP 要求。终极 Web 做事器吸收到这个要求。Web 做事器创建一个新的 CGI 进程。在这个进程中,将 HTTP 要求数据已一定格式解析出来,并通过标准输入和环境变量传入到 URL 指定的 CGI 程序。Web 运用程序处理完成后将返回数据写入到标准输出中,Web 做事器进程则从标准输出流中读取到相应,并采取 HTTP 协议返回给用户相应。一句话便是 Web 做事器中的 CGI 进程将吸收到的 HTTP 要求数据读取到环境变量中,通过标准输入转发给CGI程序;当CGI程序处理完成后,Web 做事器中的CGI进程从标准输出中读取返回数据,并转换回 HTTP 相应格式,终极将页面呈现给用户。然后 Web 做事器关闭掉这个 CGI 进程。
可以说 CGI 协议特殊善于处理 Web 做事器和 Web 运用的通信问题。然而,它有一个严重毛病,对付每个要求都须要重新 fork 出一个 CGI 进程,处理完成后立即关闭。当要求量比较大时,会有严重的性能问题,由于频繁的创建进程和回收进程,会占用非常多的做事器资源。由于CGI的性能问题,于是新一代的CGI技能,FastCGI应运而生。
FastCGI
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web做事器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。
FastCGI致力于减少网页做事器与CGI程序之间交互的开销,从而使做事器可以同时处理更多的网页要求。
而FastCGI的事情事理是这样的:
FastCGI 进程管理器启动时会创建一个 主(Master) 进程和多个 CGI 阐明器进程(Worker 进程),然后等待 Web 做事器的连接。Web 做事器吸收 HTTP 要求后,将 CGI 报文通过 套接字(UNIX 或 TCP Socket)进行通信,将环境变量和要求数据写入标准输入,转发到 CGI 阐明器进程。CGI 阐明器进程完成处理后将标准输出和缺点信息从同一连接返回给 Web 做事器。CGI 阐明器进程等待下一个 HTTP 要求的到来。以是FastCGI可以看作是办理原始CGI性能问题的一个升级版本。
WSGI
WSGI:全称是Web Server Gateway Interface,Web做事器网关接口,WSGI不是做事器,Python模块,框架,API或者任何软件,只是一种规范,描述前面Web做事器如何与Web运用通信的规范。
前面先容网关接口的时候先容了CGI、FastCGI等,那这里的WSGI紧张是Python为Web做事器和Web运用程序之间通信而设计的。在Python中,常见的Web框架Tornado、Django、Flask都支持利用WSGI和Web做事器进行通信,而在采取WSGI协议的时候,则常常安装uWSGI模块来完成通信。
ASGI
与WSGI类似的还有一个ASGI,ASGI也是由Python实现的一类网关接口,这里的A指的是Async,异步的意思。ASGI是WSGI的扩展,支持除了原来的HTTP以外的WebSocket等的网络协议。
Servlet、Tomcat
终于来到Java阵营了,在前面的CGI、FastCGI、WSGI等等,紧张都是PHP、C++、Python等措辞实现Web运用程序和Web做事器通信的网关接口,尤其是CGI、FastCGI,在以前C++、PHP大行其道的时候,它们拥有广泛的用户根本,像腾讯等大企业,由于历史的关系,内部系统中还有很多保留着CGI、FastCGI等技能。那么在Java的阵营下,一样平常利用什么技能作为Web做事器和Web运用框架之间的通信呢?
Servlet,谈到Java不得不谈的一项技能,全称Server Applet,是用Java编写的做事器端程序,可以看做是前面我们先容的Web运用程序。其紧张功能在于交互式地浏览和修正数据,天生动态Web内容。Servlet最初出身在1997年,最新的一个版本Servlet4.0于2017年9月份推出,Servlet拥有广泛的用户群体。
如果说Servlet是运用程序,那Servlet容器便是包含运用程序的Web做事器,常见的Servlet容器就有我们熟知的汤姆猫(Tomcat)、Jetty等,Servlet容器管理着Servlet运用,我们的Servlet程序一样平常通过Servlet容器对外进行做事。
随着Docker容器技能和K8S容器编排技能的成熟,本日微做事技能也是非常热门,而微做事离不开的Spring Boot、Spring Cloud的个中,就有Servlet、Servlet容器的身影。
我们说说Spring Boot,对付Spring Boot,大家都被他快捷的开拓和支配办法所吸引,Spring Boot是由早期的Spring框架发展而来的,其设计目的是用来简化新Spring运用的初始搭建以及开拓过程。在我们开拓利用Spring Boot开拓Web后台的时候,我们在写完逻辑代码的时候,在本地只须要点击运行,就能通过浏览器进行调试,颇为方便;这和前面我们利用PHP、Python开拓Web程序非常类似,我们在利用Flask、Tornado等框架开拓Web程序的时候,也可以通过大略的启动,就可以在本地通过浏览器去调试。但是这里是有一些差异的,我们说Flask、Tornado等框架是Web运用框架,没有说他们是Web做事器,他们通过前面先容的网关接口(GI)通信,但是在利用Spring Boot的时候,却很少说须要把它支配在Web做事器Apache、Nginx之下,一样平常支配Spring Boot运用的时候,我们直接把它打包成jar包,就可以在做事器跑起来对外做事了。这是为什么呢?
实在Spring Boot内嵌了Servlet容器Tomcat,也便是Spring Boot既充当了Web运用程序的角色,也充当了Web做事器的角色,在开拓Spring Boot运用程序的过程中,我们是先通过代码实现了Web运用程序的逻辑,处理要乞降应答,而Servlet容器的部分,完备不须要我们去配置,这便是Spring Boot大略、便捷,高效的开拓效率的缘故原由,以是现在很多同学都喜好利用Spring Boot去开拓Web的后台。Spring Boot供应了大略的开拓模式,但是也带来一些问题,比如说很多同学根本无法分清楚Web运用程序和Web做事器的差异等等。
末了大略的回顾一下本日这篇文章,我们紧张是先容了现在Web后端各种网关接口,包括CGI、FastCGI、WSGI等,在理解这些之前,我们须要弄懂Web做事器和Web运用程序,而网关接口,便是紧张事情在Web做事器和Web运用程序之间的。末了我们还先容了Java阵营的技能,在Java现在大行其道的Spring Boot框架里面,我们不再特意强调Web做事器和Web运用程序,Spring Boot框架是把两个领悟在一起的一个框架,Spring Boot可以便捷的开拓和支配Web程序,便是由于内部包含了一个叫Tomcat的Servlet容器,也便是Web做事器。
末了希望这篇文章对大家捋清楚Web后台技能和网关接口,都能有一定的帮助。