您的位置:首页 > 运维架构 > Apache

apache+wsgi+python如何工作

2013-03-28 14:43 531 查看
转自:http://blog.csdn.net/huangxiansheng1980/article/details/7206291

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对应的虚拟机的对应的目录或者文件。这样说,可能有点晕,给个实际的例子吧:

[html] view
plaincopy

<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

[html] view
plaincopy

[html] view
plaincopy

<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"

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

完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: