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"
这样就达到我们的效果了。
完。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.
哥哥,求助,请看私信,另外请问,如上图mod_wsgi与python双向沟通,通过什么什么?还需要配置python吗?不用吧
我已近回复到您的邮箱,请查看
为后来惑者留下点提示,首先,wsgi与apache的版本需要对应,其次,python必须让Apache 知道,即配置环境变量之类,再次,解析源代码WSGIScriptAlias与LoadModule同等重要