• apache(nginx)+django+virutalenv(virtualenvwrapper)+gunicorn+supervisor配置高效web环境


    前言

    django的调试模式配置简单,用于测试十分方便,但众所周知,这个只适合于调试,生产上运行效率十分低下。

    后来考虑用nginx+uwsgi的模式进行,但之前配置过apache+wsgi的方式,感觉配置起来十分繁琐,后来发现了神器gunicorn,兼顾性能的同时,配置起来像django调试模式一样简单,它有点类似于一个容器(类似tomcat),但无法处理静态资源,所以必须要有apache或者nginx的配合(动静分离)。

    考虑环境的整洁性,将整个项目先运行在virtualenv上。

    一、virtualenv虚拟环境配置

    virtualenv安装和配置

    pip install virtualenv virtualenvwrapper #virtualenvwrapper是用于管理virtualenv虚拟环境 
    

    virtualenv管理方式(未使用,仅做介绍):

    cd /var/www/
    virtualenv-2.7 dnsadmin
    cd dnsadmin/
    source bin/activate
    #进入虚拟环境,提示符将会切换
    (dnsadmin)[root@BJS0-B117-102 dnsadmin]# 
    

    使用virtualenvwrapper管理:

    使用virtualenvwrapper的一个优势,就是方便切换不同的虚拟环境,另外最大的一个优点是可以和操作系统结合起来,编写脚本可以通过workon放入到crontab或其他脚本中

    export WORKON_HOME=/var/www/envs  #设定工作目录,此目录下可以存放多个虚拟环境

    可将这句话写入~root/.bash_profile,在切换用户时自动切换

    source /usr/bin/virtualenvwrapper.sh  #根据WORKON_HOME初始化环境,会自动创建WORKON_HOME

    之后就可以使用virtualenvwrapper的一系列命令了(比virtualenv方便)

    用法参考:

    1. 创建虚拟环境
    $ mkvirtualenv env 命令表示在 $WORKON_HOME 目录下创建了一个 env 虚拟环境。
    2. 启动虚拟环境
    $ workon env 命令表示启用了 env 虚拟环境。workon 命令会自动停用当前所处的虚拟环境(如果存在的话)然后启动指定的虚拟环境,这样你就可以快速在各个虚拟环境之间切换。另外 workon 命令还提供了虚拟环境名称自动补完功能以帮助你选择虚拟环境。
    3. 退出虚拟环境
    执行 $ deactivate 命令退出虚拟环境。
    4. 删除虚拟环境
    执行 $ rmvirtualenv env 命令删除 env 虚拟环境。
    5. 其他命令
        • lsvirtualenv 显示所有虚拟环境。
        • cdvirtualenv 跳转至当前虚拟环境目录,方便查看虚拟环境的 site-packages 目录。
        • cdsitepackages 直接跳转至当前虚拟环境的 site-packages 目录。
        • lssitepackages 显示当前虚拟环境的 site-packages 目录内容。

     创建vir环境(利用virtualenvwrapper)

    创建完毕,并进入到工作目录

    mkvirtualenv dnsadmin
    cdvirtualenv

    二、利用gunicorn来运行django

    pip install xlwt --trusted-host 10.199.117.11  #117.11是我之前配置的一个内网pip源,测试安装一个python模块

    #也可以编辑一个汇总文件

    vi require.txt

    xlwt==1.0.0
    xlwt-future==0.8.0
    xlrd
    gunicorn
    gevent  #这个需要安装,默认gunicorn使用同步阻塞的模型(-k sync),安装后可以使用gevent模型性能更好
    pip install -r require.txt --trusted-host 10.199.117.11
    pip2tgz . django==1.7.5  #手动下载django安装包并安装,(自己的pip源里没有)
    pip install Django-1.7.5-py2.py3-none-any.whl 
    

    #上传已有django代码包并解压缩到/var/www/envs/dnsadmin/

    #我的项目叫cmdbdemo

    /var/www/envs/dnsadmin/cmdbdemo

    #如果要使用gunicorn,需要在django的settings里进行配置

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'web_models',
        'web_manage',
        'gunicorn',   #增加gunicorn
    )

    #之后就可以运行gunicorn了

    #你可以直接用命令行运行cd /var/www/envs/dnsadmin/cmdbdemo && gunicorn cmdbdemo.wsgi -b 0.0.0.0:8000

    #启动一个默认的gunicorn进程监听8000端口,或者用nohup方式放在后台

    #也可以编辑一个配置文件来加载,为了后续方便维护,我编写了一个配置文件

     vim gun.conf 

    bind = '0.0.0.0:8000'     #监听端口
    workers = 2               #负责处理请求的线程数
    worker_class = "gevent"   #默认sync,使用的网络模型
    worker_connections = 200  #同时最大连接数
    #daemon = True            #是否后台运行,因为使用了supervisor,gunicorn不需要运行daemon模式
    pidfile = 'gunicorn.pid'  #pid文件
    reload = True             #当代码有更新的话自动重启workers,有点类似于调试模式
    #accesslog = "access.log" #可配置log,我没配
    #errorlog = "error.log"

    启动:

    /var/www/envs/dnsadmin/bin/gunicorn -c /var/www/envs/dnsadmin/cmdbdemo/gun.conf cmdbdemo.wsgi  #cmdbdemo.wsgi为cmdbdemo目录下的wsgi.py文件(由django生成)

    如果没选择后台运行执行后,打印以下信息就说明启动ok了,并用了gevent模式

    [2016-01-07 09:25:37 +0000] [42836] [INFO] Starting gunicorn 19.4.5
    [2016-01-07 09:25:37 +0000] [42836] [INFO] Listening at: http://0.0.0.0:8000 (42836)
    [2016-01-07 09:25:37 +0000] [42836] [INFO] Using worker: gevent
    [2016-01-07 09:25:37 +0000] [42841] [INFO] Booting worker with pid: 42841
    [2016-01-07 09:25:37 +0000] [42842] [INFO] Booting worker with pid: 42842

    三、通过apache配置动静分离

    gunicorn容器无法处理静态资源,需要apache或者nginx的配合,nginx很简单形式和apache类似(做2个location,/static/下的本地处理,/的转走proxy_pass

    配置apache:

    首先需要有mod_proxy这个模块然后打开

    <IfModule mod_proxy.c>
    ProxyRequests Off
    ProxyPreserveHost On
    </IfModule>
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    之后在虚拟主机配置里

    <VirtualHost *:80>
    ServerName  dnsadmin2.intra.test.cn
    DocumentRoot /var/www/envs/dnsadmin/cmdbdemo/  #这个目录是django目录,下边有静态目录/static/
    LogFormat "%h %l %u %t %V "%r" %>s %D %T %b "%{Referer}i"" wdaccess
    SetEnvIf Request_Method "^OPTIONS$" nolog
    ErrorLog "|/usr/sbin/rotatelogs  /var/log/httpd/dnsadmin_error_log_%Y-%m-%d 86400 +480"
    CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/dnsadmin_access_log_%Y-%m-%d 86400 +480" wdaccess env=!nolog
    ProxyRequests off
    ProxyPass /static !   #/static/不转发
    ProxyPass / http://127.0.0.1:8000/  #/的转发给gunicorn
    </VirtualHost>

    另外如果使用django自带的admin,需要手动把admin的静态资源放入到apache内

    #把django-admin中的相关静态资源也放到static目录下

    cd /var/www/envs/dnsadmin/lib/python2.7/site-packages/django/contrib/admin/static
    cp -r admin/ /var/www/envs/dnsadmin/cmdbdemo/static/

    四、通过supervisor管理gunicorn进程

    gunicorn自带没有启停方式,且通过Supervisor可以实现对gunicorn的监护,如果gunicorn挂掉会自动给重启

    安装

    pip install supervisor --trusted-host 10.199.117.11  
    cd /var/www/envs/dnsadmin
    mkdir -p supervisor/logs
    cd /var/www/envs/dnsadmin/supervisor && echo_supervisord_conf > supervisor.conf #初始化配置

    之后在此文件最后

    [program:dnsadmin]  #守护的程序名称
    environment=PYTHON_EGG_CACHE=/var/www/envs/dnsadmin/.python-eggs/  #这有个坑,需要配置,不然会找到/root下,报无权限的错误
    command=/var/www/envs/dnsadmin/bin/gunicorn -c /var/www/envs/dnsadmin/cmdbdemo/gun.conf cmdbdemo.wsgi #此为启动cmd
    directory=/var/www/envs/dnsadmin/cmdbdemo  #命令运行目录
    autostart=true
    autorestart=true
    user=apache
    stdout_logfile=/var/www/dnsadmin/supervisor/logs/gunicorn_dnsadmin.log
    stderr_logfile=/var/www/dnsadmin/supervisor/logs/gunicorn_dnsadmin.err
    启动supervisord
    /var/www/envs/dnsadmin/bin/supervisord -c /var/www/envs/dnsadmin/supervisor/supervisor.conf  #启动super,如果配置了autostart的进程会自动启动

    之后关闭python后会被supervisor自动拉起来

    如果修改了supervisor.conf配置文件,可以执行supervisorctl -c supervisor.conf reload重新加载配置

    之后就可以通过supervisord控制gunicorn的启停了

    supervisorctl -c supervisor.conf start dnsadmin

    supervisorctl -c supervisor.conf stop dnsadmin

    这里需要注意一点就是,如果用supervisor这种启动模式控制进程,那么gunicorn就不要使用后台模式了,本身supervisor就相当于daemon了,编辑gun.conf,将#daemon = True注释掉

    同样也可以通过9001的后台控制

      

    五、配置自动启动

    #virtualenv run django-dnsadmin project####
    export WORKON_HOME=/var/www/envs
    source /usr/bin/virtualenvwrapper.sh
    workon dnsadmin
    /var/www/envs/dnsadmin/bin/supervisord -c /var/www/envs/dnsadmin/supervisor/supervisor.conf
    deactivate
    ###########################################
    将以上内容放入rc.local

    参考资料:

    http://docs.gunicorn.org/en/stable/  gunicorn官网

      

  • 相关阅读:
    开始学习
    C# Excel批注“哪种开发语言最好”
    [LeetCode] Longest Substring Without Repeating Characters
    (Android 即时通讯) [悬赏],不管是谁发现一个漏洞奖励人民币1000元!
    10进制转16进制
    【2】按照Django官网,创建一个web app 创建app/创建相应的数据库表
    HTML5新特性之WebSocket
    Drupal 7模板(主题钩子)的建议
    检測磁盘驱动的健康程度SMART
    BZOJ2527: [Poi2011]Meteors
  • 原文地址:https://www.cnblogs.com/caseast/p/5110365.html
Copyright © 2020-2023  润新知