系统环境部署

系统环境说明

OMServer 采用 Django-1.4.9、nginx-1.5.9、uwsgi-2.0.4、rpyc-3.2.3 等开源组件来构建。为了便于读者理解,下面对平台的运行环境、安装部署、开发环境优化等进行详细说明。环境设备角色表如表13-1所示。

image 2023 12 09 16 01 31 785
Figure 1. 表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 环境部署成功!

image 2023 12 09 16 12 52 553
Figure 2. 图13-4 Django默认首页

(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所示。

image 2023 12 09 16 17 41 462
Figure 3. 图13-5 debug_toolbar界面

(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