系统环境部署
系统环境说明
OMServer 采用 Django-1.4.9、nginx-1.5.9、uwsgi-2.0.4、rpyc-3.2.3 等开源组件来构建。为了便于读者理解,下面对平台的运行环境、安装部署、开发环境优化等进行详细说明。环境设备角色表如表13-1所示。
系统平台搭建
OMServer 平台涉及两个角色,其中一个为 Web 服务端,运行 Django 及 rpyc 环境,另一角色为主控端,需要部署 Saltstack、Ansible 或 Func 主控端环境,可参与本书第9~11章内容,本节不予详细介绍。另外同样需要部署 rpyc 环境。
(1) Django 环境部署
本示例部署主机为 192.168.1.10(SN2012-07-010)。
# cd /home
# mkdir -p /home/install/Django && cd /home/install/Django #创建安装包目录
# mkdir -p /data/logs/ #创建uwsgi日志目录
1) 安装 pcre。pcre 是一个轻量级的正则表达式函数库,Nginx 的 HTTP Rewrite 模块会用到,最新版本为 8.34(对于 OMServer 平台环境来说非必选项)。
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz
# tar -zxvf pcre-8.34.tar.gz
# cd pcre-8.34
#./configure
# make && make install
# cd ..
2) 安装 Nginx。Nginx 是最流行的高性能 HTTP 服务器,最新版本为1.5.9。
# wget http://nginx.org/download/nginx-1.5.9.tar.gz
# tar -zxvf nginx-1.5.9.tar.gz
# cd nginx-1.5.9
#./configure --user=nobody --group=nobody --prefix=/usr/local/nginx --with-http_stub_status_module --with-cc-opt='-O3' --with-cpu-opt=opteron
# make && make install
# cd ..
3) 安装 MySQL-python。MySQL-python 是 Python 访问 MySQL 数据库的第三方模块库,最新版本为 1.2.3c1。
# yum install -y MySQL-python #yum安装方式
# wget http://nchc.dl.sourceforge.net/project/mysql-python/mysql-python/1.2.2/
# MySQL-python-1.2.2.tar.gz #源码安装方式
# cd MySQL-python-1.2.2
# python setup.py install
# cd ..
4) 安装 uwsgi。uwsgi 是一个快速的、纯 C 语言开发的、自维护、对开发者友好的 WSGI 服务器,旨在提供专业的 Python Web 应用发布和开发功能,最新版本为 2.0.4。
# wget http://projects.unbit.it/downloads/uwsgi-2.0.4.tar.gz
# tar -zxvf uwsgi-2.0.4.tar.gz
# cd uwsgi-2.0.4
# make
# cp uwsgi /usr/bin
# cd ..
5) 安装 Django。Django 是一个 Python 最流行的开源 Web 开发框架,最新版本为1.6.5。考虑到兼容与稳定性,本示例使用1.4.9版本进行开发。
# wget https://www.djangoproject.com/m/releases/1.4/Django-1.4.9.tar.gz
# tar -zxvf Django-1.4.9.tar.gz
# cd Django-1.4.9
# python setup.py install
6) 配置 Nginx。修改 /usr/local/nginx/conf/nginx.conf,添加以下 server 域配置:
server {
listen 80;
server_name omserver.domain.com;
location / {
uwsgi_pass 192.168.1.10:9000;
include uwsgi_params;
uwsgi_param UWSGI_CHDIR /data/www/OMserverweb;
uwsgi_param UWSGI_SCRIPT django_wsgi;
access_log off;
}
location ^~ /static {
root /data/www/OMserverweb;
}
location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ {
root /data/www/OMserverweb/static;
access_log off;
}
}
其中 “omserver.domain.com” 为平台访问域名,“/data/www/OMserverweb” 为项目根目录,可以根据具体环境进行修改。
7) 配置 uwsgi。创建 uwsgi 配置文件 /usr/local/nginx/conf/uwsgi.ini,详细内容如下:
[uwsgi]
socket = 0.0.0.0:9000 #监听的地址及端口
master = true #启动主进程
pidfile = /usr/local/nginx/uwsgi.pid
processes = 8 #uwsgi开启的进程数
chdir = /data/www/OMserverweb #项目主目录
pythonpath = /data/www
profiler=true
memory-report=true
enable-threads = true
logdate=true
limit-as=6048
daemonize=/data/logs/django.log
启动 uwsgi 与 nginx 服务,建议配置成服务自启动脚本,便于后续的日常维护。详细启动脚本这里不展开说明,有兴趣的读者可参阅互联网上已经存在的相关资源。
# /usr/bin/uwsgi --ini /usr/local/nginx/conf/uwsgi.ini
# /usr/local/nginx/sbin/nginx
访问 http://omserver.domain.com ,出现如图4-4所示的页面说明 Django+uwsgi 环境部署成功!
(2) rpyc 模块安装。
rpyc(Remote Python Call)是 Python 提供分布式计算的基础服务平台,可以理解成封装程度更高的 Socket 编程,最新版本为3.3。本示例需要部署 rpyc 模块的主机为 192.168.1.20(SN2013-08-020)、192.168.1.10(SN2012-07-010)。
# wget https://pypi.python.org/packages/source/r/rpyc/rpyc-3.2.3.tar.gz --no-
check-certificate
# tar -zxvf rpyc-3.2.3.tar.gz
# cd rpyc-3.2.3
# python setup.py install
开发环境优化
开发环境相对于生产环境更注重调试便捷性,好的调试工具对软件开发将起到事半功倍的作用,方便高效地定位问题。本节介绍 Django 必备调试工具 django-debug-toolbar 的安装与配置,同时介绍如何实现一种 Django 代码自动刷新生效的方法。
(1) django-debug-toolbar 的安装
# wget https://github.com/robhudson/django-debug-toolbar/archive/master.zip
# unzip master
# cd django-debug-toolbar-master/
# python setup.py install
修改 Django 的 setting.py 配置,关键参数如下:
INTERNAL_IPS = ('127.0.0.1','192.168.1.101',) #添加启动调试器的来源IP
MIDDLEWARE_CLASSES = ( # MIDDLEWARE_CLASSES添加以下行
… …
'debug_toolbar.middleware.DebugToolbarMiddleware',
)
INSTALLED_APPS = ( # INSTALLED_APPS添加以下行
… …
'debug_toolbar',
}
TEMPLATE_DIRS = ( #TEMPLATE_DIRS添加以下行,注意与python的安装路径保持一致
… …
'/usr/lib/python2.6/site-packages/django_debug_toolbar-0.8.5-py2.6.egg/debug_
toolbar/templates/',
)
务必要渲染一个模板,这样 debug_toolbar 才会自动附加调试信息到当前的页面,否则看不到 debug_tool 的界面。debug_toolbar 在业务前端页面设计成可伸缩展示,展开后的调试界面如图13-5所示。
(2) Django 源码自动重载(reload)方案
本方案结合 uwsgi 的 “--touch-reload” 参数来实现,参数格式:--touch-reload "文件",即当该参数值指定的文件发生变化(修改或touch操作)时,uwsgi 进程将自动重载(reload),从而使我们的项目代码刷新生效。另外,如何保证一旦更新项目源码立即触发变更 --touch-reload 指定的文件?Linux 系统下的 inotify 可以做到这点,具体操作如下。
1) 在项目目录中创建一个监视文件:
# mkdir /data/www/OMserverweb/shell #在项目目录中创建一个存放监视文件的目录shell
# touch reload.set #创建一个监视文件reload.set
# yum -y install inotify-tools #安装inotify程序包
# uwsgi启动脚本添加“--touch-reload”项
# /usr/bin/uwsgi --ini "/usr/local/nginx/conf/*.ini" --touch-reload "/data/www/OMserverweb/shell/reload.set"
2) 编写监视脚本:
# vi /data/www/OMserverweb/shell/autoreload.sh
#!/bin/sh
objectdir="/data/www/OMserverweb"
# 启动inotify监视项目目录,参数“--exclude”为忽略的文件或目录正则
/usr/bin/inotifywait -mrq --exclude "(static|logs|shell|\.swp|\.swx|\.pyc|\.py\~)" --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' --event modify,delete,move,create,attrib ${objectdir} | while read files
do
#项目源码发生变化后,触发touch reload.net的操作,最终使uwsgi进程重载,达到刷新项目源码的目的
/bin/touch /data/www/OMserverweb/shell/reload.set
continue
done &
3) 启动脚本开启项目目录监视:
# /data/www/OMserverweb/shell/autoreload.sh