Apache+Django性能优化之mod_wsgi篇

简介:

郑昀@玩聚SR 20090810

我们一直使用 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 框架的主页。其中的文档包括:

 

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 的下载目录 下载你所需要的版本。

对于 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中,增加一行:

 

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 。

郑昀@玩聚SR 20090810

目录
相关文章
|
6月前
|
存储 缓存 算法
Apache Iceberg 表有哪些性能优化方式
Apache Iceberg 表有哪些性能优化方式
113 0
|
SQL 存储 缓存
Apache Calcite 框架 50 倍性能优化实践
某天临时被当成壮丁拉去参加一个非常牛逼的应用监控平台(后续会开源),然后大佬就给我派了一个任务,要将项目中的查询性能优化 50 倍以上,大佬对我如此地寄予厚望,我怎么能让大佬失望呢(虽然我内心瑟瑟发抖)?于是我就开始了这段性能优化之旅。
1287 0
Apache Calcite 框架 50 倍性能优化实践
|
流计算 Apache 分布式计算
带你读《Flink原理、实战与性能优化》之一:Apache Flink介绍
这是一部以实战为导向,能指导读者零基础掌握Flink并快速完成进阶的著作,从功能、原理、实战和调优等4个维度循序渐进地讲解了如何利用Flink进行分布式流式应用开发。作者是该领域的资深专家,现就职于第四范式,曾就职于明略数据。
|
SQL 缓存 Serverless
Django ORM性能优化之count和len方法的选择
Django ORM性能优化之count和len方法的选择
Django ORM性能优化之count和len方法的选择
|
安全 Apache Perl
Apache之三种工作模式和配置性能优化
Apache之三种工作模式和配置性能优化
174 0
Apache之三种工作模式和配置性能优化
|
中间件 关系型数据库 Apache
Windows+Apache+Python+Django 踩坑记录
Windows+Apache+Python+Django 踩坑记录摘要  使用Python进行Web项目开发;相对于主流三大Web端解决方案(Java/.NET/PHP) Python在某些方面具有一定的优势,相对 Java/.NET 有更轻量级的部署方案,相对PHP有更安全开放的环境支持,这些不同点几乎完全取决于Python语言本身的特性。
3135 0
|
SQL 缓存 数据库
Django的性能优化
Django的性能优化一,利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的。在这里算是题外话,挑两点通用的说说:  索引,给关键的字段添加索引,性能能更上一层楼,如给表的关联字段,搜索频率高的字段加上索引等。
1147 0
|
Apache Python 前端开发
Python(Django)项目与Apache的管理交互
(开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python)、Apache、Wsgi(必须文件) 首先需要电脑有Python基础下并且安装好Django的环境,下载Apache文件和Wsgi文件。
1467 0
|
Apache Python
Winserver+Apache+django部署
废话不多说,干货直接上。 winserver2012 + django2.0.1 + apache 部署过程 1 ,python ==> 3.4 64位 https://www.python.org/downloads/release/python-353/2 ,django ==> 2.
2023 0

推荐镜像

更多