美文网首页
django环境部署

django环境部署

作者: 十三流 | 来源:发表于2016-11-14 16:19 被阅读0次

    当前操作系统是在阿里云上的Ubuntu14,系统自带的python版本为2.7.6,而我们使用的版本为2.6.6+django1.4.2.

    pyenv搭建基础环境

    1. 首先,安装pyenv并激活
    #git pyenv到本地
    git clone git://github.com/yyuu/pyenv.git ~/.pyenv
    #配置pyenv自启动
    vi ~/.bashrc
    export PYENV_ROOT="$HOME/.pyenv"
    export PATH="$PYENV_ROOT/bin:$PATH"
    eval "$(pyenv init -)"
    #对当前shell生效
    source ~/.bashrc
    
    1. 安装python依赖库
      python在安装过程中需要ssl、sqlite等库的支持,先安装好,不然安装过程中提示缺少lib文件
    apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
    
    1. pyenv下安装python2.6.6
      pyenv的用法这里就不多说了,一搜一大把,但是在实际运行pyenv install 2.6.6的过程中,会产生令人奔溃的等待,pyenv下载速度非常慢,一直显示从“www.python.org”下载,我自己在阿里云上多台机器测试过,下载时间都大于2小时,还很容易下载失败。后来找到两种解决办法,自己只验证了方法1,十分好用
    方法1:使用国内镜像作为下载源,在shell中执行
    export  PYTHON_BUILD_MIRROR_URL="http://pyenv.qiniudn.com/pythons/"
    即可将python下载地址切换到七牛上,下载速度像打灰机
    方法2:wget python源文件(就从pyenv提示的那个源下载,wget速度反而还挺快的,不知道为啥pyenv没那么快),以下为道听途说,未实际验证
    把下载下来的包放到pyenv的cache目录,一般为~/.pyenv/cache,然后执行pyenv install此版本,即可用本地缓存
    
    1. 安装python库
      到这里后几乎都是一马平川了,pyenv安装python后自带了对应的pip版本,要什么库,pip install一下就好了,当然了PIL稍微复杂一些,如果是阿里云的Ubuntu系统,pip肯定是装不了的,我们还是本着解决问题的态度,手动编译PIL。
      下载PIL文件后解压
    wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
    tar zxvf Imaging-1.1.7.tar.gz
    cd Imaging-1.1.7
    python setup.py build #运行后不出意外应该是下面的结果
    *** TKINTER support not available (Tcl/Tk 8.6 libraries needed)
    *** JPEG support not  available
    *** ZLIB (PNG/ZIP) support not  available
    *** FREETYPE2 support not  available
    *** LITTLECMS support not available
    

    如果现在使用python setup.py install安装上,在实际处理图片的时候,肯定是会报图片格式不支持的错误的,因为build的结果是不支持任何类型的图片的,***为当前没找到支持的库,---表示当前系统内找到支持的库。

    TKINTER、LITTLECMS格式的图片,现在项目中也不会支持,我们需要支持JPEG、ZLIB、FREETYPE2格式,做如下操作

    apt-get install python-dev libjpeg-dev libfreetype6-dev zlib1g-dev
    ln -s /usr/lib/`uname -i`-linux-gnu/libfreetype.so /usr/lib/
    ln -s /usr/lib/`uname -i`-linux-gnu/libjpeg.so /usr/lib/
    ln -s /usr/lib/`uname -i`-linux-gnu/libz.so /usr/lib/
    ln -s freetype2 freetype
    python setup.py build #运行后不出意外应该是下面的结果
    *** TKINTER support not available (Tcl/Tk 8.6 libraries needed)
    --- JPEG support available
    --- ZLIB (PNG/ZIP) support available
    --- FREETYPE2 support available
    *** LITTLECMS support not available
    
    python setup.py install #执行安装
    

    好了,安装好python库后保证使用python manage.py runserver 0.0.0.0:8008能够跑起来,并且在浏览器访问可以正常访问,那么基础环境也就完成了,现需要配置uwsgi+nginx

    uwsgi配置+nginx配置

    对于uwsgi和nginx的认识,我并不是很充分,只是知道nginx和django程序通过uwsgi通信,首先以uwsgi启动django,监听一个本地端口或socket,nginx将请求转发到uwsgi。

    uwsgi本身也可以作为web服务器使用,直接提供对外的web服务,但是在安全性、访问控制方面做得还不够好,所以一般不会直接使用uwsgi做服务器程序,而是使用更强大的nginx做服务器,由nginx转发请求到uwsgi。

    uwsgi

    如果uwsgi还未装好,请先安装uwsgi

    pip install uwsgi #安装对应python版本的uwsgi
    
    

    uwsgi的配置有长篇大论,没来得及一一看完,这里仅仅列举我们所用到的配置文件示例(uwsgi版本:2.0.14)
    uwsgi配置示例:服务使用了websocket,uwsgi.ini文在/project-path/uwsgi-config/下

    [uwsgi]
    chdir = %d../  #指定project目录为主目录
    master = true #以独立守护进程运行
    env = DJANGO_SETTINGS_MODULE=project_name.settings #项目的settings模块路径
    module = project_name.wsgi:application #wsgi的application模块路径
    socket=/project_dir/project.sock #本地监听的socket
    http-websockets  #websokcet over http,官放文档说nginx >= 1.4 works fine and without additional configuration.
    gevent=100  #gevent协程支持,最大100个
    gevent-monkey-patch #gevent协程补丁
    processes = 2 #2个处理进程
    enable-threads = true #允许在请求中开启新线程
    listen=300 #监听队列
    daemonize=uwsgi.daemonize.log  #日志文件
    memory-report #日志记录请求的内存等详细信息
    

    启动uwsgi并查看日志

    uwsgi -i uwsgi-config/uwsgi.ini
    tail uwsgi.daemonize.log #查看日志的最后是否有工作进程启动的消息,看到如下信息,即表明uwsgi已启动,理论上的并发峰值为gevent*processes 数,这里为100*2,最大200个并发
    spawned uWSGI master process (pid: 329)
    spawned uWSGI worker 1 (pid: 330, cores: 100)
    spawned uWSGI worker 2 (pid: 331, cores: 100)
    

    nginx

    现在配置nginx,使得请求转发到刚配置的uwsgi

    server {
            server_name www.domain.com default; 
    
            root /project_dir; #设置主目录
    
            listen 80 ; 
            access_log /project_dir/access.log; 
            error_log /project_dir/error.log error; 
    
            location / {
                    include uwsgi_params;  
                    uwsgi_pass unix:///project_dir/project.sock; #uwsgi中设置的socket路径
            }
    
            location /static {
                    alias /project_dir/static;
                    expires 15d;
            }
    
            location /favicon.ico {
                    log_not_found off;
                    alias /project_dir/favicon.ico;
            }
    
            location /site_media {
                    alias /project_dir/media;
                    expires 15d;
            }
    }
    

    nginx -t检测一下,如果没有问题,使用nginx -s reload 重启服务后,基本配置就完成啦。

    相关文章

      网友评论

          本文标题:django环境部署

          本文链接:https://www.haomeiwen.com/subject/itphpttx.html