zoukankan      html  css  js  c++  java
  • mod_wsgi的工作模式和配置

    Openstack所有提供API接口的服务都是python web server,而其本身性能很弱,目前已经将它们配置到了apache上。但对于如何设置mod_wsgi的参数,我一直没有好好去阅读其文档。

    参考了mod_wsgi 的两种模式Process and Thread两篇文章后,我来归纳一下:

    目前mod_wsgi有两种工作模式:

    第一种是嵌入模式,类似于mod_python,直接在apache进程中运行,这样的好处是不需要另外增加进程,但是坏处也很明显,所有内存都和apache共享,如果和mod_python一样造成内存漏洞的话,就会危害整个apache。而且如果apache是用worker mpm,mod_wsgi也就强制进入了线程模式,这样子对于非线程安全的程序来说就没法用了。

    这种模式下需要在apache的vhost中如下设置:

    WSGIScriptAlias /path /path-to-wsgi

    即可生效,对于小型脚本的话,直接用这种模式即可。

     

    第二种是后台模式,类似于FastCGI的后台,mod_wsgi会借apache的外壳,另外启动一个或多个进程,然后通过socket通信和apache的进程联系。

    这种方式只要使用以下配置即可:

    #启动WSGI后台,site1是后台名字
    WSGIDaemonProcess site1 processes=1 threads=15 display-name=%{GROUP}
    
    #分配当前上下文应该使用哪个WSGI后台,可以放在Location里面指定
    WSGIProcessGroup site1
    
    #根据当前上下文的ProcessGroup分配到对应的后台
    WSGIScriptAlias /path /path-to-wsgi

    在这种模式下,我们可以通过调节processes和threads的值来设置三种MPM的模式:prefork', 'worker', 'winnt'。

     

    winnt模式
    WSGIDaemonProcess example threads=25
    
    
    wsgi.multithread	True
    wsgi.multiprocess	False
    
    
    此时processes=1,但是multiprocess为false
    如果显式地指出processes为1那么:
    WSGIDaemonProcess example processes=1 threads=25
    
    
    wsgi.multithread	True
    wsgi.multiprocess	True
    
    
    
    
    worker模式
    WSGIDaemonProcess example processes=2 threads=25
    
    wsgi.multithread	True
    wsgi.multiprocess	True


    preforker模式
    WSGIDaemonProcess example processes=5 threads=1
    wsgi.multithread	False
    wsgi.multiprocess	True
    

     

    后台模式由于是与apache进程分离了,内存独立,而且可以独立重启,不会影响apache的进程,如果你有多个项目(django),可以选择建立多个后台或者共同使用一个后台。

    比如在同一个VirtualHost里面,不同的path对应不同的django项目,可以同时使用一个Daemon:

    WSGIDaemonProcess default processes=1 threads=1 display-name=%{GROUP}
    
    WSGIProcessGroup default
    
    WSGIScriptAlias /project1 “/home/website/project1.wsgi”
    
    WSGIScriptAlias /project2 “/home/website/project2.wsgi”

    这样子两个django都使用同一个WSGI后台。

    也可以把不同的项目分开,分开使用不同的后台,这样开销比较大,但就不会耦合在一起了。

    display-name是后台进程的名字,这样方便重启对应的进程,而不需要全部杀掉。

    WSGIDaemonProcess site1 processes=1 threads=1 display-name=%{GROUP}
    
    WSGIDaemonProcess site2 processes=1 threads=1 display-name=%{GROUP}
    
    <Location “/project1″>
    WSGIProcessGroup site1
    </Location>
    WSGIScriptAlias /project1 “/home/website/project1.wsgi”
    
    <Location “/project1″>
    WSGIProcessGroup site2
    </Location>
    WSGIScriptAlias /project2 “/home/website/project2.wsgi”

    对于django 1.0以下的版本,由于官方认定不是线程安全的,所以建议使用多进程单线程模式

    processes=n threads=1

    对于django 1.0以后,就可以放心的使用多进程多线程模式:

    processes=2 threads=64

    这样子性能会更好。

     

  • 相关阅读:
    IntelliJ IDEA注册码
    linux中patch命令 -p 选项
    设备文件简介
    《算法导论》——矩阵
    《算法导论》——数论
    linux常用查看硬件设备信息命令(转载)
    netstat和telnet命令在Windows7中的用法(转载)
    c++容器使用总结(转载)
    离散数学——数论算法
    c语言中内存对齐问题
  • 原文地址:https://www.cnblogs.com/yuxc/p/3555005.html
Copyright © 2011-2022 走看看