前言

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

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

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

一、virtualenv虚拟环境配置

virtualenv安装和配置

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

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

  1. cd /var/www/
  2. virtualenv-2.7 dnsadmin
  3. cd dnsadmin/
  4. source bin/activate
  5. #进入虚拟环境,提示符将会切换
  6. (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. . 创建虚拟环境
  2. $ mkvirtualenv env 命令表示在 $WORKON_HOME 目录下创建了一个 env 虚拟环境。
  3. . 启动虚拟环境
  4. $ workon env 命令表示启用了 env 虚拟环境。workon 命令会自动停用当前所处的虚拟环境(如果存在的话)然后启动指定的虚拟环境,这样你就可以快速在各个虚拟环境之间切换。另外 workon 命令还提供了虚拟环境名称自动补完功能以帮助你选择虚拟环境。
  5. . 退出虚拟环境
  6. 执行 $ deactivate 命令退出虚拟环境。
  7. . 删除虚拟环境
  8. 执行 $ rmvirtualenv env 命令删除 env 虚拟环境。
  9. . 其他命令
  10. lsvirtualenv 显示所有虚拟环境。
  11. cdvirtualenv 跳转至当前虚拟环境目录,方便查看虚拟环境的 site-packages 目录。
  12. cdsitepackages 直接跳转至当前虚拟环境的 site-packages 目录。
  13. lssitepackages 显示当前虚拟环境的 site-packages 目录内容。

创建vir环境(利用virtualenvwrapper)

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

  1. mkvirtualenv dnsadmin
  2. cdvirtualenv

二、利用gunicorn来运行django

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

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

vi require.txt

  1. xlwt==1.0.
  2. xlwt-future==0.8.
  3. xlrd
  4. gunicorn
  5. gevent #这个需要安装,默认gunicorn使用同步阻塞的模型(-k sync),安装后可以使用gevent模型性能更好
  1. pip install -r require.txt --trusted-host 10.199.117.11
  2. pip2tgz . django==1.7.5 #手动下载django安装包并安装,(自己的pip源里没有)
  3. 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里进行配置

  1. INSTALLED_APPS = (
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'web_models',
  9. 'web_manage',
  10. 'gunicorn', #增加gunicorn
  11. )

#之后就可以运行gunicorn了

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

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

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

 vim gun.conf

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

启动:

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

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

  1. [-- :: +] [] [INFO] Starting gunicorn 19.4.
  2. [-- :: +] [] [INFO] Listening at: http://0.0.0.0:8000 (42836)
  3. [-- :: +] [] [INFO] Using worker: gevent
  4. [-- :: +] [] [INFO] Booting worker with pid:
  5. [-- :: +] [] [INFO] Booting worker with pid:

三、通过apache配置动静分离

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

配置apache:

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

  1. <IfModule mod_proxy.c>
  2. ProxyRequests Off
  3. ProxyPreserveHost On
  4. </IfModule>
  5. <Proxy *>
  6. Order deny,allow
  7. Allow from all
  8. </Proxy>

之后在虚拟主机配置里

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

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

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

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

四、通过supervisor管理gunicorn进程

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

安装

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

之后在此文件最后

  1. [program:dnsadmin] #守护的程序名称
  2. environment=PYTHON_EGG_CACHE=/var/www/envs/dnsadmin/.python-eggs/ #这有个坑,需要配置,不然会找到/root下,报无权限的错误
  3. command=/var/www/envs/dnsadmin/bin/gunicorn -c /var/www/envs/dnsadmin/cmdbdemo/gun.conf cmdbdemo.wsgi #此为启动cmd
  4. directory=/var/www/envs/dnsadmin/cmdbdemo #命令运行目录
  5. autostart=true
  6. autorestart=true
  7. user=apache
  8. stdout_logfile=/var/www/dnsadmin/supervisor/logs/gunicorn_dnsadmin.log
  9. stderr_logfile=/var/www/dnsadmin/supervisor/logs/gunicorn_dnsadmin.err
  1. 启动supervisord
  2. /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的后台控制

  

五、配置自动启动

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

参考资料:

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

  

apache(nginx)+django+virutalenv(virtualenvwrapper)+gunicorn+supervisor配置高效web环境的更多相关文章

  1. virtualenv 环境下 Nginx + Flask + Gunicorn+ Supervisor 搭建 Python Web

    在这篇文章里,我们将搭建一个简单的 Web 应用,在虚拟环境中基于 Flask 框架,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理进程,然后使用 Python 探针来监测应 ...

  2. Apache负载均衡与Tomcat集群配置学习(Windows环境)

    本文主要参考自http://www.iteye.com/topic/985404?dhcc,经由实际操作配置操并记录而成. 由于最近的一个Java开发项目用到了Tomcat中间件作为web服务器,刚开 ...

  3. centos上安装配置java WEB环境_java(转)

    趁着十一期间,好好的写写随笔来记录自己所学.所践和所得,不足之处,欢迎各位拍砖~~~ 工具:Xftp 5.Xshell 5 一.安装jdk 1. 使用Xftp 5把jdk-8u65-linux-x64 ...

  4. 【netcore基础】ubuntu 16.04 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动

    今天来整理下 netcore 在 linux(ubuntu) 上的运行环境搭建 对应版本 ubuntu 16.04 .net core 2.1 nginx version: nginx/1.10.3 ...

  5. Apache、php、mysql单独安装配置

    php, 安装版的,http://www.php.net/manual/zh/install.php.也有不安装版直接配置的. 在Windows 7下如何进行PHP配置环境. PHP环境在Window ...

  6. Centos7 + Python3.6 + Django + virtualenv + gunicorn + supervisor 环境配置详解

    跟着网上的教程走发现行不通阿!好多都是写个大概,而且每人的环境都是有些许差异的,比如说权限问题阿,等等都会造成安装的失败 说明:本教程在你已经拥有Centos7系统,已经安装好nginx服务器,已经安 ...

  7. 给我一台全新的服务器,使用nginx+gunicorn+supervisor部署django

    0.准备工作 在一台全新的服务器中新建用户以及用户的工作目录,之后的操作都以这个用户的身份进行,而不是直接用root. 举个栗子: 在服务器下新建用户rinka并赋予sudo权限 1) root登陆, ...

  8. 项目的发布(nginx、uwsgi、django、virtualenv、supervisor)

    导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架 ...

  9. flask +gevent+nginx+Gunicorn+supervisor部署flask应用

    上篇   可以完美部署flask ,但是视乎在结合gevent+apscheduler 实现异步非阻塞后台和定时任务的时候视乎不是那么完美.请教了前辈,决定使用flask+gevent+nginx+g ...

随机推荐

  1. JavaScript调试工具

    最常用的最有效的有三个: 1. FireFox浏览器的Firebug,我用得不多 2. IE 8浏览器的Microsoft Script Editor.当运行网页的脚本出错时,会报错,如下所示: 单击 ...

  2. 使用knockout-sortable实现对自定义菜单的拖拽排序

    在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...

  3. 【Hello CC.NET】巧用模板简化配置

    从 <[Hello CC.NET]CC.NET 实现自动化集成> 到 <[Hello CC.NET]自动化发布时 Web.config 文件维护> ,大神在评论里提到的方案还没 ...

  4. Linux Ubuntu上手动安装.NET Core SDK

    今天重装了一台Linux服务器的Ubuntu 14.04系统,需要重新安装.NET Core 1.0. 按照官网上的文档用apt-get命令进行安装: sudo sh -c 'echo "d ...

  5. log4net按时间日期,文件大小和个数生成日志文件

    从启动模板生成的基于ABP的应用默认使用的log4net日志框架,当然你也可以使用其他的日志框架. ABP默认的log4net.config配置文件配置的很简单,将所有的日志都写到了一个txt文件中, ...

  6. 自动升级系统OAUS的设计与实现(续) (附最新源码)

    (最新OAUS版本请参见:自动升级系统的设计与实现(续2) -- 增加断点续传功能) 一.缘起 自从 自动升级系统的设计与实现(源码) 发布以后,收到了很多使用者的反馈,其中最多的要求就是希望OAUS ...

  7. 人人都是 DBA(III)SQL Server 调度器

    在 SQL Server 中,当数据库启动后,SQL Server 会为每个物理 CPU(包括 Physical CPU 和 Hyperthreaded)创建一个对应的任务调度器(Scheduler) ...

  8. MySQL--将MySQL数据导入到SQL Server

    随着时代的进步,社会的发展,各种技术层出不穷五花八门乱七八糟数不胜数(写作文呢!!!) 不扯废话,简单而言,很多公司都会同时使用多种数据库,因此数据在不同数据库之间导入导出就成为一个让人蛋疼的问题,对 ...

  9. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  10. YprogressBar,html5进度条样式,js进度条插件

    简介 YprogressBar是一款基于HTML5的进度条插件. YprogressBar是一款轻量级进度条插件,使用方便,资源占用少,模仿好压的解压界面,带有数字显示,同时支持在描述中增加参数,以动 ...