• 搭建高性能的 Django 服务器栈


    http://logic0.blog.163.com/blog/static/18892814620136258532112/


    搭建高性能的 Django 服务器栈  

    2013-07-25 23:00:22|  分类: Django学习 |  标签:django  服务器配置  服务器搭建  环境配置  网站   |举报 |字号 订阅

    对不起各位,我有点稍微标题党了。
    本文针对裸机 Linux 搭建 Django 的服务器栈,可直接应用在Linode,阿里云等VPS上。
    Linux:Ubuntu 12.04 + ,其他版本类似
    说明:
    # 以#开头表示注释,
    $ 这里是需要执行的命令 <尖括号包含需要你自己定义的内容>
    

    ○、连接VPS或者服务器

          不多说,putty就是个不错的工具,如果你本地有mac或者linux就更好了

    一、升级软件包,打补丁

    # 更新本地包的索引,这个必须做
    $ sudo apt-get update
    
    # 升级所有软件包
    $ sudo apt-get dist-upgrade
    
    # 删除不需要的软件包
    $ sudo apt-get autoremove
    
    # 重启系统,大多数时候不需要,但少数需要重启,以防万一还是重启下的好
    $ sudo reboot
    二、安装Python,及Python包安装工具

    首先是Python 包 和 Python 开发包
    $ sudo apt-get install build-essential python-dev

    安装 distribute 和 pip

    # 下载 distribute 安装文件, curl 不可用也可以用 wget http://python-distribute.org/distribute_setup.py
    $ curl -O http://python-distribute.org/distribute_setup.py
    
    # 安装distribute
    $ sudo python distribute_setup.py
    
    # 安装文件可以删除了
    $ rm distribute*
    
    # 用 distribute 安装 pip
    $ sudo easy_install pip
    三、安装virtualenv,提供虚拟环境执行支持

    
    # 安装 virtualenv 和 virtualenvwrapper
    $ sudo pip install virtualenv virtualenvwrapper
    
    # 编辑用户的bash配置文件
    $ vim .bashrc
    # 在文件末尾增加下边这一行,让 virtualenvwrapper.sh 能自动执行,给shell添加命令
    source /usr/local/bin/virtualenvwrapper.sh
    # 保存文件退出
    
    # 可以使用exit 推出重新登录,使 virtualenvwrapper 生效,也可以使用source 使之生效
    $ exit
    怎么使用 virtualenv

    # 创建一个虚拟运行环境,一般使用 VIRTUALENV_NAME=你的project名字就好。<>包含的是需要你自己指定的东西,以下不再说明 
    $ mkvirtualenv <VIRTUALENV_NAME>
    
    # 创建完后会自动启动虚拟环境,使用 deactivate 可退出
    $ deactivate
    
    # 激活特定的虚拟环境 或者 更改到另一个虚拟环境,执行下边的命令
    $ workon <VIRTUALENV_NAME>
    通过下边的命令你可以看到 系统环境 和 虚拟环境 的不同
    # 退出虚拟环境,如果你在虚拟环境内的话
    $ deactivate
    $ pip freeze                  # pip freeze 可以查看都安装了哪些软件包及其版本
    $ workon <VIRTUALENV_NAME>    # 切换到虚拟环境
    $ pip freeze                  # 查看虚拟环境内的软件包及版本,就可以发现不同
    ================= 以下操作均在虚拟环境内进行,不再说明 ==================

    四、安装Django
    # 安装最新版的Django,需要特定版本请查看 pip 指定版本的方法
    $ pip install django
    
    # 安装 docutils, Django 的 admin 会用到这个
    $ pip install docutils
    
    # 测试 Django 是否安装成功
    $ django-admin.py startproject <APP_NAME>
    $ cd <APP_NAME>
    # 给 manage.py 运行权限
    $ chmod +x manage.py
    # 测试服务器,如果只是在本机测试则不需要指定 0.0.0.0
    $ ./manage.py runserver 0.0.0.0:8000
    五、安装 PIL/PILLOW,提供图形支持
    python 图形库,例如验证码、二维码之类的会用到。
    # 给系统添加相应的图形软件包支持,这步要在最先执行,因为PIL 需要编译,如果没有jpeg就无法支持.jpg图片
    $ sudo apt-get install libjpeg8-dev libfreetype6-dev zlib1g-dev
    
    # 以下两个任选一个,有人说 PIL 偶尔会有问题,如果你也不确定,那就选 Pillow 吧
    $ pip install pillow
    $ pip install pil
    六、安装数据库
    选择MySQL,怪我不才,只对MySQL熟悉一些,你选别的也可以
    # 安装 MySQL
    $ sudo apt-get install mysql-server libmysqlclient-dev
    # 安装 MySQL 的 Python 连接器
    $ pip install MySQL-Python 
    七、安装South,增强scheme管理
    这个不是强制的,但确是极推荐的。Django 自带的 Scheme 管理器不能对 表结构变更起效,当你改变Model 的时候,必须手工的更改数据库表结构,何其蛋疼,何其容易出错。
    $ pip install south
    
    # 将 south 加到你的 Django 工程的配置文件里
    $ vim <YOUR_APP>/settings.py
    INSTALLED_APPS = 
        ...
        'south',
        ...
    八、安装 memcached,提供cache
    KV cache,减少数据库查询数量 和 增强性能
    # 安装 memcached 和 开发包
    $ sudo apt-get install memcached libmemcached-dev
    
    # 安装 memcached 的 Python 连接器,有很多同类型的连接器,推荐pylibmc
    $ pip install pylibmc
    
    # 修改 Django project 的配置文件settings.py,添加 cache 支持
    $ vim <YOUR_APP>/settings.py
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }
    九、安装 RabbitMQ 和 celery ,提供异步执行支持
    RabbitMQ,安装完必须要 创建用户 并 赋权
    $ sudo apt-get install rabbitmq-server
    $ sudo rabbitmqctl add_user <RABBIT_USER> <RABBIT_PASSWORD>
    $ sudo rabbitmqctl add_vhost <RABBIT_VHOST>
    $ sudo rabbitmqctl set_permissions -p <RABBIT_VHOST> <RABBIT_USER> ".*" ".*" ".*"
    celery ,安装很简单,但是要对 Django project 的 settings.py 进行配置
    # 通过pip 安装
    $ pip install django-celery
    
    $ vim <YOUR_APP>/settings.py
    
    # 将 djcelery 应用安装到当前的 project
    INSTALLED_APPS = 
        ...
        'djcelery',
        ...
    
    # 乱七八糟的配置,甭管具体是啥了,加上就是了,注意修改需要自定义的部分
    BROKER_URL = "amqp://<RABBIT_USER>:<RABBIT_PASSWORD>@localhost:5672/<RABBIT_VHOST>"
    CELERY_RESULT_BACKEND = "database"
    CELERY_RESULT_DBURI = "mysql://<DB_USER>:<DB_PASSWORD>@localhost/<DB_NAME>"
    
    # 把这两行放到 settings.py 文件尾
    import djcelery
    djcelery.setup_loader()
    十、安装 Gunicorn 提供网站服务器
    apache + mod_wsgi,uWSGI 都是不错的选择,但是看你个人的爱好了。gunicorn 不需要多少配置就能工作得不错,还是值得用的。
    # pip 安装 Gunicorn
    $ pip install gunicorn
    
    # 将 Gunicorn 添加到你的 Django project 中
    $ vim <YOUR_APP>/settings.py
    INSTALLED_APPS =
        ...
        'gunicorn',
        ...
    Gunicorn 有好多的命令参数,你可以看 Gunicorn document ,一般用4个worker ,同时支持gevent 就好了
    测试Gunicorn
    $ ./manage.py run_gunicorn -w 4 -k gevent
    
    # Ctrl+C 可以退出 Gunicorn,PS:如果它成功运行的话
    十一、安装 Supervisor,提供自启动支持
    通过 apt-get 安装的 server 是立即启动,并开机自启动的,但是 celery 和 gunicorn 是通过 pip 安装的,不能自启动。而supervisor 是通过 apt-get 安装的,是可以自启动的。
    Supervisor 同时也提供任务监控的功能,如果 Gunicorn 突然由于某个异常挂了,Supervisor 会重启它,而不需要你干预。你可以想下你的站凌晨三点因为一个偶尔出现的异常挂掉,你却没有Supervisor 是什么感觉。不过这个功能也只是用来对付偶然,如果你的关键服务挂了导致 Gunicorn 挂掉,重启多少遍都是没用的。
    # apt-get 安装 Supervisor
    $ sudo apt-get install supervisor
    # 配置文件必须放在 /etc/supervisor/conf.d/ 目录下,而且必须以 .conf 后缀结尾
    # celery 配置文件 /etc/supervisor/conf.d/celeryd.conf
    
    # 告诉 Supervisor 这个程序叫什么名字
    [program:celeryd]
    
    # 启动命令,你可以注意到这里的python 是用的 virtualenv 下的 python
    command = /home/<USERNAME>/.virtualenvs/<VIRTUALENV_NAME>/bin/python /home/<USERNAME>/<APP_NAME>/manage.py celeryd -B -E
    
    # 服务运行时处在哪个目录
    directory = /home/<USERNAME>/<APP_NAME>
    
    # 以哪个用户的身份运行
    user = <USERNAME>
    
    # 是否随系统自动启动
    autostart = true
    # 挂掉后是否自动重启
    autorestart = true
    
    # 标准输出和错误信息log文件
    stdout_logfile = /var/log/supervisor/celeryd.log
    stderr_logfile = /var/log/supervisor/celeryd_err.log
    # celery 监控进程配置文件 /etc/supervisor/conf.d/celerycam.conf
    [program:celerycam]
    command = /home/<USERNAME>/.virtualenvs/<VIRTUALENV_NAME>/bin/python /home/<USERNAME>/<APP_NAME>/manage.py celerycam
    directory = /home/<USERNAME>/<APP_NAME>
    user = <USERNAME>
    autostart = true
    autorestart = true
    stdout_logfile = /var/log/supervisor/celerycam.log
    stderr_logfile = /var/log/supervisor/celerycam_err.log
    # Gunicorn 的配置文件 /etc/supervisor/conf.d/gunicorn.conf
    [program:gunicorn]
    command = /home/<USERNAME>/.virtualenvs/<VIRTUALENV_NAME>/bin/python /home/<USERNAME>/<APP_NAME>/manage.py run_gunicorn -w 4 -k gevent
    directory = /home/<USERNAME>/<APP_NAME>
    user = <USERNAME>
    autostart = true
    autorestart = true
    stdout_logfile = /var/log/supervisor/gunicorn.log
    stderr_logfile = /var/log/supervisor/gunicorn_err.log
    Supervisor 管理命令,上边配置文件完成后,需要重启Supervisor,以便于发现新的配置
    
    # 重启 Supervisor
    $ sudo service supervisor restart
    
    # restart/stop/start Supervisor 管理的所有服务
    $ sudo supervisorctl restart all
    $ sudo supervisorctl stop all
    $ sudo supervisorctl start all
    
    # 只重启 celeryd,这个名字,就是在配置文件里告诉 Supervisor的那个
    $ sudo supervisorctl restart celeryd
    
    # 只启动 Gunicorn
    $ sudo supervisorctl start gunicorn
    十二、安装Nginx,添加静态文件支持

    Django 的静态文件分为 static 和 media ,两者都是静态文件,只是前者由你产生,后者是用户上传的文件
    PS:Django 的 DEBUG=True 模式支持静态文件调试,但是 DEBUG=False 后就不支持了
    # 创建文件目录 static 、 media
    sudo mkdir /var/www
    sudo mkdir /var/www/static
    sudo mkdir /var/www/media
    
    # 赋权
    sudo chown -R <USERNAME>:www-data /var/www
    
    $ vim <YOUR_APP>/settings.py
    
    # 修改 Django project 配置
    MEDIA_ROOT = '/var/www/media/'
    MEDIA_URL = '/media/'
    STATIC_ROOT = '/var/www/static/'
    STATIC_URL = '/static/'
    
    # 每次static 文件发生变更,要运行下边的命令
    $ ./manage.py collectstatic
    nginx 安装
    # 安装 nginx
    $ sudo apt-get install nginx
    nginx 配置
    nginx 配置有两个目录,/etc/nginx/sites-available/ 和 /etc/nginx/sites-enabled/,前者是可用的站点配置目录,后者是起作用的站点配置目录
    # 删除默认
    $ sudo rm /etc/nginx/sites-enabled/default
    
    # 空白配置文件,并建立一个连接到 sites-enabled 使其生效
    $ sudo touch /etc/nginx/sites-available/<你的应用>
    $ cd /etc/nginx/sites-enabled
    $ sudo ln -s ../sites-available/<你的应用>
    
    # 编辑配置文件
    $ vim /etc/nginx/sites-available/<你的应用>
    配置文件样例:
    
    # 配置一个 upstream server ,起个名字叫 gunicorn,监听 8000 端口
    upstream gunicorn {
        server localhost:8000;
    }
    
    # 配置 nginx 服务器
    server {
        # 监听 80 端口
        listen 80;
    
        # 绑定对这些域名的请求
        server_name <你的域名>.com www.<你的域名>.com;
    
        # 在这个目录下查找文件
        root /var/www/;
    
        # log文件
        access_log /var/log/nginx/<你的应用>.access.log;
        error_log /var/log/nginx/<你的应用>.error.log;
    
        # 这个选项来指定用户可以上传大文件
        # 具体见 http://wiki.nginx.org/HttpCoreModule#client_max_body_size
        # 不知道放到哪儿好,写了两次,正常运行
        client_max_body_size 0;
    
        # 这行比较重要
        # 尝试以静态文件方式处理当前请求
        # 如果找不到满足条件的静态文件,就把连接传给 Gunicorn 
        try_files $uri @gunicorn;
    
        # 配置 Gunicorn 信息
        location @gunicorn {
            # 再写一次,以防万一
            client_max_body_size 0;
    
            # 转发给上边配置的 upstream server
            proxy_pass http://gunicorn;
    
            # 确保 URL 不转到 http://gunicorn 
            proxy_redirect off;
    
            # Gunicorn 在5 minutes 内没有回应就放弃
            # 这个时间可以随意改,自己看着办
            proxy_read_timeout 5m;
    
            # 确定这些 HTTP headers 配置是正确的
            proxy_set_header Host            $host;
            proxy_set_header X-Real-IP       $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    重启Nginx,搞定!你可以运行你的Django 应用了。

    # 重启 nginx
    $ sudo service nginx restart


    转载请注明地址:http://logic0.blog.163.com/blog/static/18892814620136258532112/

  • 相关阅读:
    转载:C#中的属性、和字段的区别
    在idea中创建一个maven web工程及解决工程创建过慢问题
    注解&动态代理
    Listener&Filter
    Ajax&jQuery
    JSP&EL&JSTL
    Cookie&Session
    HttpServletRequest&HttpServletResponse
    Http协议&Servlet
    XML
  • 原文地址:https://www.cnblogs.com/yeyong/p/3906362.html
Copyright © 2020-2023  润新知