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

使用wsgi模块将Django加于apache

2012-11-26 23:53 399 查看
1. WSGI模块的编译和安装:

首先,从code.google下载mod_wsgi-3.4.tar.gz源码包。

解压并进入目录运行"./configure --with-apxs=/usr/local/apache2/bin/axps  --with-python=/usr/local/bin/python",其中这两个with分别用于制定apache安装文件的axps路径,和python解释器的路径。在运行make的时候,它们都会被用到。

运行make。出现如下错误:“apxs:fatal error: Python.h No such file or directory"。解决办法,安装python-devel包。

make install, 完成安装。

2. 配置apache的http.conf

增加一行,"LoadModule wsgi_module    modules/mod_wsgi.so"

增加一行,“WSGIScriptAlias /mysite  /home/djweb/mysite/mysite/wsgi.py" #这个路径是用django-admin.py startproject mysite时自动创建的wsgi.py的路径。

增加一行,“WSGIPythonPath  /home/djweb/mysite" #这是站点的路径,这个还是挺有用的。其实,是在sys.path中增加一个路径项。

#如果apache的error日志中有如下错误,”Execption occured processing WSGIScript '/home/djweb/mysite/mysite/wsgi.py", "could not import settings 'mysite.settings'"时,就是sys.path中并没有包含“/home/djweb/mysite"这个路径。这时可以增加这一行解决,或者想办法在sys.path中永久地增加这个路径。(PYTHONPATH,或者site-packages/目录下增加一个mysite.pth)

设置权限:apache2.2和apache2.4相比,有些不同。下面的是2.2的配置:

<Directory /home/djweb/mysite/mysite> 

Order deny, allow

Allow from all

</Directory>

可能遇到403错误,error日志里有 ”(13)Permission denied: access to /dj denied (filesystem path '/home/...') because search permissions are missing on a component of the path“。这是由于目标目录上的每个目录都需要有执行权限。chmod a+x给每个目录增加执行权限,可解决这个问题。

2.4的配置如下:

<Directory /home/djweb/mysite/mysite> 

Require all granted         #否则会出现403的错误, error日志里有" AH01630: client denied by server configuration“
</Directory>

3. 到这里,重启apache服务, 就可以通过http://localhost/mysite访问了。看到下面,就成功了。

It worked!


Congratulations on your first Django-powered page.

4. wsgi.py文件说明。

默认情况下,这个文件其实就做两件事情。

os.environ.setdefault(“DJANGO——SETTINGS——MODULE”, “mysite.settings")#导入设置文件

from django.core.wsgi import get_wsgi_applicatioin

application = get_wsgi_application() #创建一个叫做application的对象,WSGI服务会使用它。

我们可以自己写一个简单的测试一下:

def appication(environ, start_response):

    status = '200 OK'

    output = 'Hello World!'

    response_headers = [('content-type', 'text/plain'),

                                             ('content-length', str(len(output)))]

    start_response(status, response_headers)

    return [output]

用这个替换wsgi.py,就会看到“Hello World"了。

5.wsgi的运行模式

默认情况下,wsgi是运行在embeded的模式下,即在apache的worker进程内。对wsgi application的修改,需要重启apache才能生效。

另外一种模式是daemon模式,wsgi运行在独立的进程内,wsgi的代码改变时,不需要重启apache就能生效。目前,还没有深入研究这两个的区别和具体用法。

总结:坚持写博文,不容易啊。挺花时间的,但是,好处是可以让自己的思路便清晰点。最重要的,还是记录自己这个成长的过程,记录遇到的问题,也许对他人也有用呢。现在,还只是在起步的皮毛阶段。加油啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Apache Django wsgi