django环境部署
当前操作系统是在阿里云上的Ubuntu14,系统自带的python版本为2.7.6,而我们使用的版本为2.6.6+django1.4.2.
pyenv搭建基础环境
- 首先,安装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
- 安装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
- 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此版本,即可用本地缓存
- 安装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 重启服务后,基本配置就完成啦。