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

    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

    郑昀@玩聚SR 20090810

  • 相关阅读:
    【转载】[C#]Log4net中的RollingFileAppender解析
    【转载】大数据量传输时配置WCF的注意事项
    Sql 数据引擎中删除用户名、密码信息
    win10 HTTP 错误 500.21
    SQL Server 将Id相同的字段合并,并且以逗号隔开
    C#中2个日期类型相减
    sql server 查询本年的每个月的数据
    sql server 查询本周、本月所有天数的数据
    sql server中的日期函数
    Sql Server 逻辑文件 '' 不是数据库 '' 的一部分。请使用 RESTORE FILELISTONLY 来列出逻辑文件名。
  • 原文地址:https://www.cnblogs.com/zhengyun_ustc/p/wsgi.html
Copyright © 2020-2023  润新知