搭建高性能的 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

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2014-12-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

c3p0,DBPC,Druid三大连接池的区别/性能【面试+工作】

29520
来自专栏惨绿少年

AWStats日志分析系统

AWStats是一款功能强大且功能强大的免费工具,可以图形方式生成高级Web,流媒体,ftp或邮件服务器统计信息。此日志分析器用作CGI或命令行, 并在几个图形...

17310
来自专栏编程

深入理解RPC之传输篇

RPC 被称为“远程过程调用”,表明了一个方法调用会跨越网络,跨越进程,所以传输层是不可或缺的。一说到网络传输,一堆名词就蹦了出来:TCP、UDP、HTTP,同...

29870
来自专栏信安之路

【作者投稿】MITMF安装与使用

MITMF其实就是一个基于python编写的中间人攻击的框架,就好比metaspoit一样,无比强大且但十分易用。下面笔者就给大家介绍一下它有哪些用途,本文具有...

13300
来自专栏乐沙弥的世界

Linux 下安装及配置heartbeat

a、配置主机host解析 b、配置等效验证 c、高可用的相关服务配置(如httpd,myqld等),关闭自启动 d、如需要用到共享存储,还应配置相关...

48340
来自专栏Java修行之道

常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性...

35340
来自专栏木木玲

Netty 那些事儿 ——— Reactor模式详解

57970
来自专栏liulun

kotlin web开发教程【一】从零搭建kotlin与spring boot开发环境

IDEA中文输入法的智能提示框不会跟随光标的问题 我用的开发工具是IDEA image.png 这个版本的IDEA有一个问题; 就是中文输入法的智能提示框不...

39960
来自专栏JetpropelledSnake

ELK学习笔记之Logstash和Filebeat解析对java异常堆栈下多行日志配置支持

logstash官方最新文档。 假设有几十台服务器,每台服务器要监控系统日志syslog、tomcat日志、nginx日志、mysql日志等等,监控OOM、内存...

62010
来自专栏北京马哥教育

史上最全Linux命令科普 | 常见命令的名称是怎么来的?

1 目录缩写 缩写 | 全称 | 说明 --- | --- | --- | /bin | BINaries | 二进制可执行命令 /dev | DEVices...

34750

扫码关注云+社区

领取腾讯云代金券