<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OurApache &#187; Django</title>
	<atom:link href="http://ourapache.com/archives/tag/django/feed" rel="self" type="application/rss+xml" />
	<link>http://ourapache.com</link>
	<description>我们致力于一个Apache知识的分享网站</description>
	<lastBuildDate>Tue, 13 Apr 2010 05:18:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Apache+Django性能优化之mod_wsgi篇</title>
		<link>http://ourapache.com/archives/275</link>
		<comments>http://ourapache.com/archives/275#comments</comments>
		<pubDate>Thu, 13 Aug 2009 09:53:11 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache高级应用]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[mod_wsgi]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=275</guid>
		<description><![CDATA[我们一直使用 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 [...]]]></description>
			<content:encoded><![CDATA[<p>我们一直使用 <a href="http://www.djangoproject.com/" target="_blank">Django</a> ，玩聚的各个产品前端都是架设于 <a href="http://ourapache.com/archives/tag/django" class="st_tag internal_tag" rel="tag" title="标签 Django 下的日志">Django</a> 之上，如：<a href="http://sr.ju690.com/" target="_blank">SR</a>/<a href="http://rt.ju690.com/" target="_blank">RT</a>。如果你对 <a href="http://www.djangoproject.com/" target="_blank">Django</a> 有所了解，可以跳过下面的简介：</p>
<p>什么是<a href="http://www.djangoproject.com/" target="_blank">Django</a></p>
<p><strong>Django </strong>是一个开放源代码的Web应用框架，由Python写成，主力开发者是Adrian Holovaty。它采用了MVC的设计模式。</p>
<p><strong>Django </strong>的名字来自于比利时的爵士吉他手Django Reinhardt，他是欧陆爵士乐发展的奠基人，也是爵士史上最伟大的吉他巨匠，中国乐迷称之为“三指琴魔”。</p>
<p><strong>Django </strong>源自一个在线新闻 Web 站点，于 2005 年7月在BSD许可证下发布。Django 框架的核心组件有：</p>
<ul>
<li>用于创建模型的对象关系映射</li>
<li>为最终用户设计的管理界面</li>
<li>一流的 URL 设计</li>
<li>设计者友好的模板语言</li>
<li>缓存系统</li>
</ul>
<p>如何上手<a href="http://www.djangoproject.com/" target="_blank">Django</a></p>
<p>新手入门参考<a href="http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/" target="_blank">Django Step by Step之limodou版</a>。</p>
<p><a href="http://www.djangoproject.com/">DjangoProject.com</a> 是 Django 框架的主页。其中的文档包括：</p>
<ul>
<li><a href="http://www.djangoproject.com/documentation/install/">How to install Django</a>，展示了如何在一台开发机器上设置 Django</li>
<li><a href="http://www.djangoproject.com/documentation/db_api/">Database API reference</a>，使用 Django ORM 库的指南</li>
<li><a href="http://www.djangoproject.com/documentation/templates/">Django template language</a>，为模板作者准备的一份简单指南</li>
<li><a href="http://www.djangoproject.com/documentation/static_files/">How to serve static files</a>，如何在开发过程中通过设置 Django 来提供静态文件服务的介绍（<strong>不要</strong>在产品环境中这样做）</li>
<li><a href="http://www.djangoproject.com/documentation/modpython/">How to use Django with mod_python</a>，这是一份有关利用 mod_python 组合使用 Django 和 Apache 的指南</li>
<li><a href="http://www.djangoproject.com/documentation/generic_views/">Generic views</a>，展示了如何使用 Django 的通用视图更快地实现通用的 Web 应用程序模式</li>
</ul>
<p><strong>Django+Apache+mod_python 的用法</strong></p>
<p>一般上手搭配 Django 的是 Apache+<a href="http://www.modpython.org/" target="_blank">mod_python</a> ，从这个<a href="http://man.chinaunix.net/develop/python/mod_python/mod_python.html" target="_blank">早年间的翻译文档</a>可以了解 <a href="http://man.chinaunix.net/develop/python/mod_python/mod_python.html#head-871e5f352b5d3e7a56f7879bd1d31f478a3ae23e" target="_blank">Apache怎样处理请求</a>以及<a href="http://man.chinaunix.net/develop/python/mod_python/mod_python.html#head-1da20b19de452e61f844bf2c5900bf37bd5e9ff4" target="_blank">mod_python到底做了什么</a>。</p>
<p>不过，既然 Django 都已经在文档中说“<strong>it has been mostly superseded by the simpler </strong><a href="http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi"><em><strong>mod_wsgi deployment option</strong></em></a><strong>./mod_python 多半已被更简单的 <a href="http://ourapache.com/archives/tag/mod_wsgi" class="st_tag internal_tag" rel="tag" title="标签 mod_wsgi 下的日志">mod_wsgi</a> 替代了。</strong>”那么我们就应该一上手就用 mod_wsgi 。</p>
<p><strong>为何要切换到 mod_wsgi ？</strong></p>
<p>mod_python 其实也不差。</p>
<p>但我一直困惑于 Apache+mod_python 的莫名频繁崩溃，错误日志中会出现大量的如下错误：</p>
<blockquote><p>[error] [client X.X.X.X] OSError: [Errno 0] Error<br />
[notice] Parent: child process exited with status <strong>3221225477</strong> &#8212; Restarting.</p></blockquote>
<p>这个状态号 3221225477 基本没什么意义，再加上 OSError 0 ，这个异常日志让人很无奈。甚至在 Windows 平台下，Apache 最恶劣情况下竟然会弹出一个崩溃错误框，此时事件日志会报告：</p>
<blockquote><p>cation Popup:0:29722:26:EVENTLOG_INFORMATION_TYPE:弹出应用程序: Microsoft Visual C++ Runtime Library: Runtime Error!<br />
Program: C:\Apache2.2\bin\httpd.exe<br />
This application has requested the Runtime to terminate it in an unusual way.</p></blockquote>
<p>一直无法对症下药。于是，期冀 mod_wsgi 能让我摆脱这两个问题。</p>
<p>另一个就是性能。</p>
<p><a href="http://code.google.com/p/modwsgi/wiki/PerformanceEstimates" target="_blank">modwsgi 性能评估</a>中列出这样的数字对比：</p>
<p><strong>Mechanism </strong><strong>Requests/sec</strong></p>
<p>mod_cgi (ScriptAlias) 10</p>
<p>mod_python (PythonHandler) 400</p>
<p>mod_wsgi (WSGIDaemonProcess) 700</p>
<p>mod_wsgi (.htaccess/SetHandler) 850</p>
<p>mod_wsgi (WSGIScriptAlias) 900</p>
<p>从数字可以看出，<a href="http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIScriptAlias" target="_blank">WSGIScriptAlias</a> 是最优选择。当然这个数字也没什么，后面人家说了“任何性能提高，都将被你使用的大型Web框架如Django或TurboGears吃掉，尤其是用了数据库后端，大多数的 overhead 源自Python Web Framework以及任何访问数据库时的瓶颈。mod_wsgi上的 overhead 只是很小的一块，这一小块上的任何性能提高都很难被注意到。”</p>
<p><strong>切换到 mod_wsgi 很容易</strong></p>
<p><a href="http://blog.csdn.net/zhengyun_ustc/" target="_blank">郑昀</a>@<a href="http://rt.ju690.com/" target="_blank">玩聚RT</a> 20090810</p>
<p>1、下载</p>
<p>可以从 <a href="http://code.google.com/p/modwsgi/downloads/list" target="_blank">modwsgi 的下载目录</a> 下载你所需要的版本。</p>
<p>对于 Windows 平台，可能需要阅读“<a href="http://code.google.com/p/modwsgi/wiki/InstallationOnWindows" target="_blank">Installation On Windows</a>”，并从这个页面上提示的 <a href="http://adal.chiriliuc.com/mod_wsgi/revision_1018_2.3/mod_wsgi_py25_apache22/" target="_blank">mod_wsgi_py25_apache22 目录</a> 下载 mod_wsgi.so (即我们的平台是Apache2.2+Python2.5+Django1.0.3)。</p>
<p>2、放置</p>
<p>把 mod_wsgi 放到你的Apache安装目录下的 modules 文件夹内。</p>
<p>3、配置Apache</p>
<p>在Apache配置文件httpd.conf中，增加一行：</p>
<blockquote><p>LoadModule wsgi_module modules/mod_wsgi.so</p></blockquote>
<p>4、修改Virtual Host配置</p>
<p>Apache 可以配置很多个 Named-based <a href="http://httpd.apache.org/docs/2.2/vhosts/" target="_blank">Virtual Hosts</a> ，可以在一个服务器上部署多个Web Sites。</p>
<p>mod_python 下的 VirtualHost 配置主要复杂在 Python 配置这块，如下所示：</p>
<blockquote><p>&lt;VirtualHost *:80&gt;<br />
ServerName rt.ju690.com<br />
ServerAlias rt.ju690.cn<br />
DocumentRoot d:/SocialRecommend</p>
<p>&lt;Location “/”&gt;<br />
SetHandler python-program<br />
PythonPath “['d:/SocialRecommend']+sys.path”<br />
PythonHandler django.core.handlers.modpython<br />
SetEnv DJANGO_SETTINGS_MODULE settings_yourproject<br />
PythonAutoReload Off<br />
PythonDebug Off</p>
<p>&lt;/Location&gt;</p>
<p>Alias /static d:/SocialRecommend/static<br />
&lt;Location “/static”&gt;<br />
SetHandler None<br />
&lt;/Location&gt;<br />
&lt;Directory “d:/SocialRecommend/static”&gt;<br />
Order Deny,Allow<br />
Allow from all<br />
&lt;/Directory&gt;</p>
<p>&lt;/VirtualHost&gt;</p></blockquote>
<p>现在改为 mod_wsgi ，只需要稍加改变即可：</p>
<blockquote><p>&lt;VirtualHost *:80&gt;<br />
ServerName rt.ju690.com<br />
ServerAlias rt.ju690.cn<br />
DocumentRoot D:/SocialRecommend<br />
<strong><span style="color: #ff0000;">WSGIScriptAlias / D:\SocialRecommend\wsgi\yourproject.wsgi</span></strong><br />
Alias /static d:/SocialRecommend/static<br />
&lt;Location “/static”&gt;<br />
SetHandler None<br />
&lt;/Location&gt;<br />
&lt;Directory “d:/SocialRecommend/static”&gt;<br />
Order Deny,Allow<br />
Allow from all<br />
&lt;/Directory&gt;<br />
<strong>&lt;Directory “d:/SocialRecommend/wsgi”&gt;<br />
Order Deny,Allow<br />
Allow from all<br />
&lt;/Directory&gt;<br />
</strong>&lt;/VirtualHost&gt;</p></blockquote>
<p><a href="http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIScriptAlias" target="_blank">WSGIScriptAlias 的定义参见 modwsgi wiki</a> ，主要是映射一个URL到一个文件系统地址并委派目标文件为WSGI Script。</p>
<p>赋予本地wsgi文件夹Allow from all权限，是因为这样才能执行WSGI Script。</p>
<p>5、建立wsgi script</p>
<p>在你的web site django总目录下新建一个文件夹wsgi。</p>
<p>在 wsgi 文件夹下新建一个文件 yourproject.wsgi ，内容如下所示：</p>
<blockquote><p># complete_project.wsgi is configured to live in projects/complete_project/deploy.<br />
# If you move this file you need to reconfigure the paths below.</p>
<p>import os<br />
import sys</p>
<p># redirect sys.stdout to sys.stderr for bad libraries like geopy that uses<br />
# print statements for optional import exceptions.<br />
sys.stdout = sys.stderr</p>
<p>from os.path import abspath, dirname, join<br />
from site import addsitedir</p>
<p>from django.core.handlers.wsgi import WSGIHandler</p>
<p>sys.path.insert(0, abspath(join(dirname(__file__), “../”)))<br />
sys.path.insert(0, abspath(join(dirname(__file__), “. . /. . /”)))</p>
<p>os.environ["DJANGO_SETTINGS_MODULE"] = “yourprojectname.settings_yourproject” #你的settings module名</p>
<p>application = WSGIHandler()</p></blockquote>
<p>6、重启Aapche即可。</p>
<p>参考资源：</p>
<p>1、<a href="http://code.google.com/p/modwsgi/" target="_blank">mod_wsgi</a> / <a href="http://www.modpython.org/" target="_blank">mod_python</a> ；</p>
<p>2、<a href="http://code.google.com/p/modwsgi/wiki/PerformanceEstimates" target="_blank">Performance Estimates for mod_wsgi</a> ；</p>
<p>3、<a href="http://code.djangoproject.com/wiki/django_apache_and_mod_wsgi" target="_blank">How to use django with mod_wsgi</a> 。</p>
<h3  class="related_post_title">无相关文章，以下随机显示</h3><ul class="related_post"><li>2009年02月7号 -- <a href="http://ourapache.com/archives/89" title="Apache PHP利用HTTP缓存协议原理解析及应用">Apache PHP利用HTTP缓存协议原理解析及应用</a></li><li>2008年12月25号 -- <a href="http://ourapache.com/archives/1" title="使用gzip将你的Apache速度提高十倍">使用gzip将你的Apache速度提高十倍</a></li><li>2009年09月2号 -- <a href="http://ourapache.com/archives/299" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/121" title="apache 无法启动故障排查">apache 无法启动故障排查</a></li><li>2009年06月14号 -- <a href="http://ourapache.com/archives/253" title="Apache自动添加地址末尾的斜线">Apache自动添加地址末尾的斜线</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/211" title="Apache common-pool, common-dbcp源码解读与对象池原理剖析">Apache common-pool, common-dbcp源码解读与对象池原理剖析</a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/111" title="Apache 中内存管理的三种境界 ">Apache 中内存管理的三种境界 </a></li><li>2009年02月12号 -- <a href="http://ourapache.com/archives/132" title="apache core段的DocumentRoot与访问权限 ">apache core段的DocumentRoot与访问权限 </a></li><li>2009年02月10号 -- <a href="http://ourapache.com/archives/106" title="Apache Rewrite 规则详解">Apache Rewrite 规则详解</a></li><li>2009年03月30号 -- <a href="http://ourapache.com/archives/232" title="Apache Prefork和Worker模式的性能比较测试">Apache Prefork和Worker模式的性能比较测试</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/advanced" title="Apache高级应用" rel="tag">Apache高级应用</a>, <a href="http://ourapache.com/archives/tag/django" title="Django" rel="tag">Django</a>, <a href="http://ourapache.com/archives/tag/mod_wsgi" title="mod_wsgi" rel="tag">mod_wsgi</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/275/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

