apache wsgi python如何工作

apache wsgi python如何工作 

 

apache httpd web服务器,通常被简称为apache,非常强大,无论是多平台支持,多语言支持,高并发的支持,丰富的模块支持等等,很多的大型网站都使用作为web server。

所以我们就以apache作为我们的服务器。通常apache作为web服务器会配合tomcat来支持jsp, java servlet,但是因为我们不需要这些支持,我们只安装apache, 安装最新的稳定版2.2。

 

至于如何安装apache+wsgi+python,请参看我的另外一篇文章:

ubuntu下安装apache2.2+mod_wsgi+django

 

下面假设你已经配置好环境。

 

图的说明能力远胜于文字,所以我这里画了一张草图,演示了从浏览器发出请求,到最后收到应答并显示结果的过程:

 

对上面的图做个简单的解释。

客户端也就是浏览器端,当用户在浏览器的地址栏输入一个网站并且回车的时候,就会产生一个http的request请求到对应的服务器,服务器端的web服务器程序-这里就是我们的apache接受到,请求后,就查看所请求的这个url对应的虚拟机的对应的目录或者文件。这样说,可能有点晕,给个实际的例子吧:

<VirtualHost 192.168.77.122:80>  
   ServerAdmin admin@system  
   DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test"  
   ServerName myserver 
   WSGIScriptAlias / "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/mytest.py" 
   AddType text/html .py  
   ErrorLog logs/dummy-host.example.com-error_log  
   CustomLog logs/dummy-host.example.com-access_log common 

 
    <Directory />
     Options FollowSymLinks ExecCGI
     AllowOverride None
     Order deny,allow
     Allow from all
    </Directory>
</VirtualHost> 

apache接受到这个请求后,发现请求对应的是目录C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test,虚拟机是myserver,这个虚拟机中有个很重要的配置是就是

 

WSGIScriptAlias

 

这个东西非常关键,因为如果没有这个那么apache就不知道如何解析这个请求了。这个关键字告诉apache,该虚拟对应的目录下面的程序有wsgi对应的模块去执行,那么apache又怎么知道什么是wsgi模块,这个模块又在什么地方呢?

 

这个需要在httpd.conf中来告诉apache:

 

LoadModule wsgi_module modules/mod_wsgi.so

 

在httpd.conf中加入这一句后,apache就知道wsgi是哪个模块,在什么位置了。注意LoadModule和wsgi_module是apache自己的关键字,它自己知道wsgi_module就是wsgi对应模块定义关键字。

 

你可以自己写一个动态库so,然后通过上面的方式-LoadModule加载进apache,但是对不起,apache并不认识你的模块,不能让你的这个so工作起来。好了我们言归正传吧,回到我们的主题。

 

所以当apache收到这个请求后,就知道使用mod_wsgi.so这个动态库的函数去处理请求

上面因为有这句:

 

WSGIScriptAlias / "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test/mytest.py"

 

这样apache就知道当收到访问当前服务器的根目录时,就使用mytest.py来处理请求。谁来处理mytest.py,就是python解释器,所以mod_wsgi.so中就要创建进程-python解释器进程来解释执行mytest.py。

 

执行mytest.py就是为了生成这个请求的应答的内容,接着返回mod_wsgi,从而通知apache,处理完成并把结果-比如是一个html的流,apache再把这个结果发送给我们的客户端-浏览器,浏览器最后显示它。整个过程结束。

 

这里加一句题外话,上面是指定只要访问服务器就使用mytest.py来处理请求,这样的话,你请求别的页面,比如http://192.168.77.122/test.py那么服务器还是会使用mytest.py来处理请求,这不是我们希望的,我们希望用户访问不同的页面会有不同结果。怎么办呢?我们只要一个小小的改变就可以,就是将上面的有wsgiscriptAlias那就修改为下面的这句:

 

WSGIScriptAlias / "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/test"

 

这样就达到我们的效果了。

 

 

完。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

3 Replies to “apache wsgi python如何工作”

  1. 为后来惑者留下点提示,首先,wsgi与apache的版本需要对应,其次,python必须让Apache 知道,即配置环境变量之类,再次,解析源代码WSGIScriptAlias与LoadModule同等重要

留言

你的邮箱是保密的 必填的信息用*表示