设为首页 收藏本站
查看: 874|回复: 0

[经验分享] Apache+Django性能优化之mod_wsgi篇

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-30 14:42:25 | 显示全部楼层 |阅读模式
  郑昀@玩聚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  框架的主页。其中的文档包括:


  • 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 的下载目录 下载你所需要的版本。
  对于 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 配置这块,如下所示:
  
    ServerName rt.ju690.com  
    ServerAlias rt.ju690.cn
    DocumentRoot  d:/SocialRecommend

       
       SetHandler  python-program
       PythonPath "['d:/SocialRecommend']+sys.path"  
       PythonHandler django.core.handlers.modpython
       SetEnv  DJANGO_SETTINGS_MODULE settings_yourproject
       PythonAutoReload Off  
       PythonDebug Off

     
      Alias /static d:/SocialRecommend/static
      
            SetHandler None
      
      
       Order Deny,Allow
       Allow from all
     

  
  现在改为 mod_wsgi ,只需要稍加改变即可:
  
    ServerName rt.ju690.com
    ServerAlias  rt.ju690.cn
    DocumentRoot D:/SocialRecommend
    WSGIScriptAlias /  D:\SocialRecommend\wsgi\yourproject.wsgi
    Alias /static  d:/SocialRecommend/static
     
             SetHandler None
     
     
       Order Deny,Allow
       Allow  from all
     
     
       Order Deny,Allow
       Allow from  all
     

  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-92320-1-1.html 上篇帖子: apache服务器本质 下篇帖子: Apache Lucene 3.x推荐教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表