Linux 干货整理
如果虚拟机开机没有 ip 怎么办
1.vim编辑网卡配置文件,修改如下参数
[root@s25linux tmp]# cd /etc/sysconfig/network-scripts/
vim修改此文件,找到如下参数,改为yes
ONBOOT="yes"
2.确保vmware 正确选择了 桥接 或是NAT,且已经连接上了
3. 命令重启网络设置
systemctl stop NetworkManager #关闭无线网络服务
systemctl restart network #重启有线网服务
#这2个命令执行都没有任何提示,表示正确的重启了网络配置
4.此时查看ip地址是否存在了
ip addr show
远程连接 linux
# 1.确保你的服务器,正确的获取到了ip地址
ifconfig # 查看到机器ip是 192.168.178.134
# 2.安装远程连接工具
# windows 安装 xshell 或者 secureCRT
# 这2个软件其实也就是封装了 ssh 命令而已
# macos 直接使用 ssh 命令即可
ssh root@192.168.178.134
Linux 命令提示符
Linux 的文件系统目录结构
只有一个根目录 /
/home # 根目录下有一个home文件夹
/s25 # 根目录下有一个s25文件夹
# 根目录下有2个同级的文件夹,男同学和女同学
/s25/男同学/小明.txt
/s25/女同学
几个特殊的目录
. 代表当前的目录
.. 代表上一级的目录 # 比如 cd .. 进入上一级目录
~ 代表当前登录用户的家目录,root用户就是/root pyyu用户就是 /home/pyyu
- 代表上一次的工作目录
绝对路径、相对路径
绝对路径:只要是从根目录开始的写法,就是绝对路径
相对路径:非从根目录开始的写法,就是相对路径
# 在/home目录下创建 s25文件夹,绝对,相对路径的写法
# 1.相对路径,以你当前的位置为相对,创建
比如此时在 /tmp目录下,上一级就是 / ,因此可以这么写
[root@bogon tmp]# mkdir ../home/s25
# 2.绝对路径的写法,一般是绝不会错的,无需考虑你当前所在的位置,直接敲绝对路径即可
[root@bogon tmp]# mkdir /home/s25
PATH 变量
# PATH就是定义一些常用的软件可执行命令的目录,放入系统中,可以快捷的查询,而不需要每次都输入绝对路径
1.为什么系统能够直接找到python解释器?
[root@s25linux tmp]# which python #输出命令所在的绝对路径
/bin/python
2.学习linux的PATH,
[root@s25linux tmp]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
注意,PATH的路径,是有先后顺序的,从左往右,读取的
3.如果编译安装了一个python3,装在了 /opt/python36/目录下,怎么添加PATH?
#这个变量赋值的代码,就是添加python3到环境变量中了
PATH="/opt/python36/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:"
4.由于上述变量赋值的操作,只是临时生效,我们想永久的更改PATH的值,还得修改/etc/profile
vim /etc/profile #打开文件,在文件末尾,添加PATH值的修改
PATH="/opt/python36/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:"
PATH 的寻找原理图
Linux 单引号和双引号的区别
单引号中的内容,仅仅就是个字符串了,不识别任何其他的特殊符号
双引号中的内容,能够识别特殊符号,以及变量
[root@s25linux ~]# echo '$name'
$name
[root@s25linux ~]# echo "$name"
我们是穿越在银河的火箭队
lrzsz 工具
用于 windows(基于xshell工具) 和 linux 之间互相传递文件
# 1.安装此工具
yum install lrzsz -y
# 2.安装好lrzsz之后,就存在了2个命令,一个是 rz,一个是sz
rz # 直接输入rz命令,能够蹦出一个弹窗,接收windows的资料
sz 文件 # 发送linux的一个文件,发给 windows 某个位置,也是出现一个弹窗
Linux 文件、目录权限管理
对于linux系统而言,文件、文件夹,都是有 user 属主, group属组的一个角色分配,还存在一个other其他人
这三个身份的划分
并且设定了 r w x 三个权利的限制,也就是 读,写,执行(对于文件的读写执行)
场景:
1. root用户在/tmp目录下创建了一个文件叫做 root.txt ,因此这个文件默认就属于root用户,属于root用户组
2.此时一个普通用户登录了机器 ,如
ssh chaoge@192.168.178.134 登录机器之后,chaoge对于这个 root.txt文件而言,就是一个其他人的身份了
查看文件夹的详细信息
[root@s25linux ~]# ll /tmp
总用量 4
drwxr-xr-x. 2 root root 6 2月 17 11:00 hehe #文件夹
# 解读它的信息
# drwxr-xr-x 拆分如下
d # d代表是一个文件夹
rwx # user是root,root可以读写执行
r-x # group也是root,root组里的成员,可以读,执行
r-x # others权限是 读,执行
#文件的权限,必须顺序是 rwx ,没有权限则写一个-号
-rw-r--r--. 1 pyyu pyyu 2328 2月 17 09:15 pwd.txt #文件
# 解读如上的权限
- # 开头是 -号,就是普通的文本类型
rw- # user是pyyu,pyyu这个用户权限是 可读、可写,不可执行
r-- # group是pyyu,只读
r-- # 此时peiqi这个用户对于pwd.txt这个文件,权限就是 只读的
对于文件的 rwx
r # cat,more,less,head,等读取文件内容的操作
w # vim ,echo,等写入内容的操作
x # 可以执行的脚本,例如bash,python等脚本,文件会变成绿色
对于文件夹的 rwx
r # ls 查看文件夹内容
w # 允许在文件夹中创建文件等操作
x # 允许cd进入此文件夹
linux 编译安装软件的步骤
1.获取软件的源代码,去官网下载最新的,或者指定版本
2.解压缩源代码
3.进入源代码目录,开始编译三部曲,指定安装路径,make,make install
4.软件编译安装结束后,配置PATH环境变量,能够便捷的访问命令
用 yum 安装 mysql 服务且启动,能够连接 mysql,基本 curd
在centos7系列系统上,mysql以及更名了,叫做mariadb数据库
c/s架构,运行一个server数据库,然后用client去连接
yum install mariadb-server mariadb -y # 安装2个有关mariadb的软件包
systemctl start mariadb # 启动mysql数据库服务
systemctl enable mariadb # 开机启动mysql数据库服务
mysql -uroot -p # 初次进入不用密码,直接回车进入数据库
python3 环境搭建
# 1.很重要,必须执行此操作,安装好编译环境,c语言也是编译后运行,需要gcc编译器golang,对代码先编译,再运行,python是直接运行
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
# 2.获取python的源代码,下载且安装,下载源代码包的形式,自由选择
cd /opt/
wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz
# 3.下载完源代码包之后,进行解压缩
tar -zxvf Python-3.6.9.tgz
# 4.解压缩完毕之后,生成了python369的源代码目录,进入源代码目录准备开始编译
cd Python-3.6.9
# 5.此时准备编译三部曲 ,编译的第一曲:指定python3的安装路径,以及对系统的开发环境监测,使用如下命令
# 命令解释
# configure 是一个脚本文件,用于告诉gcc编译器,python3即将安装到哪里,以及对基础的开发环境检查,检查openssl,检查sqllite,等等
# 编译第一曲,结束后,主要是生成makefile,用于编译的
[root@s25linux Python-3.6.9]# ./configure --prefix=/opt/python369/
# 编译第二曲:开始进行软件编译
# 直接输入 make 指令即可
# 编译第三曲:编译安装,生成python3的可执行程序,也就是生成/opt/python369/
# make install
# 6.编译的第二曲,和第三曲,可以简写成 make && make install #代表make成功之后,继续make install
[root@s25linux Python-3.6.9]# make && make install
# 等待出现如下结果,表示python3编译安装结束了
# Successfully installed pip-18.1 setuptools-40.6.2
# 7.此时可以去检查python3的可执行程序目录
cd /opt/python369/bin
[root@s25linux bin]# pwd
/opt/python369/bin
# 8.配置PATH环境变量 ,永久修改PATH,添加Python3的bin目录放入PATH开头位置
vim /etc/profile
# 写入如下内容
PATH="/opt/python369/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:"
# 9.手动读取/etc/profile,加载文件中的所有变量
source /etc/profile
# 10.检查python3的目录,以及pip3的绝对路径
[root@s25linux bin]# which pip3
/opt/python369/bin/pip3
[root@s25linux bin]# which python3
/opt/python369/bin/python3
创建 django 项目,linux 运行 django
python3.6.9
django 选择用1.11.25
# 1.安装django模块
cd /opt/
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.25
# 检查一下pip3的模块信息
pip3 list
# 2.升级pip3工具
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
# 3.在linux平台,使用命令创建django项目了
django-admin startproject mysite
# 4.创建一个app01
cd mysite/
[root@s25linux mysite]# django-admin startapp app01
# 5.编写一个视图函数,hello视图,修改app01,【访问hello视图,返回字符串,hello】
# 5.1 修改django的settings.py ,注册app01 ,修改如下
[root@localhost mysite]# vim mysite/settings.py
# 并且修改允许访问的主机列表
# 默认只允许 本地 127.0.0.1访问
# 启动在了linux的机器上 ,如果不修改windows无法访问
# 写一个 * 表示允许所有的主机访问
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
# 5.2 修改django的 urls.py
[root@localhost mysite]# vim mysite/urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/', views.hello),
]
# 5.3 编写django的app01.views,添加如下代码
[root@localhost mysite]# vim app01/views.py
from django.shortcuts import render,HttpResponse
def hello(requests):
return HttpResponse("hello")
# 6. 进行数据库迁移
[root@localhost mysite]# python3 manage.py migrate
# 指定ip和端口,启动django
[root@localhost mysite]# python3 manage.py runserver 0.0.0.0:9000
# 7.访问django项目
# 访问linux的ip地址+django的端口
10.0.0.129:9000/hello/
virtualenv 虚拟环境工具
virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境。
python3的虚拟环境工具配置
利用了虚拟环境,可以分别运行多个干净、隔离的python web环境
# 1.下载虚拟环境工具
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
# 2.通过命令行创建虚拟环境
# pip3安装的模块会放在这里
[root@localhost ~]# find /opt/python369/ -name site-packages
/opt/python369/lib/python3.6/site-packages
# --python=python3 # 指定venv虚拟解释器,以哪个解释器为本体
# 这个命令如果用相对路径,就得注意在哪敲的此命令
cd /opt/
[root@localhost opt]# virtualenv --python=python venv1
# 3.创建好venv1之后,需要激活方可使用,这个激活其实就是在修改PATH而已
[root@localhost bin]# source /opt/venv1/bin/activate
(venv1) [root@s25linux bin]#
# 4.明确虚拟环境下venv1的解释器是干净隔离的
(venv1) [root@s25linux bin]# which python3
/opt/venv1/bin/python3
(venv1) [root@s25linux bin]#
(venv1) [root@s25linux bin]# which pip3
/opt/venv1/bin/pip3
(venv1) [root@s25linux bin]#
(venv1) [root@s25linux bin]# pip3 list
Package Version
---------- -------
pip 21.3.1
setuptools 59.6.0
wheel 0.37.1
# 5.在venv1中安装django1
cd /opt/
(venv1) [root@localhost opt]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.9
(venv1) [root@localhost opt]# django-admin startproject venv1_dj119
(venv1) [root@localhost opt]# vim venv1_dj119/venv1_dj119/settings.py
# 写一个 * 表示允许所有的主机访问
ALLOWED_HOSTS = ["*"]
(venv1) [root@localhost opt]# python3 venv1_dj119/manage.py runserver 0.0.0.0:8080
# 6.再开一个ssh窗口,再创建venv2,用于运行django2 版本
cd /opt/
[root@localhost opt]# virtualenv --python=python venv2
# 激活虚拟环境venv2
[root@localhost opt]# source /opt/venv2/bin/activate
(venv2) [root@localhost opt]# pip3 list
Package Version
---------- -------
pip 21.3.1
setuptools 59.6.0
wheel 0.37.1
# 在venv2中安装django2
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==2.0.1
# 创建diango2项目
django-admin startproject venv2_dj201
(venv2) [root@localhost opt]# vim venv2_dj201/venv2_dj201/settings.py
# 写一个 * 表示允许所有的主机访问
ALLOWED_HOSTS = ["*"]
(venv2) [root@localhost opt]# python3 venv2_dj201/manage.py runserver 0.0.0.0:9090
# 7.分别启动2个版本的django,查看浏览器访问效果
# 8.deactivate # 直接执行此命令,退出虚拟环境,系统会自动删除venv的PATH,也就表示退出了
supervisor 工具
使用supervisor这个python开发的进程管理工具,用它启动uwsgi之后,uwsgi进程挂掉后,自动会再启动
crm的部署技术栈 nginx+uwsgi+django+mysql ,我们可以手动的,单独启动每一个进程
还可以通过supervisor一键启动这四个进程,进行批量管理,批量启停
# 1.使用yum命令即可直接安装
[root@localhost ~]# yum install supervisor -y
# 2.生成supervisor的配置文件
[root@localhost ~]# echo_supervisord_conf > /etc/supervisord.conf
# 3.修改supervisor的配置文件,添加管理crm的任务
[root@localhost ~]# vim /etc/supervisor.conf # 再最底行,添加如下内容
#[program:xx]是被管理的进程配置参数,xx是进程的名称
[program:crm]
command=写入启动uwsgi的命令 ;supervisor其实就是在帮你执行命令而已!
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
linux 启动 crm 项目
效果图
# 1.准备好crm代码
cd /opt/
git clone https://github.com/zylyehuo/tf_crm.git
# 2.新建一个虚拟环境,用于运行crm
# 在项目下,生成虚拟环境,便于管理此文件夹
[root@localhost opt]# cd tf_crm/
[root@localhost tf_crm]# virtualenv --python=python venv_crm
[root@localhost tf_crm]# source venv_crm/bin/activate
(venv_crm) [root@localhost tf_crm]# pip3 list
Package Version
---------- -------
pip 21.3.1
setuptools 59.6.0
wheel 0.37.1
# 3.安装 crm 运行所需的模块依赖
(venv_crm) [root@localhost tf_crm]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.25
(venv_crm) [root@localhost tf_crm]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql
# 出现 ValueError: Incorrect timezone setting: Asia/shanghai
(venv_crm) [root@localhost tf_crm]# vim tf_crm/settings.py
#TIME_ZONE = 'Asia/shanghai' # 注释掉,临时解决
(venv_crm) [root@localhost tf_crm]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django-multiselectfield
# 4.缺少 mysql,需要安装 mariadb,且启动
(venv_crm) [root@localhost tf_crm]# yum install mariadb-server mariadb -y
# 5.启动 mariadb 数据库
(venv_crm) [root@localhost tf_crm]# systemctl start mariadb
(venv_crm) [root@localhost tf_crm]# netstat -tunlp | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 106346/mysqld
# 6.注意可能需要修改 django 的 settings.py 有关数据库连接的账号密码信息等
# 出现 django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
(venv_crm) [root@localhost tf_crm]# vim /opt/tf_crm/tf_crm/local_settings.py
# 修改以下内容
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'tf_crm',
'HOST': '127.0.0.1',
'POST': 3306,
'USER': 'root',
'PASSWORD': '',
}
}
(venv_crm) [root@localhost tf_crm]# vim /opt/tf_crm/tf_crm/settings.py
# 修改以下内容
ALLOWED_HOSTS = ["*"]
# 7.还要注意,由于数据库是空的,还得进行数据库表的导入,导出本地数据库表,导出
# 出现 django.db.utils.OperationalError: (1049, "Unknown database 'tf_crm'")
# 参数--all-databases能够导出所有的数据库,表,也可以指定某一个数据库,表导出
mysqldump -uroot -p --all-databases > alldb.sql
# 8.发送此 alldb.sql 文件,给 linux 机器,再进行数据导入
# 就是将第七步的SQL文件,通过lrzsz、scp、xftp等方式,发送此文件给linux
mysql -uroot -p < /opt/alldb.sql
# 没有数据库数据的时候先手动创建一个空的数据库
(venv_crm) [root@localhost tf_crm]# mysql -uroot -p
MariaDB [(none)]> create database tf_crm DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
MariaDB [(none)]> exit
Bye
# 9.此时再次尝试启动 crm 项目
(venv_crm) [root@localhost tf_crm]# python3 manage.py runserver 0.0.0.0:9090
# 浏览器访问 10.0.0.129:9090/login/
使用 uwsgi 启动 python web(书接上回:linux 启动 crm 项目)
让django在linux上,支持并发形式启动,支持多进程,多线程,乃至于协程的一个C语言编写的高性能工具
# 1.安装uwsgi工具
(venv_crm) [root@localhost tf_crm]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi
(venv_crm) [root@localhost tf_crm]# pip3 list
Package Version
----------------------- -------
Django 1.11.25
django-multiselectfield 0.1.12
pip 21.3.1
PyMySQL 1.0.2
pytz 2023.3
setuptools 59.6.0
uWSGI 2.0.22
wheel 0.37.1
(venv_crm) [root@localhost tf_crm]#
# 2.编写uwsgi.ini配置文件,以多进程形式启动tf_crm
(venv_crm) [root@localhost tf_crm]# touch uwsgi.ini # 手动创建此uwsgi的配置文件,写入如下的内容参数,去启动crm
# 写入如下的功能性的参数配置,用于启动项目
# 这些部署的流程,是国外的uwsgi官网,给与的用法,照着用即可
# 注意要根据自己的目录,修改如下的参数(从第二行开始粘贴)
(venv_crm) [root@localhost tf_crm]# vim uwsgi.ini
[uwsgi]
# Django-related settings
# the base directory (full path)
# 填写crm项目的第一层绝对路径
chdir = /opt/tf_crm/
# Django's wsgi file
# 填写crm项目第二层的相对路径,找到第二层目录下的wsgi.py
# 这里填写的不是路径,是以上一个参数为相对,找到第二层项目目录下的wsgi.py文件
module = tf_crm.wsgi
# the virtualenv (full path)
# 填写虚拟环境解释器的第一层工作目录
home = /opt/tf_crm/venv_crm
# process-related settings
# master
master = true
# maximum number of worker processes
# 代表定义uwsgi运行的多进程数量,官网给出的优化建议是 2*cpu核数+1
# 如果是单进程,十万个请求,都丢给一个进程去处理
# 3个工作进程,十万个请求,就分给了3个进程去分摊处理
# 查看几核
# [root@localhost ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
# cpu cores : 4
processes = 9
# the socket (use the full path to be safe
# 这里的socket参数,是用于和nginx结合部署的unix-socket参数,这里临时先暂停使用
# socket = 0.0.0.0:8000
# 线上不会用http参数,因为对后端是不安全的,使用socket参数是安全的连接,用nginx反向代理去访问
# 后端程序是运行在防火墙内部,外网是无法直接访问的
# 临时使用http参数,便于我们用浏览器调试访问
http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
第二步中 uwsgi.ini 配置文件的无注释版
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /opt/tf_crm/
# Django's wsgi file
module = tf_crm.wsgi
# the virtualenv (full path)
home = /opt/tf_crm/venv_crm
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 9
# the socket (use the full path to be safe
# socket = 0.0.0.0:8000
http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
3.此时可以用命令,基于uwsgi协议的一个高性能web后端启动了
(venv_crm) [root@localhost tf_crm]# uwsgi --ini ./uwsgi.ini # 指定配置文件启动后端
# 浏览器访问 10.0.0.129:8000/login/
# 4.此时crm项目,已经用uwsgi支持了9个进程的启动了,但是由于uwsgi对静态文件的解析性能很弱,线上需要交给nginx去处理
# 5.uwsgi和uwsgi.ini都配置完毕之后,开始使用supervisor工具进行管理了
# 先明确,启动uwsgi的绝对路径命令是什么
# 5.1 找到uwsgi的绝对路径 /opt/tf_crm/venv_crm/bin/uwsgi
# 5.2 找到uwsgi.ini的绝对路径 /opt/tf_crm/uwsgi.ini
# 5.3 因此 启动 crm项目的完整绝对路径命令是
/opt/tf_crm/venv_crm/bin/uwsgi --ini /opt/tf_crm/uwsgi.ini
# 6.修改supervisor的配置文件
vim /etc/supervisord.conf #写入如下
[program:crm]
command=/opt/tf_crm/venv_crm/bin/uwsgi --ini /opt/tf_crm/uwsgi.ini
autostart=true
startsecs=10
autorestart=true
stopasgroup=true
killasgroup=true
# 7.启动supervisor,默认就会直接启动uwsgi了
(venv_crm) [root@localhost tf_crm]# supervisord -c /etc/supervisord.conf # 启动supervisor服务端,指定配置文件启动
# 启动完毕supervisor之后,检查进程信息
(venv_crm) [root@localhost tf_crm]# ps -ef | grep supervisor # 检查supervisor是否存在了进程,是否启动
(venv_crm) [root@localhost tf_crm]# ps -ef | grep uwsgi # 检查uwsgi是否启动
# 8.进度supervisor任务管理终端
# 看到如下的结果,表示自定义的任务crm,也就是uwsgi进程,正确的启动了
(venv_crm) [root@localhost tf_crm]# supervisorctl -c /etc/supervisord.conf
crm RUNNING pid 73933, uptime 0:02:07
supervisor>
# 9.浏览器访问 10.0.0.129:8000/login/
# 看到了没有静态文件的 crm 界面,就是正确的了
# 10.supervisorctl的管理命令
提供了如下命令
(venv_crm_again) [root@s25linux tf_crm]# supervisorctl -c /etc/supervisord.conf
crm RUNNING pid 41451, uptime 0:01:34
supervisor>
supervisor>start crm
supervisor>stop crm
supervisor>status
supervisor>start all
supervisor>stop all
# 11.uwsgi异常崩溃的话,supervisor会立即重启uwsgi
# 12.如果要运行多个 uwsgi项目,在supervisor中定义多个任务即可