网关协议

目录php

一 静态页面和动态页面html

二 什么是web serverjava

三 什么是网关协议python

3.1 引子nginx

3.2 网关协议git

四 网关协议CGI、FastCGI、WSGI、UWSGIgithub

五 网关协议与keystoneweb

六 概念梳理chrome

 

一 静态页面和动态页面数据库

 

在了解了http协议后,咱们知晓,一个web server的本质就是

 

浏览器发送一个HTTP请求;

 

服务器收到请求,生成一个HTML文档;

 

服务器把HTML文档做为HTTP响应的Body发送给浏览器;

 

浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

 

而用户的请求的结果分静态页面和动态页面两种

 

静态页面:是一对写死了的html代码,全部的访问者看到的内容都同样,如你访问京东的主页,全部人看到的都同样

 

动态页面:动态的概念意味着变,程序中体现'变'的概念就是变量,于是在html代码中须要嵌入变量,变量的值的来源须要用一段代码动态生成,这样不一样的用户会提交不一样的数据给服务端,服务端分析用户提交过来的数据而后执行这段代码,动态生成值后赋值html中变量,而后返回html给用户,这样对每一个用户来讲收到的页面都是不同的。好比你登陆京东,登陆后返回的页面每一个人都不同。

 

 

二 什么是web server

 

用户上网的本质就是在本身这端启动socket client(浏览器),服务的启动socket server(web server)。

 

基于http协议的学习咱们知道,web server主要是用来响应用户的http请求而后返回html页面给用户。

 

从用户上网的角度来讲,早期的互联网只有俩个角色:浏览器<->web server,此时全部的用户访问的都是静态页面

 

如今主流的web server有apache,nginx,lighttpd等,须知,它们只能接收用户的请求而后生成静态页面

 

 

三 什么是网关协议

 

 

3.1 引子

 

随着互联网的发展,网站为每一个用户单独定制我的的东西呈现给用户成为了主流,这时候就产生了动态页面的需求。

 

因web server好比apache只能处理静态请求,因此对于动态请求,你须要编写专门的程序来处理

1036857-20170110122807463-826130772.png

随着互联网的发展,愈来愈多的用户数据须要永久保存下来,文件是能够永久保存,可是文件的数据处理性能过低,因而数据库慢慢成为了网站大后端的主流

1036857-20170110123449275-382905183.png

 

apache没法处理动态请求,因此咱们须要本身编写一个个的功能来处理这些动态请求(注意:这些动态请求有的须要查询数据库有的则不须要)

 

咱们按照一个须要操做数据的动态请求举例,来分析下问题

 

 

#处理动态请求的伪代码,能够称之为web application,或者简web app

 

一:接收apache提交过来的用户请求,触发函数运行

二:链接数据库

三:操做数据库(增删改查)

四:根据获取的数据进行其余逻辑处理

五:返回给apache数据

六:关闭数据库

 

 

问题一:

 

你在编写web app时,须要深刻研究apache工做的协议HTTP,等你研究明白了,过去了一百年。这严重影响了开发效率。

 

问题二:

 

这只是你针对apache这款web server定制的代码,换成了另外的web server你的程序没法重用

 

问题三:

 

这只是针对一种动态请求的代码实现,对于其余的动态请求呢,你仍然须要写重复的代码去处理。

 

3.2 网关协议

1036857-20170110125014635-253599833.png

 

如何解决问题一:

 

咱们迫切须要在web server与web app之间定义一种标准,用来明细分工,web server对外提供一种标准,web app开发者只要遵循这个标准,那么后者就无需考虑web server究竟是如何实现的了而能够专一web app的开发,这个标准就是网关协议

 

如何解决问题二:

 

在web server与web app之间定义了标准,那么只要个人web app是遵循这个标准的,换另一个也遵循该标准的web server,一样能够运行

 

如何解决问题三:

 

这里须要引入一个概念叫:web app开发框架(也称web 框架)

 

web app开发框架用来为web app开发者提供一套现成的开发工具与开发模式,web app开发者再也不须要写重复代码了,只须要使用某种现成的web开发框架,一些重复的功能就不用再去重复造轮子了,这极大的提升了开发效率

 

好比web app开发框架通常本事都是基于网关协议标准实现的,由于你用web app开发框架去开发web app,天然就是遵循某种网关协议标准的,你甚至连这个协议具体是什么都无需知道。

 

 

 

四 网关协议CGI、FastCGI、WSGI、UWSGI

 

网关协议CGI

 

什么是CGI?

 

CGI即通用网关接口(Common Gateway Interface),是web app应用程序(CGI程序)与Web服务器之间的接口标准。。

 

CGI 的跨平台性能极佳,几乎能够在任何操做系统上实现。

 

fork-and-execute模式:apache接收用户动态请求,先要建立cgi的子进程,而后处理请求,处理完后结束这个子进程。

 

fork-and-execute模式的弊端:用cgi方式的服务器有多少链接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要缘由。当用户请求数量很是多时,会大量挤占系统的资源如内存,CPU时间等,形成效能低下。

 

CGI脚本的工做流程:

 

浏览器发送动态请求(经过HTML表单或者超连接)

服务端接收该请求,调用CGI脚本,产生一个CGI进程来处理该动态请求,结果返回给服务器

服务器将html返回给浏览器

网关协议FASTCGI

 

什么是FASTCGI?

 

FastCGI是从CGI发展改进而来的

 

传统CGI接口方式的主要缺点是性能不好,由于每次HTTP服务器遇到动态请求时都须要从新启动脚本解析器来处理,而后返回结果给HTTP服务器。没法应对高并不是场景。

 

FastCGI像是一个常驻(long-live)型的CGI,它能够一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。

 

CGI 就是所谓的短生存期应用程序,FastCGI 就是所谓的长生存期应用程序。

 

因为 FastCGI 程序并不须要不断的产生新进程,能够大大下降服务器的压力而且产生较高的应用效率。它的速度效率最少要比CGI 技术提升 5 倍以上。它还支持分布式的运算, 即 FastCGI 程序能够在网站服务器之外的主机上执行而且接受来自其它网站服务器来的请求。

 

 

 

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并所以得到较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要缘由,若是CGI解释器保持在内存中并接受FastCGI进程管理器调度,则能够提供良好的性能、伸缩性、Fail-Over特性等等。FastCGI接口方式采用C/S结构,能够将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。

 

FastCGI的工做流程:

 

Web Server启动时载入FastCGI进程管理器(PHP-CGI或者PHP-FPM或者spawn-cgi)

FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的链接。

当客户端请求到达Web Server时,FastCGI进程管理器选择并链接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

FastCGI子进程完成处理后将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个链接。 在CGI模式中,php-cgi在此便退出。

FastCGI 的特色

 

打破传统页面处理技术。传统的页面处理技术,程序必须与 Web 服务器或 Application 服务器处于同一台服务器中。这种历史已经早N年被FastCGI技术所打破,FastCGI技术的应用程序能够被安装在服务器群中的任何一台服务器,而经过 TCP/IP 协议与 Web 服务器通信,这样作既适合开发大型分布式 Web 群,也适合高效数据库控制。

明确的请求模式。CGI 技术没有一个明确的角色,在 FastCGI 程序中,程序被赋予明确的角色(响应器角色、认证器角色、过滤器角色)。

 

 

 

PHP-CGI是PHP自带的FastCGI管理器。PHP-CGI的不足:

 

php-cgi变动php.ini配置后需重启php-cgi才能让新的php-ini生效,不能够平滑重启

直接杀死php-cgi进程php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑重新生成新的子进程。)

 

Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,不少人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工做,不过有很多缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要从新编译,这对于一些已经运行的环境可能有不小的风险),在php 5.3.3中能够直接使用PHP-FPM了。Spawn-FCGI的代码不多,所有才630行,用c语言编写,最近一次提交是5年前。代码主页:https://github.com/lighttpd/spawn-fcgi

 

Spawn-FCGI代码分析以下:

 

spawn-fcgi 首先create socket,bind,listen 3步建立服务器socket,(把这个socket叫作 fcgi_fd)

用dup2,把fcgi_fd 交换给 FCGI_LISTENSOCK_FILENO (FCGI_LISTENSOCK_FILENO数值上等于0,这是fastcgi协议当中指定用来listen的socket id)

执行execl ,replaces the current process image with a new process image. process image 进程在运行空间的代码段

很显然,Spawn-FCGI也是 pre-fork 模型,只是用了上古C语言编写,充满了N多 unix下暗黑编程技巧。

 

Spawn-FCGI功能很单一:

 

只管fork进程,子进程挂了,主进程仅仅log记录一次,根本不会从新fork。在2009年一段时间内,我曾经用spawn-fcgi部署php-cgi,当跑一段时间就会全挂掉,只能用crontab定时重启spawn-fcgi

不负责子进程中的网络IO,把socket放到指定位置就完了,接下来的事情由被spawn的程序处理

Spawn-FCGI是一个很早期的程序,瞻仰一下便可。另外有:1996年的一段代码:

http://www.fastcgi.com/om_archive/kit/cgi-fcgi/cgi-fcgi.c

和spawn-fcgi一个风格

 

 

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,能够在 http://php-fpm.org/download下载获得。PHP-FPM实际上是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可使用。FPM(FastCGI 进程管理器)用于替换 PHP-CGI 的大部分附加功能,对于高负载网站是很是有用的。它的功能包括:

 

支持平滑中止/启动的高级进程管理功能;

能够工做于不一样的 uid/gid/chroot 环境下,并监听不一样的端口和使用不一样的 php.ini 配置文件(可取代 safe_mode 的设置);

stdout 和 stderr 日志记录;

在发生意外状况的时候可以从新启动并缓存被破坏的 opcode;

文件上传优化支持;

“慢日志” – 记录脚本(不只记录文件名,还记录 PHP backtrace 信息,可使用 ptrace或者相似工具读取和分析远程进程的运行数据)运行所致使的异常缓慢;

fastcgi_finish_request() – 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工做(录入视频转换、统计处理等);

动态/静态子进程产生;

基本 SAPI 运行状态信息(相似Apache的 mod_status);

基于 php.ini 的配置文件。

 

 

 

 

网关协议WSGI

 

什么是WSGI?

 

Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。它只是一个接口定义:它不负责服务器的实现,也不负责网页应用的实现,它只是一个两边接口方式的约定。

 

自从WSGI被开发出来之后,许多其它语言中也出现了相似接口。WSGI是做为Web服务器与Web应用程序或应用框架之间的一种低级别的接口,以提高可移植Web应用开发的共同点。WSGI是基于现存的CGI标准而设计的。WSGI就是Python的CGI包装,相对于Fastcgi是PHP的CGI包装

 

有了WSGI,你就不用去考虑,服务器程序的具体实现,应用程序得到了很好的适用性。好比一个云平台提供了对 WSGI 接口的支持,那么,只要应用是基于 WSGI 的,就能够直接跑起来。其实keystone就是一款python开发的基于WSGI标准的app。

 

什么是WSGI中间件?

 

基于WSGI 的设计哲学,咱们能够写一些对 server 和 application 都兼容的模块,即WSGI中间件(middleware)。所谓的 WSGI 中间件同时实现了API的两方,所以能够在WSGI服务和WSGI应用之间起调解做用:从WSGI服务器的角度来讲,中间件扮演应用程序,而从应用程序的角度来讲,中间件扮演服务器。

 

WSGI中间件的功能与好处?

 

WSGI中间件能够完成好比缓存、字符编码转换、根据 url 作应用 routing 等功能。

 

这种设计模式,是 WSGI 下降了 server 和 application 耦合度以后的产物,同时,它从另外一个角度大大提高了设计的灵活性。

 

WSGI的处理模式

 

WSGI将 web 组件分为三类: web服务器,web中间件,web应用程序

 

wsgi基本处理模式为 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。

 

在处理一个WSGI请求时,服务器会为应用程序提供环境资讯及一个回呼函数(Callback Function)。当应用程序完成处理请求后,透过前述的回呼函数,将结果回传给服务器。

 

 

 

1.WSGI Server/gateway

 

wsgi server能够理解为一个符合wsgi规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。文字很难解释清楚wsgi server究竟是什么东西,以及作些什么事情,最直观的方式仍是看wsgi server的实现代码。以python自带的wsgiref为例,wsgiref是按照wsgi规范实现的一个简单wsgi server。

1036857-20170110152452463-1595427649.png

1.服务器建立socket,监听端口,等待客户端链接。

2.当有请求来时,服务器解析客户端信息放到环境变量environ中,并调用绑定的handler来处理请求。

3.handler解析这个http请求,将请求信息例如method,path等放到environ中。

4.wsgi handler再将一些服务器端信息也放到environ中,最后服务器信息,客户端信息,本次请求信息所有都保存到了环境变量environ中。

5.wsgi handler 调用注册的wsgi app,并将environ和回调函数传给wsgi app

6.wsgi app 将reponse header/status/body 回传给wsgi handler

7.最终handler仍是经过socket将response信息塞回给客户端。

 

 

二、WSGI Application

 

wsgi application就是一个普通的callable对象,当有请求到来时,wsgi server会调用这个wsgi app。这个对象接收两个参数,一般为environ,start_response。environ就像前面介绍的,能够理解为环境变量,跟一次请求相关的全部信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,wsgi application经过调用start_response,将response headers/status 返回给wsgi server。此外这个wsgi app会return 一个iterator对象 ,这个iterator就是response body。

 

基于python wsgiref制做wsgi server(web server)

 

 

三、WSGI MiddleWare

 

有些功能可能介于服务器程序和应用程序之间,例如,服务器拿到了客户端请求的URL, 不一样的URL须要交由不一样的函数处理,这个功能叫作 URL Routing,这个功能就能够放在两者中间实现,这个中间层就是 middleware。middleware对服务器程序和应用是透明的,也就是说,服务器程序觉得它就是应用程序,而应用程序觉得它就是服务器。这就告诉咱们,middleware须要把本身假装成一个服务器,接受应用程序,调用它,同时middleware还须要把本身假装成一个应用程序,传给服务器程序。

 

 

网关协议uWSGI

 

uWSGI is gaining steam as a highly-performant WSGI server implementation.

 

参考:

 

http://www.fullstackpython.com/wsgi-servers.html

 

https://www.biaodianfu.com/cgi-fastcgi-wsgi.html

 

http://www.cnblogs.com/pied/p/4597740.html

 

 

五 网关协议与keystone

 

keystone本质就是python开发的一款基于wsgi的app,社区提倡的部署方法:

 

apache(wsgi)+keystone

 

nginx(uwsgi)+keystone

 

 

六 概念梳理

 

客户端

 

经常使用浏览器:chrome

 

web服务

 

经常使用web server:apache,nginx,lighttpd

 

web app

 

经常使用web app开发语言:python,php,java

 

python经常使用web app开发框架(Web框架):

 

除了Flask,常见的Python 还有:

 

Flask:轻量级Web app开发框架;

 

Django:全能型Web app开发框架;

web.py:一个小巧的Web app开发框架;

 

Bottle:和Flask相似的Web app开发框架;

 

Tornado:Facebook的开源异步Web app开发框架。

相关文章
相关标签/搜索