/sandboxMP

关注知乎专栏可以查看已经发布的开发文档:https://zhuanlan.zhihu.com/sandbox 。关注知识星球获取最新开发文档: https://t.zsxq.com/MBiqJi2 (微信中打开链接)

Primary LanguagePython

项目说明:本项目是根据客户需求开发的一套自动化运维项目,在征得客户同意的情况下,将部分功能开源。本项目配套有完整开发文档,详细记录了项目整个实现过程,可作为学习Django的参考文档。文档以项目为主线,逐步介绍了Django基本类视图、通用类视图和自定义类视图,涵盖了Django核心组件和扩展模块的使用,包括:logging 、signals、simple-history等,同时扩展了celery和channel来实现分布式任务队列和websocket功能等,利用ansible进行集中管理和自动化任务执行。

1 运行环境配置

1.1 项目运行环境

  • 系统版本: Centos7(CentOS Linux release 7.6.1810)
  • Python版本:Python 3.6.6 (default, Jan 30 2019, 21:53:32)
  • Django版本:django 2.1.5
  • 数据库: mysql5.7/mongo3.4/redis3.2
  • 进程管理工具:supervisorctl 3.1.4
  • 扫描工具:Nmap version 6.40
  • 其他依赖:sandboxMP/requirements/pro.txt

1.2 Python虚拟环境配置

准备一台centos7的系统作为项目运行的服务器系统,完成基本网络设置、防火墙设置和系统基本优化设置。(以下内容都是在Centos7系统命令行中进行操作)

1、基础配置:使用ssh远程工具(我用的是secureCRT)连接准备好的Centos7系统,完成以下设置:

# 1.修改系统登陆后的提示信息。
# 将motd内容改为:sandboxMP 172.16.3.200 (地址设置成你登陆的系统地址,上下各空一行);
# 这样在登陆系统是的时候就可以看到上面的提示信息,防止登错系统。
[root@template ~]$ vim /etc/motd

sandboxMP 192.168.31.200

# 2.修改主机名,exit退出系统,按回车重新连接系统,就可以看到新的提示信息和主机名
[root@template ~]$ hostnamectl set-hostname sandboxmp
[root@template ~]$ exit

2、安装python3.6:系统中默认带有python2.7,项目中使用的是python3.6.6

# 1.可以去官网下载python3.6.6(Source release Gzip),也可以在linux下使用wget下载
[root@sandboxmp ~]$ yum -y install wget
[root@sandboxmp ~]$ wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz

# 2.安装pip和环境依赖包
[root@sandboxmp ~]$ yum -y install epel-release
[root@sandboxmp ~]$ yum -y install python-pip
[root@sandboxmp ~]$ pip install --upgrade pip
[root@sandboxmp ~]$ yum install -y zlib zlib-devel --setopt=protected_multilib=false
[root@sandboxmp ~]$ yum install -y bzip2 bzip2-devel openssl openssl-devel ncurses ncurses-devel sqlite sqlite-devel readline readline-devel gcc make python-devel

# 3.安装python3.6(编译安装完成执行 echo $? 返回0安装成功,否则安装出错)
[root@sandboxmp ~]$ tar -zvxf Python-3.6.6.tgz
[root@sandboxmp ~]$ cd Python-3.6.6
[root@sandboxmp Python-3.6.6 ~]$ ./configure
[root@sandboxmp Python-3.6.6 ~]$ make && make install
[root@sandboxmp Python-3.6.6 ~]$ echo $?
0

# 4.安装成功后,就可以使用python3环境
[root@sandboxmp Python-3.6.6 ~]$ cd ~
[root@sandboxmp ~]$ python3
Python 3.6.6 (default, Nov 26 2018, 16:19:34) 
''''''
>>> exit()  # 退出python环境

3、安装python虚拟环境:在项目中还是使用虚拟环境,项目环境互不影响

# 1.安装 virtualenv virtualenvwrapper
[root@sandboxmp ~]$ pip install virtualenv virtualenvwrapper

# 2.设置环境变量,使用vim编辑.bashrc在最后面添加最后两行内容
[root@sandboxmp ~]$ vim ~/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
# 下面两行是新增加内容
export WORKON_HOME=$HOME/.virtualenvs
source /usr/bin/virtualenvwrapper.sh

# 3.保存修改,退出vim,运行命令让变量生效
[root@sandboxmp ~]$ source ~/.bashrc

# 4.现在可以在bash窗口使用mkvirtualnev来创建虚拟环境了
[root@sandboxmp ~]$ mkvirtualenv -p /usr/local/bin/python3.6 sandboxMP
Running virtualenv with interpreter /usr/local/bin/python3.6
Using base prefix '/usr/local'
New python executable in /root/.virtualenvs/sandboxMP/bin/python3.6
Also creating executable in /root/.virtualenvs/sandboxMP/bin/python
Installing setuptools, pip, wheel...
done.
......

# 5.创建完成系统自动进入了虚拟环境sandboxMP
(sandboxMP) [root@sandboxmp ~]$

# 6.离开虚拟环境
(sandboxMP) [root@sandboxmp ~]$ deactivate 
[root@sandboxmp ~]$ 

# 7.查看虚拟环境
[root@sandboxmp ~]$ workon
sandboxMP
[root@sandboxmp ~]$ 

# 8.激活虚拟环境
[root@sandboxmp ~]$ workon sandboxMP
(sandboxMP) [root@sandboxmp ~]$ 

通过上面配置,指定使用python3.6来创建一个虚拟环境,虚拟环境名称为sandboxMP,虚拟环境存放的目录在/root/.virtualenvs目录下,这个是由上一步环境变量设置的。

1.3 安装数据库

在准备好的Centos7系统中安装mysql/redis/mongodb,当然数据库也可以和应用分开单独安装。

1.3.1 安装Mysql

在Centos7系统中更新yum源文件,安装myslq,创建项目数据库:

# 1.安装Mysql
[root@sandboxmp ~]$ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
[root@sandboxmp ~]$ rpm -ivh mysql-community-release-el7-5.noarch.rpm
[root@sandboxmp ~]$ yum -y update
[root@sandboxmp ~]$ yum install -y mysql-server

# 2.修改配置文/etc/my.cnf,在[mysql]标签下添加后面三行内容,保存退出vim
[root@sandboxmp ~]$ vim /etc/my.cnf
[mysqld]
collation-server = utf8_unicode_ci  
character_set_server=utf8
init_connect='SET NAMES utf8'

# 3.启动mysql,设置开机启动,为root用户设置密码
[root@sandboxmp ~]$ systemctl start mysqld
[root@sandboxmp ~]$ systemctl enable mysqld
[root@sandboxmp ~]$ mysql

mysql> set password for 'root'@'localhost'=password('1234@abcd.com');
mysql> exit

# 4.再次连接Mysql会提示要使用密码,连接方式如下,回车,根据提示输入密码
[root@sandboxmp ~]$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
''''''
mysql> 

# 5.创建数据库,添加用户和访问授权
mysql> CREATE DATABASE sandboxMP;
mysql> GRANT ALL PRIVILEGES ON sandboxMP.* TO 'ddadmin'@'%' IDENTIFIED BY '1234@abcd.com';
mysql> GRANT ALL PRIVILEGES ON sandboxMP.* TO 'ddadmin'@'localhost' IDENTIFIED BY '1234@abcd.com';

1.3.2 安装Redis

项目中会使用celery来做分布式任务队列,用来处理比较耗时的操作,例如发送邮件,资产扫描等操作。我们使用redis来做中间人,用来存储任务队列和接受返回值。 在服务器中,执行下面命令安装redis:

# 1.安装扩展源(前面我们已经安装过扩展源epel-release)和redise
[root@sandboxmp ~]$ yum install epel-release
[root@sandboxmp ~]$ yum install redis

# 2.修改redis配置文件找到bind去掉前面的注释符号,ip改为0.0.0.0,保存退出
[root@sandboxmp ~]$ vim /etc/redis.conf
bind 0.0.0.0

# 3.启动redise和设置开机启动
[root@sandboxmp ~]$ systemctl start redis
[root@sandboxmp ~]$ systemctl enable redis

1.3.3 安装Mongodb

项目中mongodb用来存储日志信息,安装方法如下:

# 1.配置yum源文件,添加mongo安装源,保存退出
[root@sandboxmp ~]$ vim /etc/yum.repos.d/mongo.repo
[mongodb-org-3.4]
name=MongoDB 3.4 Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=0
enabled=1

# 2.安装mongodb, 修改bindIp(把地址改成0.0.0.0后,保存退出)
[root@sandboxmp ~]$ yum install -y mongodb-org
[root@sandboxmp ~]$ vim /etc/mongod.conf
bindIp 0.0.0.0 # 修改bindIp

# 3.启动mongodb,设置开始启动
[root@sandboxmp ~]$ systemctl start mongod
[root@sandboxmp ~]$ systemctl enable mongod

1.4 安装项目依赖包

项目运行需要安装必要的依赖包,所有依赖包都记录在项目文件中:sandboxMP/requirements/pro.txt 。

1.4.1 克隆项目到本地

登陆服务器系统,使用git命令克隆项目到本地(如果没有git命令需要先安装git:yum -y install git):

# 1.创建/opt/app目录,用来存放项目文件
[root@sandboxmp ~]$ mkdir /opt/app 
[root@sandboxmp ~]$ cd /opt/app 
# 2.克隆项目到本地
[root@sandboxmp app]$ git clone https://github.com/RobbieHan/sandboxMP.git
Cloning into 'sandboxMP'...
remote: Enumerating objects: 134, done.
remote: Counting objects: 100% (134/134), done.
remote: Compressing objects: 100% (57/57), done.
remote: Total 2041 (delta 96), reused 81 (delta 76), pack-reused 1907
Receiving objects: 100% (2041/2041), 7.67 MiB | 16.00 KiB/s, done.
Resolving deltas: 100% (663/663), done.

==对于无法访问github的朋友可以从码云上克隆项目:==

# 进入到/opt/app目录,执行下面命令从码云克隆项目到本地:
[root@sandboxmp app]$ git clone https://gitee.com/RobbieHan/sandboxMP.git

1.4.2 安装项目依赖包

项目克隆到本地后,进入python虚拟环境,使用pip安装项目依赖包:

# 1.进入python虚拟环境
[root@sandboxmp ~]$ workon sandboxMP
# 2.防止安装mysqlclient报错:EnvironmentError: mysql_config not found,先安装下面两个包
(sandboxMP) [root@sandboxmp ~]$ yum -y install mysql-devel libmysqlclient-dev 
# 3.安装 /opt/app/sandboxMP/requirements/pro.txt文件中所有依赖包
(sandboxMP) [root@sandboxmp ~]$ pip install -r /opt/app/sandboxMP/requirements/pro.txt

1.5 创建数据表&导入初始数据

项目做了自定义的权限管理,更具用户角色权限来动态生成导航数据,所以在运行像目前,需要生成数据表并导入初始数据。

# 1. 从模型生成数据表(以下命令在服务器虚拟环境中执行)
(sandboxMP) [root@sandboxmp ~]$cd /opt/app/sandboxMP # 进入项目目录
(sandboxMP) [root@sandboxmp sandboxMP]$ python manage.py makemigrations
Migrations for 'cmdb':
  apps/cmdb/migrations/0001_initial.py
    - Create model Cabinet
    - Create model Code
    - Create model ConnectionInfo
    - Create model DeviceFile
    - Create model DeviceInfo
    - Create model DeviceScanInfo
    - Create model HistoricalDeviceInfo
    - Add field device to devicefile
(sandboxMP) [root@sandboxmp sandboxMP]$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, cmdb, contenttypes, sessions, system
Running migrations:
  Applying contenttypes.0001_initial... OK
  '''输出信息省略'''
  
# 2.导入基础数据内容,更具提示信息输入密码(默认:1234@abcd.com)
(sandboxMP) [root@sandboxmp sandboxMP]$ mysql -uroot -p sandboxMP < config/basic_data_20190225.sql
Enter password: 
(sandboxMP) [root@sandboxmp sandboxMP]$

注意: sandboxMP/sandboxMP/settings.py中数据库连接设置的是本地地址:127.0.0.1,请根据实际配置进行调整。

环境部署到这里可以在命令行使用manage.py工具临时运行项目。

==测试项目运行:==

# 在虚拟环境下,进入到项目目录,使用manage.py临时运行项目:
(sandboxMP) [root@sandboxmp sandboxMP]$ python manage.py runserver 0.0.0.0:80
Performing system checks...

System check identified no issues (0 silenced).
February 25, 2019 - 19:58:19
Django version 2.1.5, using settings 'sandboxMP.settings'
Starting development server at http://0.0.0.0:80/
Quit the server with CONTROL-C.

使用你的服务器地址访问项目(确认系统防火墙有没有限制80端口):

http://172.16.3.200  # 导入的基础数据包含一个默认管理员:admin 密码:!qaz@wsx

登录系统后可以点击导航菜单,访问对应功能。确认项目环境和项目运行没有问题后在服务器中按 CTRL + C 终止运行。

2 功能环境配置

项目中使用了一些工具例如:Nmap,异步任务使用的:Celery,进程管理使用的:Supervisor,扫描执行和集中管理使用的密钥认证登录等配置。

2.1 安装Nmap

登录服务器使用yum安装nmap工具,nmap的基本使用【Django实战2-自动化运维之配置管理-08:资产扫描工具的使用】

[root@sandboxmp ~]$ yum -y install nmap

2.2 密钥认证配置

本项目提供的扫描执行和集中管理功能支持密钥认证方式,如果要使用密钥认证来登录管理远程主机,需要设置密钥认证。

1、在项目部署的服务器上创建密钥文件:

# 使用 ssh-keygen创建密钥文件,执行命令后,一路回车。生成的密钥文件默认存放在/root/.ssh目录中
[root@sandboxmp ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:dn0G8JVMN6Qby6JhZhFaMzOQ19ko5y518FIGsds5Pbg root@sandboxmp
The key's randomart image is:
+---[RSA 2048]----+
|       .oBoo*o++.|
|       .oo*O.=+..|
|       ...+.Bo   |
|          .=++B  |
|        S=+o+Ooo |
|       .+oo..oo .|
|         ..  E   |
|                 |
|                 |
+----[SHA256]-----+

2、在需要管理的远程终端中配置允许密钥登录:

# 1.修改sshd_config配置文件内容,去掉下面内容的注释,保存退出
[root@server1 ~]$ vim /etc/ssh/sshd_config 

RSAAuthentication yes 
PubkeyAuthentication yes 
AuthorizedKeysFile .ssh/authorized_keys  # 认证授权默认存放位置

[root@server1 ~]$ systemctl restart sshd

# 2.生成公钥私钥文件,执行下面命令然后一路回车
[root@server1 ~]$ ssh-keygen 
  Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
be:02:d5:03:c3:bc:64:22:90:a1:12:1f:64:16:76:4e root@server1
The key's randomart image is:
+--[ RSA 2048]----+
|+=B.Eo           |
|o*.=. B          |
|o ...+ =         |
|.     o o        |
|     .  S.       |
|    .  .         |
|     .  .        |
|      .  .       |
|       ..        |
+-----------------+
# 3.这时候已经在/root/.ssh目录下生成了密钥文件
[root@server1 ~]$ ls -l .ssh
total 8
-rw------- 1 root root 1679 Dec  2 19:59 id_rsa
-rw-r--r-- 1 root root  394 Dec  2 19:59 id_rsa.pub

# 4. 创建认证文件,设置访问权限,authorized_keys是sshd_config中配置的认证授权默认存放位置

[root@server1 .ssh]$ touch authorized_keys
[root@server1 .ssh]$ chmod 600 authorized_keys
[root@server1 .ssh]$ ls -l
total 12
-rw------- 1 root root  396 Dec  2 20:05 authorized_keys
-rw------- 1 root root 1679 Dec  2 19:59 id_rsa
-rw-r--r-- 1 root root  394 Dec  2 19:59 id_rsa.pub
[root@server1 .ssh]$ 

3、将项目部署服务器的公钥写入远程终端的认证文件:authorized_keys

[root@sandboxmp ~]$ cat ~/.ssh/id_rsa.pub | ssh root@172.16.3.101 'cat >> .ssh/authorized_keys'
The authenticity of host '172.16.3.101 (172.16.3.101)' can't be established.
ECDSA key fingerprint is SHA256:6veR9N0x60mE73zxt+N7sesJrlAEatHK9/UkXHeAd3Y.
ECDSA key fingerprint is MD5:17:89:88:88:25:6e:ca:c9:f8:19:45:3e:c4:2f:d7:bf.
Are you sure you want to continue connecting (yes/no)? yes # 首次登录需要输入yes确认
Warning: Permanently added '172.16.3.101' (ECDSA) to the list of known hosts.
root@172.16.3.101's password:  # 输入远程主机的密码
[root@sandboxmp ~]$

代码中172.16.3.101是服务器需要管理的远程终端的IP地址,首次SSH连接远程主机需要输入yes确认连接,根据提示输入密码后成功写入公钥到远程终端。

在此通过项目服务器SSH连接到远程终端,已经不需要再输入密码了,可以直接通过密钥完成认证:

[root@sandboxmp ~]$ ssh root@172.16.3.101
Last login: Wed Feb 20 17:53:16 2019 from 172.16.3.200

server01 172.16.3.101


[root@server01 ~]#      # 成功登陆到远程终端,命令行提示符显示的是server01
[root@server01 ~]# exit # 退出远程终端连接
logout
Connection to 172.16.3.101 closed.
[root@sandboxmp ~]# 

2.3 使用Supervisor管理进程

设备扫描功能使用了celery做的任务队列,进行异步扫描,同时又使用到Flower来监控任务队列。为了方便管理,在项目中使用了Supervisor来管理进程数据。

项目文件中已经做好了celery的配置和任务队列配置,所以只需要使用Supervisor将进程管理起来即可。

2.3.1 安装Supervisor

安装Supervisor可以直接使用pip install supervisor来安装(不支持python3.6),也可以使用yum install 来安装。

# 在项目部署的服务器上安装supervisor
[root@sandboxmp ~]$ yum -y install supervisor

项目中使用yum方式来安装supervisor,安装后会自带配置文件,可以通过systemctl 来管理supervisor进程。

2.3.2 创建进程管理文件

1、查看项目部署服务器上的Supervisord配置文件:

[root@sandboxmp /]$ cat /etc/supervisord.conf
'''以上内容省略'''
[include]
files = supervisord.d/*.ini

可以看到,配置文件中导入了supervisord.d目录下的所有.ini格式文件,所以我们可以把进程管理的配置文件放到这个目录。

2、创建子进程管理配置文件

在项目部署的服务器中创建子进程管理文件,来管理celer任务进程和flower进程:

# 编辑进程管理配置文件
[root@sandboxmp ~]$ touch /etc/supervisord.d/celery_worker.ini
[root@sandboxmp ~]$ vim /etc/supervisord.d/celery_worker.ini

# 将以下内容写入配置文件保存并退出
[program:celery-worker]
command=/root/.virtualenvs/sandboxMP/bin/celery worker -A sandboxMP -l INFO
directory=/opt/app/sandboxMP
environment=PATH="/root/.virtualenvs/sandboxMP/bin/"
stdout_logfile=/opt/app/sandboxMP/slogs/celery_worker.log
stderr_logfile=/opt/app/sandboxMP/slogs/celery_worker.log
autostart=true
autorestart=true
priority=901

[program:celery-flower]
command=/root/.virtualenvs/sandboxMP/bin/celery flower --broker=redis://localhost:6379/0
directory=/opt/app/sandboxMP
environment=PATH="/root/.virtualenvs/sandboxMP/bin/"
stdout_logfile=/opt/app/sandboxMP/slogs/celery_flower.log
stderr_logfile=/opt/app/sandboxMP/slogs/celery_flower.log
autostart=true
autorestart=true
priority=900

3、启动Supervisord

[root@sandboxmp ~]$ systemctl start supervisord  # 启动supervisord
[root@sandboxmp ~]$ systemctl enable supervisord # 加到开机启动

4、使用supervisorctl管理工具

启动supervisord服务后,supervisor会读取配置文件中的子进程配置,并启动celery-worker和celery-flower进程。Supervisor为我们提供了一个子进程管理工具:supervisorctl来管理这些进程数据:

[root@sandboxmp /]$ supervisorctl # 启用子进程管理工具,系统会打印当前子进程状态
celery-flower                    RUNNING   pid 4007, uptime 0:05:13
celery-worker                    RUNNING   pid 4008, uptime 0:05:13
supervisor> status # 查看子进程状态
celery-flower                    RUNNING   pid 4007, uptime 0:05:17
celery-worker                    RUNNING   pid 4008, uptime 0:05:17
supervisor> stop celery-flower # 停止子进程,stop all 停止所有
celery-flower: stopped
supervisor> status
celery-flower                    STOPPED   Jan 18 03:27 PM
celery-worker                    RUNNING   pid 4008, uptime 0:05:32
supervisor> start celery-flower # 启动子进程
celery-flower: started
supervisor> help   # 查看帮助

default commands (type help <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update 
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

为了使用Celery任务队列功能,需要确保celery-flower和celery-worker进程状态都是RUNNING。如果有问题请查看对应日志文件(在配置子进程的时候指定了日志存储路径)

完成功能环境配置后,可以在项目服务器中临时运行项目,然后登陆系统,测试设备扫描功能,查看任务队列是否可以正常执行。

3 将项目部署上线

项目部署使用uwsgi来做Web服务,Nginx做代理并提供静态资源访问和简单缓存功能。一般项部署项目上线,我会分步骤进行,这样在遇到问题也清楚是哪一个环节出的问题,可以有针对性的进行排错。部署过程如下图所示:

image

3.1 使用uwsgi运行项目

经过前面的部署,已经准备好了系统环境、项目以来环,并确认项目可以正常运行,接下来使用uwsgi来运行项目。

1、登陆服务器系统,进入虚拟环境,安装uwsgi

[root@sandboxmp ~]# workon sandboxMP
(sandboxMP) [root@sandboxmp ~]$ pip install uwsgi

2、设置Uwsgi配置文件

(sandboxMP) [root@sandboxmp ~]$ vim /etc/smp_uwsgi.ini
[uwsgi]
http = 172.16.3.200:9000
#socket = 127.0.0.1:9000
chdir = /opt/app/sandboxMP
module = sandboxMP.wsgi
static-map=/static=/opt/app/sandboxMP/static
#daemonize =/var/log/uwsgi.log
master = Ture
vacuum = True
processes = 4
threads = 2
buffer-size=32768

配置说明:

  • chdir: 指定项目目录,请设置项目所在目录
  • static-map:静态文件映射,测试uwsgi配置时为了能够访问到静态资源,所以加上这个配置。在使用nginx时,需要注销掉这个配置,改用nginx来代理静态资源访问。

注意:配置文件中设置http,是为了方便使用Uswgi启动项目后,进行访问和功能测试。

3、使用配置文件启动Uwsgi

# 注意:uwsgi是安装在虚拟环境的,要使用uwsgi命令需要先进入虚拟环境
(sandboxMP) [root@sandboxmp ~]$ uwsgi /etc/smp_uwsgi.ini
[uWSGI] getting INI configuration from /etc/smp_uwsgi.ini
[uwsgi-static] added mapping for /static => /opt/app/sandboxMP/static
*** Starting uWSGI 2.0.18 (64bit) on [Mon Feb 25 23:21:01 2019] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-36) on 25 February 2019 14:10:29
'''中间启动内容省略'''
spawned uWSGI master process (pid: 17054)
spawned uWSGI worker 1 (pid: 17058, cores: 2)
spawned uWSGI worker 2 (pid: 17060, cores: 2)
spawned uWSGI worker 3 (pid: 17061, cores: 2)
spawned uWSGI worker 4 (pid: 17063, cores: 2)
spawned uWSGI http 1 (pid: 17064)

项目运行成功通过服务器地址:http://172.16.3.200:9000就可以访问项目了,使用默认用户名: admin,密码:!qaz@wsx 登陆系统,测试系统功能。

至此,确认完Uwsgi配置没有问题,可以正常启动项目,然后终止Uwsgi运行(在命令行使用CTRL + C)。

4、修改Uwsgi配置文件

上面的配置是为了方便测试Uwsgi运行项目,线上部署项目,采用socket模式,使用nginx来处理静态文件访问:

[uwsgi]
#http = 172.16.3.200:9000
socket = 127.0.0.1:9000
chdir = /opt/app/sandboxMP
module = sandboxMP.wsgi
#static-map=/static=/opt/app/sandboxMP/static
#daemonize =/var/log/uwsgi.log
master = Ture
vacuum = True
processes = 4
threads = 2
buffer-size=32768

配置中注销了http和static-map配置,同时启用socket配置。这时你也可以在命令行使用新的配置文件启动下uwsgi看看运行状态,不过这时候外面是无法通过uwsgi来直接访问系统了,还需要配置nginx代理。

5、使用supervisor来管理uwsgi进程

在前面已经使用supervisor来管理celery任务进程和flower进程,同样也可以使用supervisor来管理uwsgi进程:

# 1.新建一个进程文件sandboxmp_uwsgi,写入下面配置内容:
(sandboxMP) [root@sandboxmp ~]$ vim /etc/supervisord.d/sandboxmp_uwsgi.ini
[program:sandboxmp-uwsgi]
command=/root/.virtualenvs/sandboxMP/bin/uwsgi /etc/smp_uwsgi.ini
stdout_logfile=/var/log/uwsgi/smp_uwsgi.log
stderr_logfile=/var/log/uwsgi/smp_uwsgi.log
stdout_logfile_maxbytes = 20MB
autostart=true
autorestart=true
priority=905

# 2.创建一个目录用来存放uwsgi日志
(sandboxMP) [root@sandboxmp ~]$  mkdir /var/log/uwsgi

# 3.启动sandboxmp_uwsgi进程
(sandboxMP) [root@sandboxmp ~]# supervisorctl reload
Restarted supervisord

# 4. 稍微等待一会,然后查看进程状态:
(sandboxMP) [root@sandboxmp ~]# supervisorctl status
celery-flower                    RUNNING   pid 17231, uptime 0:00:05
celery-worker                    RUNNING   pid 17232, uptime 0:00:05
sandboxmp-uwsgi                  RUNNING   pid 17233, uptime 0:00:05

# 5.查看服务状态
(sandboxMP) [root@sandboxmp ~]# netstat -tnpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address    Foreign Address    State       PID/Program name    
tcp 0      0     127.0.0.1:9000           0.0.0.0:*     LISTEN      17233/uwsgi         

通过上面的配置,已经成功使用supervisor管理了sandboxmp-uwsgi进程。

3.2 使用Nginx做代理访问

1、安装nginx

(sandboxMP) [root@sandboxmp ~]$ yum -y install nginx

2、修改nginx配置文件

(sandboxMP) [root@sandboxmp ~]$ echo "" > /etc/nginx/nginx.conf
(sandboxMP) [root@sandboxmp ~]$ vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    
    include mime.types;
    default_type application/octet-stream;
    server_tokens off;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    log_format nginxlog '$http_host '
                        '$remote_addr [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        '$request_time '
                        '$upstream_response_time';
    access_log /var/log/nginx/access.log nginxlog;
    keepalive_timeout  60;
    client_header_timeout 10;
    client_body_timeout 15;
    client_max_body_size 100M;
    client_body_buffer_size 1024k; 
    gzip  on;
    gzip_min_length 1;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 3;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png app  lication/vnd.ms-fontobject application/x-font-ttf image/svg+xml;
    gzip_vary on;

   

    upstream sandboxmp {
          server  127.0.0.1:9000;
   }      
   
    server {
        
        listen 80;
        server_name 0.0.0.0;
        charset       utf-8;
        client_max_body_size 75M;
        


        location /static {
        
         alias /opt/app/sandboxMP/static;
         
          }
        
        location /media {
        
          alias /opt/app/sandboxMP/media;
          }  

        location / {
          uwsgi_pass  sandboxmp;
          include  /etc/nginx/uwsgi_params;
         }
    }    
}  

nginx配置说明:
在nginx中配置了日志格式,应用代理和静态文件的代理访问。

3、启动nginx服务,设置开机启动

(sandboxMP) [root@sandboxmp ~]# systemctl start nginx         
(sandboxMP) [root@sandboxmp ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

3.3 项目优化设置

项目在开发的时候是启用了Debug模式的,现在部署上线了,可以关闭Debug。

# 1.修改项目配置文件,将DEBUG内容改成False
(sandboxMP) [root@sandboxmp ~]$ vim /opt/app/sandboxMP/sandboxMP/settings.py 
'''配置文件中内容省略,主要修改下面两个内容'''
DEBUG = False

ALLOWED_HOSTS = ['*']

# 2.保存修改后,重启项目
(sandboxMP) [root@sandboxmp ~]$ supervisorctl restart sandboxmp-uwsgi
sandboxmp-uwsgi: stopped
sandboxmp-uwsgi: started
(sandboxMP) [root@sandboxmp ~]$ systemctl restart nginx
(sandboxMP) [root@sandboxmp ~]$ 

到这里项目已经部署上线了,可以访问系统地址:http://172.16.3.200 用户名:admin 密码:!qaz@wsx 使用项目功能。本文档中配置文件已经包含在项目master版本文件中:sandboxMP/config。



更多实战类文档,请关注我的知识星球: https://t.zsxq.com/a6IqBMr (微信中打开链接)
轻量级办公管理系统项目开源地址:https://github.com/RobbieHan/gistandard