CGI(Common Gateway Interface)
如果客户端的需求只是静态文件(比如静态 html), 那么服务器只需要把静态文件传送给客户端就行了.
但事实上需求多种多样, 我们需要由程序动态生成的内容. 我们当然可以把这部分功能结合在 web服务器里, 但这样一来随着需求日益增多, 服务器程序很快就无法维护了...
因此 web 服务器只保留最基本功能(解析http请求等), 而把具体对资源的处理放入另外的程序.这些程序根据CGI(协议)从环境变量或标准输入得到请求信息, 并通过标准输出返回给服务器.
但这种分离的坏处是每次CGI请求都会运行CGI程序(产生新的进程), 结束时销毁, 增加负荷, 效率不高.因为每个 CGI 进程只处理一个请求,换句话说,每个请求都需要创建一个 CGI 进程处理,CGI 程序处理完毕后就退出了。
对一个 CGI 程序,做的工作其实只有:从环境变量(environment variables)和标准输入(standard input)中读取数据、处理数据、向标准输出(standard output)输出数据。
WSGI(Python Web Server Gateway Interface,缩写为WSGI)
WSGI只是一份标准,一个两边接口方式的约定(Web服务器与Web应用程序之间)
WSGI更像一个协议。只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行
一个符合wsgi规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。
WSGI将 web 组件分为三类: web服务器,web中间件,web应用程序, wsgi基本处理模式为 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。
WSGI 与 CGI 类似, 不过不是另外开辟一个进程, 而是调用一个 WSGI 程序(callable 对象), 其中 environ 变量(包含请求参数信息), start_response (作为回调函数使用, 让 WSGI 程序可以设置响应头部, 更加灵活) 作为参数.
WSGI 流程大概下面这个样子:
服务器启动加载一个 WSGI 程序(callable 对象, 可能由框架提供)
服务器建立连接,读取请求并解析, 然后创建一个 environ 字典, 服务器程序还会实现一个 start_response 方法, 用于在应用内部更改响应头部
服务器将 environ 和 start_response 作为参数, 调用 WSGI 程序, 并得到返回的数据
服务器将得到的数据和由 start_response(WSGI 程序内部调用) 设置的响应头部来构造 HTTP 响应, 并返回给客户端
参考:https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
http://www.jianshu.com/p/4cea972770f4
网友评论