Apache+Django性能优化之mod_wsgi篇
2013-04-13 08:53
411 查看
Apache+Django性能优化之mod_wsgi篇
我们一直使用 Django ,玩聚的各个产品前端都是架设于 Django 之上,如:SR/RT。如果你对 Django 有所了解,可以跳过下面的简介:什么是 Django ?
Django 是一个开放源代码的Web应用框架,由Python写成,主力开发者是Adrian Holovaty。它采用了MVC的设计模式。
Django 的名字来自于比利时的爵士吉他手Django Reinhardt,他是欧陆爵士乐发展的奠基人,也是爵士史上最伟大的吉他巨匠,中国乐迷称之为“三指琴魔”。
Django 源自一个在线新闻 Web 站点,于 2005 年7月在BSD许可证下发布。Django 框架的核心组件有:
用于创建模型的对象关系映射
为最终用户设计的管理界面
一流的 URL 设计
设计者友好的模板语言
缓存系统
如何上手 Django ?
新手入门参考Django Step by Step之limodou版。
DjangoProject.com 是 Django 框架的主页。其中的文档包括:
How to install Django,展示了如何在一台开发机器上设置 Django
Database API reference,使用 Django ORM 库的指南
Django template language,为模板作者准备的一份简单指南
How to serve static files,如何在开发过程中通过设置 Django 来提供静态文件服务的介绍(不要在产品环境中这样做)
How to use Django with mod_python,这是一份有关利用 mod_python 组合使用 Django 和 Apache
的指南
Generic views,展示了如何使用 Django 的通用视图更快地实现通用的 Web 应用程序模式
Django+Apache+mod_python 的用法
一般上手搭配 Django 的是 Apache+mod_python ,从这个早年间的翻译文档可以了解 Apache怎样处理请求以及mod_python到底做了什么。
不过,既然 Django 都已经在文档中说“it has been mostly superseded by the simpler mod_wsgi
deployment option./mod_python 多半已被更简单的 mod_wsgi 替代了。”那么我们就应该一上手就用 mod_wsgi 。
为何要切换到 mod_wsgi ?
mod_python 其实也不差。
但我一直困惑于 Apache+mod_python 的莫名频繁崩溃,错误日志中会出现大量的如下错误:
[error] [client X.X.X.X] OSError: [Errno 0] Error
[notice] Parent: child process exited with status 3221225477 -- Restarting.
这个状态号 3221225477 基本没什么意义,再加上 OSError 0 ,这个异常日志让人很无奈。甚至在 Windows 平台下,Apache 最恶劣情况下竟然会弹出一个崩溃错误框,此时事件日志会报告:
cation Popup:0:29722:26:EVENTLOG_INFORMATION_TYPE:弹出应用程序: Microsoft Visual C++ Runtime Library: Runtime Error!
Program: C:\Apache2.2\bin\httpd.exe
This application has requested the Runtime to terminate it in an unusual way.
一直无法对症下药。于是,期冀 mod_wsgi 能让我摆脱这两个问题。
另一个就是性能。
modwsgi 性能评估中列出这样的数字对比:
Mechanism Requests/sec
mod_cgi (ScriptAlias) 10
mod_python (PythonHandler) 400
mod_wsgi (WSGIDaemonProcess) 700
mod_wsgi (.htaccess/SetHandler) 850
mod_wsgi (WSGIScriptAlias) 900
从数字可以看出,WSGIScriptAlias 是最优选择。当然这个数字也没什么,后面人家说了“任何性能提高,都将被你使用的大型Web框架如Django或TurboGears吃掉,尤其是用了数据库后端,大多数的
overhead 源自Python Web Framework以及任何访问数据库时的瓶颈。mod_wsgi上的 overhead 只是很小的一块,这一小块上的任何性能提高都很难被注意到。”
切换到 mod_wsgi 很容易
郑昀@玩聚RT 20090810
1、下载
可以从 modwsgi 的下载目录 下载你所需要的版本。
http://download.csdn.net/download/liguo9860/3691414
对于 Windows 平台,可能需要阅读“Installation On Windows”,并从这个页面上提示的mod_wsgi_py25_apache22
目录 下载 mod_wsgi.so (即我们的平台是Apache2.2+Python2.5+Django1.0.3)。
2、放置
把 mod_wsgi 放到你的Apache安装目录下的 modules 文件夹内。
3、配置Apache
在Apache配置文件httpd.conf中,增加一行:
LoadModule wsgi_module modules/mod_wsgi.so
4、修改Virtual Host配置
Apache 可以配置很多个 Named-based Virtual Hosts ,可以在一个服务器上部署多个Web Sites。
mod_python 下的 VirtualHost 配置主要复杂在 Python 配置这块,如下所示:
<VirtualHost *:80>
ServerName rt.ju690.com
ServerAlias rt.ju690.cn
DocumentRoot d:/SocialRecommend
<Location "/">
SetHandler python-program
PythonPath "['d:/SocialRecommend']+sys.path"
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE settings_yourproject
PythonAutoReload Off
PythonDebug Off
</Location>
Alias /static d:/SocialRecommend/static
<Location "/static">
SetHandler None
</Location>
<Directory "d:/SocialRecommend/static">
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>
现在改为 mod_wsgi ,只需要稍加改变即可:
<VirtualHost *:80>
ServerName rt.ju690.com
ServerAlias rt.ju690.cn
DocumentRoot D:/SocialRecommend
WSGIScriptAlias / D:\SocialRecommend\wsgi\yourproject.wsgi
Alias /static d:/SocialRecommend/static
<Location "/static">
SetHandler None
</Location>
<Directory "d:/SocialRecommend/static">
Order Deny,Allow
Allow from all
</Directory>
<Directory "d:/SocialRecommend/wsgi">
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>
WSGIScriptAlias 的定义参见 modwsgi wiki ,主要是映射一个URL到一个文件系统地址并委派目标文件为WSGI Script。
赋予本地wsgi文件夹Allow from all权限,是因为这样才能执行WSGI Script。
5、建立wsgi script
在你的web site django总目录下新建一个文件夹wsgi。
在 wsgi 文件夹下新建一个文件 yourproject.wsgi ,内容如下所示:
# complete_project.wsgi is configured to live in projects/complete_project/deploy.
# If you move this file you need to reconfigure the paths below.
import os
import sys
# redirect sys.stdout to sys.stderr for bad libraries like geopy that uses
# print statements for optional import exceptions.
sys.stdout = sys.stderr
from os.path import abspath, dirname, join
from site import addsitedir
from django.core.handlers.wsgi import WSGIHandler
sys.path.insert(0, abspath(join(dirname(__file__), "../")))
sys.path.insert(0, abspath(join(dirname(__file__), ". . /. . /")))
os.environ["DJANGO_SETTINGS_MODULE"] = "yourprojectname.settings_yourproject" #你的settings module名
application = WSGIHandler()
6、重启Aapche即可。
参考资源:
1、mod_wsgi / mod_python ;
2、Performance Estimates for mod_wsgi ;
3、How to use django with mod_wsgi 。
相关文章推荐
- Apache+Django性能优化之mod_wsgi篇
- Apache+Django性能优化之mod_wsgi篇
- 网页性能智能优化——Apache扩展mod_pagespeed
- LAMP 系统性能调优,第 2 部分: 优化 Apache 和 PHP
- Apache和Tomcat结合提高性能优化
- ubuntu 13.04 安装 apache2.2+mod_wsgi+Django
- django1.9.1+apache24+mod_wsgi详解(win)
- ubuntu下安装apache2.2+mod_wsgi+django(二)
- Python Django性能测试与优化指南
- Apache性能优化、超时设置,linux 重启apache
- [置顶] 部署Django在Windows server 2008r2 采用apache+mod_wsgi方案
- ubuntu下安装apache2.2+mod_wsgi+django(二)
- 关于Apache的性能优化(zt)
- Apache使用mod_deflate模块压缩页面优化传输速度
- How to setup Apache and mod_python and django
- apache性能优化
- 最新版windows 2012R2、Apache24、mod_wsgi、Django1.9、python3.4项目部署(生产环境)
- redhat下安装apache+python+mod_python+django
- Apache自动优化前端页面的模块mod_pagespeed应用(二)
- Apache性能优化的25个技巧