CGI:
CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
PHP与apache的关系:
Apache是Web服务器,负责回应所有收到的Web请求。比如你访问http://zhihu.com/1.html,那么Apache就找到根目录下的1.html文件,将其中的内容返回。
如果我需要这个地址能显示动态的东西,比如当前日期时间,那么就写一个PHP程序1.php,当Apache收到http://zhihu.com/1.php的请求时,通过CGI调用PHP解释程序,执行1.php文件的内容,然后将返回的字符串返回给客户端。
Web 应用、服务是如何工作的:
apache处理的是最底下的两层,网络通信层和协议层。
网络通信层:包括tcp网络通信的若干工作,比如bind, listen, connect, receive, send, disconnect。
协议层:apache可以处理http协议中的request和response,并且可以解释header和body。
mod_python/wsgi/cgi是中间部分。
先说最简单的cgi。
cgi是通过系统标准的进程调用的方式调用上层程序来完成逻辑部分的处理。cgi将apache整理好的request header和request body分别以env和stdin的方式发给上层程序,然后将上层程序的stdout返回给apache。
后来人们觉得,每一个请求都产生一个进程,这样做效率太低。所以后来人们发明了fastcgi。它的原理大概的意思是说fastcgi启动一个常驻进程。每次当apache接到request的时候,通过IPC或者socket将请求内容发给fastcgi进程,然后fastcgi再转发给上层应用。
fastcgi支持C、PHP等多种语言。
后来又有人针对Python语言做了好多优化工作,产生了mod_python和wsgi。
Django上最上层的逻辑部分。
cgi => Django:
Python程序被以一个进程的方式被启动。Django首先要读取env和stdin,整理成request header和request body,从中找到URI字段,然后根据url映射关系找到对应的函数开始执行。最后将函数的返回值以某种固定的格式输出给stdout。
mod_python/wsgi => Django:
过了mod_python/wsgi之后,就全是Python程序了。request header、request body和response被mod_python/wsgi整理成了Python对象。例如字典、FileIO等。
Django拿到这些对象之后,就可以从request header中找到URI,然后根据url映射关系找到对应的函数开始执行。之后将函数的返回值整理成mod_python/wsgi可以接受的response对象(实际上就是一个str或者generator)返回给mod_python/wsgi。