- Linux用户管理
- Linux文件,目录权限管理
- 软链接
- 打包,压缩,解压缩
- 案例1
DNS域名解析- 原理
crontab定时任务- Linux软件包管理
- Linux编译python3开发环境
- CentOS7.9.2009 部署
Django3 virtualenv虚拟工具及虚拟环境的使用- CentOS7.9 2009 编译安装最新版本mysql
- # 复习及拓展知识
- CRM项目的部署
uwsgi启动python websupervisor进程管理工具- 简介
- 使用
- 参考及引用
- 报错:
Unlinking stale socket /tmp/supervisor.sock - 报错:
error: <class 'xmlrpclib.Fault'>, <Fault 6: 'SHUTDOWN_STATE'>: file: /usr/lib64/python2.7/xmlrpclib.py line: 794 - 报错:
uwsgi出现invalid request block size: 21573 (max 4096)...skip - 报错
bind(): Permission denied [core/socket.c line 230] - 正常启动
- 虚拟环境准备
uwsgi启动命令supervisor常用命令
Linux用户管理
- 对于一个
QQ群而言,有哪些角色划分,权利的划分“ - 群主—
QQ群里面权限最大 - 管理员—root临时赋予的超级权限,—在用皇帝的身份狐假虎威,拿着尚方宝剑—Linux中的
sudo命令 - 吃瓜群众—权限最低,基本只能够在自己的家目录进行增删改查,其他目录的权限都很低—-Linux的普通用户
系统创建了用户,同时也会创建一个同名的组,例如
useradd canxun # 创建普通用户系统会在 ```/etc/passwd```下增加一行用户信息,且同时创建了一个用户组,也叫做*canxun*该用户组存放在/etc/group
查看普通用户
tail -5 /etc/passwdpolkitd:x:999:998:User for polkitd:/:/sbin/nologintss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologincaesar:x:1000:1000::/home/caesar:/bin/bash
root而言
为什么叫做root用户?
因为系统设计了`UID`的概念,用户ID号码,用户ID为零,指的是系统的超级用户;普通用户由root用户创建,默认的`UID`是从1000开始,权限很低;
普通用户
默认用户的家目录都在 /home下,例如:
`/home/caesar``/home/tylor`
用户管理的命令
添加删除用户,需要注意的是:涉及到权限的修改,只能由root用户操作,其他人基本没有权限;
useradd canxun # 创建用户:canxunpasswd canxun # 给用户修改密码userdel canxun # 删除用户userdel -rf canxun # 删除用户以及用户home目录passwd # 未指定用户则修改当前用户的密码
删除用户以及重新检查
[root@vvkt7whznuckhiz2-0723575 ~]# userdel -rf caesar[root@vvkt7whznuckhiz2-0723575 ~]# grep "caesar" /etc/passwd[root@vvkt7whznuckhiz2-0723575 ~]#
用户切换
# 添加用户以及设置密码useradd tylorpasswd qwe98322@# 切换用户以及环境变量[root@vvkt7whznuckhiz2-0723575 home]# su - tylor[tylor@vvkt7whznuckhiz2-0723575 ~]$# 当前用户的工作目录[tylor@vvkt7whznuckhiz2-0723575 ~]$ pwd/home/tylor
尚方宝剑命令
1. 当tylor用户想要进入/root文件夹时发现用户权限不够,应该怎么办呢?思路:1. 使用sudo命令,默认以root身份去执行命令例如: sudo cd /root2. 将tylor用户加入root组里,也就拥有了root权限,但还是需要查看用户组权限;
[sudo]命令使用配置流程
1. 使用visudo命令,修改配置文件,添加 你允许执行的sudo命令用户修改配置信息,如下:99 ## Allow root to run any commands anywhere100 root ALL=(ALL) ALL101 tylor ALL=(ALL) ALL2. 代码示例[tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo cd /root[sudo] password for tylor:[tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo cd /root # 加上sudo命令已经能够进入 /root文件夹[tylor@vvkt7whznuckhiz2-0723575 ~]$ pwd/home/tylor[tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo ls /root # 查看root下所有文件admin.text admir.text[tylor@vvkt7whznuckhiz2-0723575 ~]$ touch /root/tylor到此一游 # 普通用户身份仍然无法创建文件夹touch: cannot touch ‘/root/tylor到此一游’: Permission denied[tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo touch /root/person[tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo ls /root # 创建成功查看文件信息admin.text admir.text person
id命令
查看用户的账户信息
[root@vvkt7whznuckhiz2-0723575 ~]# id rootuid=0(root) gid=0(root) groups=0(root)
组的概念
对于技术部门,运维需要分配单个用户的权限太散,太多;
[权限控制:针对不同的组,不同的用户,针对不同的文件夹,文件设置不同的权限];前端组;后端组;运维组;测试部门;安全部门;DB部门;
运维都得对上述的人进行权限控制,对于服务器操作权限;因此引入组的概念,针对整个组进行管理,更加方便;
比如:
MySQL的默认数据存放位置,如/var/lib/mysql/* 那么这个MySQL数据文件以及文件夹是属于哪个组,那个用户管理呢?[root@vvkt7whznuckhiz2-0723575 ~]# ll /tmp/total 44828-rw-r--r-- 1 root root 946 Sep 30 16:09 admin.textdrwxr-xr-x 2 root root 4096 Sep 30 20:48 hsperfdata_rootdrwxr-xr-x 2 root root 4096 Sep 29 16:03 python1第一组数据指的是读写权限,第二组为当前所属用户,第三组为当前所属组,
Linux文件,目录权限管理
对于Linux而言,文件夹,文件都有user, group,属主和属组的角色划分,还存在一个other其他人三个身份的划分;
设置了三种权限,可读可写可执行,分别为 R, W, X;
数值与权限
- 读取权限:等于4 用 r 表示
- 写入权限:等于2 用 w 表示
- 执行权限:等于1 用 x 表示
文件与目录权限
Linux设置权限的目的:保护账户资料
Linux权限主要按照三种身份划分:
other/owner 文件使用者,文件属于哪个用户;group 属组。文件属于哪个组;other既不是 user, 也不是group,就是other,其他人;
Linux的权限观察
[root@vvkt7whznuckhiz2-0723575 ~]# ls -l /tmptotal 44828-rw-r--r-- 1 root root 946 Sep 30 16:09 admin.text# 每三个一组- : 代表普通文件类型rw-:user的权限r--:group的权限r--:other的权限# 1 指的是文件链接数目# 第一个root指的是属主,第二个root指的是属组# 其次为文件大小# 最后为文件最后修改日期和文件名字
案例1:普通用户如何写入root用户创建的文件呢?
[root@vvkt7whznuckhiz2-0723575 tmp]# chmod o+w test.py[root@vvkt7whznuckhiz2-0723575 tmp]# su - tylorLast login: Fri Oct 1 11:11:02 CST 2021 on pts/0[tylor@vvkt7whznuckhiz2-0723575 ~]$ echo "给other赋予写入权限之后就可以自行写入文件,然而other是相当于属主而言的" >> test.py[tylor@vvkt7whznuckhiz2-0723575 ~]$ cat test.py给other赋予写入权限之后就可以自行写入文件,然而other是相当于属主而言的
chmod命令总结
chmod 可以更改文件权限,修改针对user, group, other的权限,例如:chmod u+r file.text # 给文件的user 添加读的权限chmod g-x file.text # 删除文件用户组的执行权限chmod o+r / o+w / o+x file.test # 给文件的other身份最大的权限,读写可执行chmod 000 file.text # 给文件最低的权限 任何人不能读写执行
chgrp命令
更改用户所属的组
chgrp 新的属组 file.text
chown命令
更改文件的所有者owner/user
chown 新的属主 file.text
对于文件的rwx权限
1. r cat, more, less, head,等读取文件的操作2. w vim, echo 等写入文件的操作3. x 可执行脚本,比如bash,python,文件会变为绿色
案例1—测试脚本文件的执行
[tylor@vvkt7whznuckhiz2-0723575 tmp]$ vim echo.sh[tylor@vvkt7whznuckhiz2-0723575 tmp]$ bash echo.sh我是用来测试脚本文件的[tylor@vvkt7whznuckhiz2-0723575 tmp]$ cat echo.shecho "我是用来测试脚本文件的"# 第二种方法:给用户或者所有者添加可执行权限,然后以脚本方式运行[root@vvkt7whznuckhiz2-0723575 tmp]# chmod u+x echo.sh[root@vvkt7whznuckhiz2-0723575 tmp]# su - tylorLast login: Fri Oct 1 11:30:10 CST 2021 on pts/0[tylor@vvkt7whznuckhiz2-0723575 ~]$ cd /tmp[tylor@vvkt7whznuckhiz2-0723575 tmp]$ ./echo.sh我是用来测试脚本文件的
对于文件夹的rwx
- R, W,X的数值分别是4,2,1,因此对用户,组,其他设置的权限可以用数字表达;
- 所以各个用户的最高权限为777, 最低权限为000. vim编辑后权限为664.;
- 如果一个文件的权限为664,表示对于用户的权限为读写,对于组权限为读写,对于其他的权限为读;
软链接
windows的一个快捷方式而已
创建语法: ln -s /tmp/test.py[原始文件] /opt/test.text[目标文件,开始链接时创建];
删除快捷方式:test.text不会影响原文件
[root@vvkt7whznuckhiz2-0723575 tmp]# lsadmin.text hsperfdata_root python2 python3 python4 python_a python_c python.txt wrapper-615-1-inecho.sh python1 python2.txt python3.txt python5 python_b python_d test.py wrapper-615-1-out[root@vvkt7whznuckhiz2-0723575 tmp]# echo "我是一只小小鸟" >> test.py[root@vvkt7whznuckhiz2-0723575 tmp]# cat /tmp/test.py"我是测试数据"我是一只小小鸟[root@vvkt7whznuckhiz2-0723575 tmp]# ln -s /tmp/test.py /opt/test.text[root@vvkt7whznuckhiz2-0723575 opt]# lltotal 0lrwxrwxrwx 1 root root 12 Oct 1 16:59 test.text -> /tmp/test.py-rw-r--r-- 1 root root 0 Oct 1 16:56 test.txt[root@vvkt7whznuckhiz2-0723575 opt]# cat test.text"我是测试数据"我是一只小小鸟
打包,压缩,解压缩
简介以及语法
打包不节省空间,便于传输;压缩,节省磁盘空间;
语法tar 命令功能参数-z 调用gzip命令,对文件压缩,加上这个参数才会节省磁盘空间-x 解包,拆快递包裹的过程-v 显示整个过程-f 必须写在参数的结尾,指定压缩文件的名字-c 打包,收拾快递# 压缩文件的后缀只是告诉别人,该文件用什么命令压缩和解压缩```*.gz``` gzip命令解压缩```*.tar``` tar命令解压缩```*.gz``` 用xz解压缩```*.zip``` 用unzip解压缩
补充:解压 xz 文件
xz -d xyz.tar.xztar -xvf xyz.
案例1
打包test.txt文件,打包为tar文件allopt.tar
[root@vvkt7whznuckhiz2-0723575 opt]# tar -cvf allopt.tar test.txttest.txt[root@vvkt7whznuckhiz2-0723575 opt]# lsallopt.tar q1.txt q2.txt q3.txt q.txt quanquan.txt test.text test.txt# 解包操作[root@vvkt7whznuckhiz2-0723575 zip]# tar -xvf /opt/allopt.tartest.txt[root@vvkt7whznuckhiz2-0723575 zip]# lstest.txt# 解包第一步 打包某个文件tar -cvf /opt/test.py allopt.tar第二步 解包tar到当前文件夹tar -xvf allopt.tar
案例2
打包且压缩/opt下所有内容,生成tar.gz包 allopt.tar.gz
第一步
第一步:打包且压缩 将tmp下所有文件打包为alltmp.tar.gz并且放置在opt目录下[root@vvkt7whznuckhiz2-0723575 tmp]# tar -zcvf /opt/alltmp.tar.gz /tmp/*tar: Removing leading `/' from member names/tmp/admin.text/tmp/echo.sh/tmp/hsperfdata_root//tmp/hsperfdata_root/620/tmp/python1//tmp/python2//tmp/python2.txt/tmp/python3//tmp/python3.txt/tmp/python4//tmp/python5//tmp/python_a/tmp/python_b/tmp/python_c/tmp/python_d/tmp/python.txt/tmp/test.py/tmp/wrapper-615-1-in/tmp/wrapper-615-1-out
第二步
第二步: 解压缩,常见的 ```*.tar.gz```,也会有人写为 ```*.tga
[root@vvkt7whznuckhiz2-0723575 tmp]# tar -zcvf /opt/alltmp.tar.gz /tmp/* tar: Removing leading `/‘ from member names /tmp/admin.text /tmp/echo.sh /tmp/hsperfdata_root/ /tmp/hsperfdata_root/620 /tmp/python1/ /tmp/python2/ /tmp/python2.txt /tmp/python3/ /tmp/python3.txt /tmp/python4/ /tmp/python5/ /tmp/python_a /tmp/python_b /tmp/python_c /tmp/python_d /tmp/python.txt /tmp/test.py /tmp/wrapper-615-1-in /tmp/wrapper-615-1-out [root@vvkt7whznuckhiz2-0723575 tmp]# cd /opt [root@vvkt7whznuckhiz2-0723575 opt]# ls alltmp.tar alltmp.tar.gz
<a name="8606f66d"></a># 防火墙<a name="69fa3701"></a>## 作用> 用于控制服务器的出入流量;防止恶意流量攻击服务器,提供保护服务器的端口等服务;> 在学习阶段直接关闭,专业的运维人员要学习`iptables`软件的一些指令<a name="706086ba"></a>## 常识> 在云服务器上,默认有一个硬件防火墙和一个软件防火墙[`iptables, firewalled]`> 在云服务器上运行`Django`,如果服务器开启了防火墙,且没有自定义规则,默认是拒绝所有外来流量,导致我们的Windows浏览器无法访问到Linux服务器上运行的`Django`等程序<a name="0dfbe902"></a>## 常用命令```shell# 1. 清空防火墙规则iptables -F# 2. 关闭防火墙的服务systemctl stop firewalldsystemctl disable firewalld # 禁止防火墙开机自启
DNS域名解析
原理
机器去本地
hosts文件,检查是否写了对应的域名解析关系;去指定的
DNS服务器上寻找对应的解析关系;
公网中的域名解析服务器:腾讯119.29.29.29
Linux下DNS客户端的配置文件
# 配置文件定义了主备两个```DNS```服务器地址vim /etc/resolv.conf# Generated by NetworkManagersearch openstacklocal novalocalnameserver 100.125.0.250nameserver 114.114.114.114options single-request-reopen# Linux本地DNS强制解析文件 /etc/hosts,可以写入一些域名供本地测试使用# 本地强制解析文件的优先级比/etc/resolv.conf更高
nslookup[查找NDS域名解析与主机名]命令
原理
浏览器进行```DNS```查找,解析域名对应的```IP```地址,找到之后浏览器访问该```IP```地址;用户请求访问网页,请求到达服务器时,优先发给 ```Nginx```,用户请求静态资源,```Nginx```则直接从磁盘上找到资料给用户查看;如果``Nginx``检测到用户请求是一个动态请求,登录,注册,读取数据库,例如 ```.php ```例如 ```.aspx```,通过URL匹配发现是动态请求,转发给后端的应用服务器```[tomcat, php, django]
Django处理完用户的动态请求之后,如果发现需要读取数据库,再通过pymysql 向 MySQL读取数据;
如果处理请求发现读取的是redis, 再通过pyredis向redis拿数据; Django 处理完请求之后,返回给nginx数据,nginx再返回给用户浏览器,浏览器渲染好页面后再展示给用户; 推荐阅读 《大型网站技术架构》
<a name="ddf7d2a5"></a>## 命令```shell# 查找提供此命令的包yum provides */nslookup# 安装对应的包yum -y install bind-utils# 输入nslookup进入交互式命令nslookup# 输入网址进行查询> www.pythonav.cnServer: 100.125.0.250Address: 100.125.0.250#53# 退出exit
crontab定时任务
定时任务的语法规则
为什么设置脚本时使用绝对路径?crontab 存在局部环境变量,如果不指定精确位置,那么脚本运行时则没有支撑文件* * * * * 命令的绝对路径分 时 日 月 周3,5 * * * * 每小时的第三分钟,第五分支执行命令15, 2-5 * * * 每天的两点一刻,三点一刻,四点一刻和五点一刻执行命令30 08 * * * 每天八点半上班00 00 * * * 每天24点下班每分钟执行一次命令* * * * *每小时的第三分钟,第五分钟执行3, 15 * * *上午8-11点的第三分钟,第十五分钟执行3, 15 8-11 * * *每晚九点半执行30 21 * * * 二十四小时制每周六,周日1:30执行30 13 * * 6, 7每周一至周五的凌晨一点,清空 /tmp 目录下的所有文件,注意执行命令请使用绝对路径,否则会失效0 1 * * 1-5 /usr/bin rm -rf /tmp/*每晚零点重启 nginx0 0 * * * /usr/bin/systemctl restart nginx每个月的1, 10, 22日的4:55重启nginx55 4 1,10,22 * * /usr/bin/systemctl restart nginx每个星期一的上午八点到十一点的第三分钟到第十五分钟执行命令3-15 8-11 * * 1
定时任务服务,提供了一个客户端管理命令;几号和星期几不能共存;
命令说明crontab -e # 编辑定时任务配置文件crontab -l #查看定时任务的规则配置参数说明minute hour day month week command其中:minute: 表示分钟,可以是从0到59之间的任何整数。hour:表示小时,可以是从0到23之间的任何整数。day:表示日期,可以是从1到31之间的任何整数。month:表示月份,可以是从1到12之间的任何整数。week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
案例1-每分钟将一句话追加到一份文件当中
1. 打开配置文件crontab -e2. 写入如下命令,命令写入后会有已安装的提示信息* * * * * /usr/bin/echo "有人问王思聪,钱是万能的吗?王思聪答:钱是万达的!" >> /tmp/wsc.txt3. 检查命令crontab -l4. 实时刷新tail -f /tmp/wsc.txt
其他小技巧–快速上手服务器
ps -ef # 查看运行了那些进程netstat -tunlp # 查看监听了那些端口crontabl -l # c原则: 绝对路径优先,一般不会出错
Linux软件包管理
软件安装形式
源代码安装,较为麻烦,可以自选软件版本,亦可扩展第三方额外功能,指定软件安装目录五颗星rpm包手动安装,需要手动解决依赖关系,两颗星yum 自动化安装,需配置好yum源,能够自行搜索依赖关系,下载安装和处理依赖关系,缺点:版本可能较低;机器数量较多时不容易控制;
更换yum源
yum源的默认仓库文件夹是:/etc/yum.repos.d,只有在目录第一层的```*.repo```结尾的文件才会被```yum```读取;1. 备份旧的仓库源cd /etc/yum.repos.dmkdir repobakmv *.repo repobak/2. 下载repo,epl源文件wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repowget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo3. 测试安装速度yum -y install redis
Linux编译python3开发环境
采用编译安装的方式
下载包[从国内镜像站]
wget http://npm.taobao.org/mirrors/python/3.9.6/Python-3.9.6.tgz
解决编译安装依赖
yum -y install gcc path 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-develyum -y install wget xz tar gcc make tk-devel sqlite-devel zlib-devel readline-devel openssl-devel curl-devel tk-devel gdbm-devel xz-devel bzip2-devel
当前目录下解压
tar -zxvf Python-3.9.6.tgz
删除个别配置
vim configureenable-optimizations # 删除该行
开始指定安装目录和检查依赖
./configure --prefix=/opt/python396
开始编译安装
make && make install
安装成功显示的代码
Looking in links: /tmp/tmpprh3c1wlProcessing /tmp/tmpprh3c1wl/setuptools-56.0.0-py3-none-any.whlProcessing /tmp/tmpprh3c1wl/pip-21.1.3-py3-none-any.whlInstalling collected packages: setuptools, pipWARNING: The scripts pip3 and pip3.9 are installed in '/opt/python396/bin' which is not on PATH.Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.Successfully installed pip-21.1.3 setuptools-56.0.0WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
检查python396的可执行程序目录
[root@vvkt7whznuckhiz2-0723575 bin]# pwd/opt/python396/bin
系统环境变量中添加如下配置
vim /etc/profile### 自定义的python3.9.6的目录PATH="/opt/python396/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
检查环境变量,重新读取,检查环境是否安装成功
echo $PATHsource /etc/profileecho $PATHwhich pip3which python3
CentOS7.9.2009 部署Django3
1 安装django包
pip3 install django==3.2.7 -i https://pypi.tuna.tsinghua.edu.cn/simple
2 升级pip
cd /opt/python396/bin/pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
3 创建项目并且进入
django-admin startproject mysitecd mysitetree.├── manage.py└── mysite├── asgi.py├── __init__.py├── settings.py├── urls.py└── wsgi.py1 directory, 6 files
4 创建 app01并且查看目录结构
django-admin startapp app01tree.├── app01│ ├── admin.py│ ├── apps.py│ ├── __init__.py│ ├── migrations│ │ └── __init__.py│ ├── models.py│ ├── tests.py│ └── views.py├── manage.py└── mysite├── asgi.py├── __init__.py├── settings.py├── urls.py└── wsgi.py
5 settings.py下注册 app01并且允许所有主机
cd /opt/blog/bin/bbs/bbsvim settings.py/INSTALL搜索字符串新增如下内容注意允许所有主机

编写URL
cd /opt/blog/bin/bbs/bbsvim urls.py写入以下内容

6 编写Django的 app01/views.py
cd /opt/blog/bin/bbs/bbs
7 启动项目
cd /opt/blog/bin/bbs [带manage的文件夹下运行]python3 manage.py runserver 0.0.0.0:10001
8 版本降级重新配置 urls.py
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.25
from django.conf.urls import urlurlpatterns = [url('^admin/', admin.site.urls),url('^hello/', views.hello),]
9 迁移数据库
python manage.py migrate
10 正确的URL以及最终效果

补充 如何启动虚拟环境
(blog) [root@vvkt7whznuckhiz2-0723575 bin]# lsactivate activate.nu bbs django-admin.py pip-3.9 python sqlformat wheel-3.9activate.csh activate.ps1 deactivate.nu pip pip3.9 python3 wheel wheel3.9activate.fish activate_this.py django-admin pip3 __pycache__ python3.9 wheel3(blog) [root@vvkt7whznuckhiz2-0723575 bin]# source activate
补充 完整目录树[有删减]
[root@vvkt7whznuckhiz2-0723575 blog]# tree -L 4.├── bin│ ├── activate│ ├── activate_this.py│ ├── bbs│ │ ├── app01│ │ │ ├── admin.py│ │ │ ├── apps.py│ │ │ ├── __init__.py│ │ │ ├── migrations│ │ │ ├── models.py│ │ │ ├── __pycache__│ │ │ ├── tests.py│ │ │ └── views.py│ │ ├── bbs│ │ │ ├── asgi.py│ │ │ ├── __init__.py│ │ │ ├── __pycache__│ │ │ ├── settings.py│ │ │ ├── urls.py│ │ │ └── wsgi.py│ │ ├── db.sqlite3│ │ └── manage.py│ ├── deactivate.nu│ ├── django-admin│ ├── django-admin.py│ ├── pip│ ├── pip3│ ├── pip-3.9│ ├── pip3.9│ ├── wheel-3.9│ └── wheel3.9├── lib│ └── python3.9│ └── site-packages│ ├── asgiref│ └── wheel-0.37.0.virtualenv└── pyvenv.cfg
8 报错 django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17).
自行创建数据库,用户及密码
MariaDB [(none)]> drop database blog;Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]> drop user blogger;Query OK, 0 rows affected (0.002 sec)MariaDB [(none)]> create database blog charset=utf8;Query OK, 1 row affected (0.000 sec)MariaDB [(none)]> create user blogger identified by 'blogger123';Query OK, 0 rows affected (0.001 sec)MariaDB [(none)]> grant all on blog.* to 'blogger'@'%' with grant option;Query OK, 0 rows affected (0.001 sec)
virtualenv虚拟工具及虚拟环境的使用
1 下载虚拟环境工具
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
2 创建虚拟环境
virtualenv bbs[虚拟环境的名字]默认为安装工具的python版本,无需指定virtualenv --help 查看参数说明
3 启动虚拟环境
[root@vvkt7whznuckhiz2-0723575 bin]# lsactivate activate.nu bbs django-admin.py pip-3.9 python sqlformat wheel-3.9activate.csh activate.ps1 deactivate.nu pip pip3.9 python3 wheel wheel3.9activate.fish activate_this.py django-admin pip3 __pycache__ python3.9 wheel3[root@vvkt7whznuckhiz2-0723575 bin]# pwd/opt/blog/bin[root@vvkt7whznuckhiz2-0723575 bin]# source activate(blog) [root@vvkt7whznuckhiz2-0723575 bin]#
4 创建 Django 项目及 app
django-admin startproject blogcd blogdjango-admin startapp app01
5 退出虚拟环境
cd /opt/blog/bindeactivate
4 查看虚拟环境下的资源
(blog) [root@vvkt7whznuckhiz2-0723575 bin]# which python3/opt/blog/bin/python3(blog) [root@vvkt7whznuckhiz2-0723575 bin]# which pip3/opt/blog/bin/pip3(blog) [root@vvkt7whznuckhiz2-0723575 bin]# pip listPackage Version---------- -------asgiref 3.4.1Django 1.11.25pip 21.2.4pysqlite3 0.4.6pytz 2021.3setuptools 58.1.0sqlparse 0.4.2wheel 0.37.0(blog) [root@vvkt7whznuckhiz2-0723575 bin]# echo $PATH/opt/blog/bin:/opt/python396/bin:/opt/sqlite388/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
CentOS7.9 2009 编译安装最新版本mysql
关闭防火墙
systemctl stop firewalldsystemctl disable firewalld
查看和卸载mariadb
rpm -qa | grep mariadbrpm -e --nodeps mariadb-libsrpm -e --nodeps mariadb-devel
预先处理依赖
[root@centos7 ~]# yum -y install gcc-c++ ncurses ncurses-devel perl bison openssl openssl-devel gcc* libxml2 libxml2-develyum -y install gcc-c++ ncurses ncurses-devel perl bison openssl openssl-devel gcc* libxml2 libxml2-devel
创建仅用于启动MySQL的用户
useradd -s /sbin/nologin -M mysqlid mysql
官网下载版本
opt下新建mysql文件夹,解压并且安装
tar xf mysql-8.0.26-1.el7.x86_64.rpm-bundle.tarrpm -ivh --nodeps mysql-community-common-8.0.26-1.el7.x86_64.rpmrpm -ivh --nodeps mysql-community-libs-8.0.26-1.el7.x86_64.rpmrpm -ivh --nodeps mysql-community-client-8.0.26-1.el7.x86_64.rpmrpm -ivh --nodeps mysql-community-server-8.0.26-1.el7.x86_64.rpmmysqld --initialize --user=mysqlrpm -ivh --nodeps mysql-community-test-8.0.26-1.el7.x86_64.rpm
查看文件权限
[root@localhost opt]# cd /var/lib/mysql[root@localhost mysql]# ll总用量 176568-rw-r-----. 1 mysql mysql 56 10月 6 01:23 auto.cnf-rw-------. 1 mysql mysql 1676 10月 6 01:23 ca-key.pem-rw-r--r--. 1 mysql mysql 1112 10月 6 01:23 ca.pem-rw-r--r--. 1 mysql mysql 1112 10月 6 01:23 client-cert.pem-rw-------. 1 mysql mysql 1676 10月 6 01:23 client-key.pem-rw-r-----. 1 mysql mysql 196608 10月 6 01:23 #ib_16384_0.dblwr-rw-r-----. 1 mysql mysql 8585216 10月 6 01:23 #ib_16384_1.dblwr-rw-r-----. 1 mysql mysql 5889 10月 6 01:23 ib_buffer_pool-rw-r-----. 1 mysql mysql 12582912 10月 6 01:23 ibdata1-rw-r-----. 1 mysql mysql 50331648 10月 6 01:23 ib_logfile0-rw-r-----. 1 mysql mysql 50331648 10月 6 01:23 ib_logfile1drwxr-x---. 2 mysql mysql 6 10月 6 01:23 #innodb_tempdrwxr-x---. 2 mysql mysql 143 10月 6 01:23 mysql-rw-r-----. 1 mysql mysql 25165824 10月 6 01:23 mysql.ibddrwxr-x---. 2 mysql mysql 8192 10月 6 01:23 performance_schema-rw-------. 1 mysql mysql 1676 10月 6 01:23 private_key.pem-rw-r--r--. 1 mysql mysql 452 10月 6 01:23 public_key.pem-rw-r--r--. 1 mysql mysql 1112 10月 6 01:23 server-cert.pem-rw-------. 1 mysql mysql 1680 10月 6 01:23 server-key.pemdrwxr-x---. 2 mysql mysql 28 10月 6 01:23 sys-rw-r-----. 1 mysql mysql 16777216 10月 6 01:23 undo_001-rw-r-----. 1 mysql mysql 16777216 10月 6 01:23 undo_002
查看密码
[root@localhost mysql]# cat /var/log/mysqld.log2021-10-05T17:23:34.388370Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.26) initializing of server in progress as process 111082021-10-05T17:23:34.410027Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.2021-10-05T17:23:35.309481Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.2021-10-05T17:23:37.400348Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main2021-10-05T17:23:37.400750Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main2021-10-05T17:23:37.415729Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: hop+Dguuo8o=
登陆MySQL并且修改密码
mysql -u root -palter user user() identified by "root123";
默认密码
hop+Dguuo8o=
参考致谢
https://blog.csdn.net/qq_42527269/article/details/113835649https://blog.csdn.net/qq_32077121/article/details/118578343https://blog.csdn.net/webnum/article/details/81257755https://blog.csdn.net/HeatDeath/article/details/79065872
报错及解决
error while loading shared libraries: libaio.so.1: cannot open shared object file: No suchyum install -y libaioCan't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sockln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
# 复习及拓展知识
如何查看系统发行版本?
cat /etc/redhat-releaseCentOS Linux release 7.9.2009 (Core)通用查看方案---适用于任何Linux系统cat /etc/os-releaseNAME="CentOS Linux"VERSION="7 (Core)"ID="centos"ID_LIKE="rhel fedora"VERSION_ID="7"PRETTY_NAME="CentOS Linux 7 (Core)"ANSI_COLOR="0;31"CPE_NAME="cpe:/o:centos:centos:7"HOME_URL="https://www.centos.org/"BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"CENTOS_MANTISBT_PROJECT_VERSION="7"REDHAT_SUPPORT_PRODUCT="centos"REDHAT_SUPPORT_PRODUCT_VERSION="7"
Linux下UID GID是什么?
iduid=0(root) gid=0(root) groups=0(root)
如何切换用户?
su - 用户名 切换用户以及环境变量
普通用户无法执行命令怎么办?
1. 编辑配置文件vim /etc/sudoerssudo vim /etc/sudoers2. 写入如下代码,添加用户## Allow root to run any commands anywhereroot ALL=(ALL) ALLvistor ALL=(ALL) ALL3. 测试权限sudo touch /root/我五五开是清白的.txt4. 查看文件sudo ls /root
如何避免压缩时包含父文件夹?
1. 包含父文件夹的打包方式,当前在opt目录下tar -zcvf /opt/tmpbak.tar.gz /tmp/*2. 去掉父文件夹再打包, 当前就在tmp目录下tar -zcvf /opt/tmpbak.tar.gz ./*
CentOS使用什么命令管理服务?
systemctl # CentOS7service # CentOS7更低版本使用的命令
CRM项目的部署
背景信息
软件开发的环境小公司—> 本地开发人员 + 测试环境 + 线上环境大公司 —> 本地测试环境 + 预生产环境 + 线上环境阶段开发环境 Windows Ubuntu MacOS 本地开发代码的环境测试服务器 代码测试,以上环境还需要再搭建一遍,测试服务器才能运行项目如何解决环境问题?
1. 虚拟机的模板克隆,打包一个基础开发环境,克隆多份已部署环境2. 利用Dokcer容器化技术,镜像打包;
操作步骤
目录准备
cd /tmpmkidr penv# 上传文件至此cd project_permission/
新建虚拟环境[env3]
python3 -m venv env3
激活虚拟环境
cd /env3/binsource activate
安装全部依赖以及升级pip
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txtpip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
安装其他的依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.25pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysqlpip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-multiselectfield
导入数据库
# 登录数据库mysql -u crm -pcrm123use crmsource /opt/Blog/test.sql
测试运行
cd /tmp/Blog/Blog2python manage.py runserver 0.0.0.0:10001
uwsgi启动 python web
理论知识
1. 支持并发形式启动,支持多进程,多线程,乃至于协程的一个由C语言编写的高性能工具2. Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。3. wsgiref是WSGI规范的参考实现,可用于将WSGI支持添加到Web服务器或框架。它提供了用于操纵WSGI环境变量和响应头的实用程序,用于实现WSGI服务器的基类,为WSGI应用程序提供服务的演示HTTP服务器以及用于检查WSGI服务器和应用程序是否符合WSGI规范(PEP 333)的验证工具。4. Gunicorn是一个Python网络服务器网关界面(WSGI)HTTP服务器。这是一个前叉工人模型,从Ruby的独角兽项目移植。Gunicorn 服务器与许多Web 框架大致兼容,简单实现,轻视服务器资源,速度相当快。5. mode_wsgi格雷厄姆·邓普尔顿的阿帕奇 HTTP 服务器模块,它为在阿帕奇下托管基于Python 的 Web 应用程序提供了符合WSGI的界面。截至版本 4.5.3, mode_wsgi 支持 Python 2 和 3 (从 2.6 和 3.2 开始)。6. uWSGIuWSGI是一个软件应用程序,它"旨在开发一个完整的堆栈来构建托管服务"。以 Web 服务器网关接口(WSGI) 命名,这是该项目支持的第一个插件。uwsgi (所有小写)是 uWSGI 用于与其他服务器通信的本地二进制协议。uWSGI 通常用于与切罗基和Nginx等Web 服务器一起为Python 网络应用程序提供服务,这些服务器为 uWSGI 的本地 uwsgi 协议提供直接支持。例如, 数据可能会这样流动: Http 客户端↔ Nginx ↔ uwsgi ↔ Python 应用程序。
补充知识
1. Django部署1. Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。2. Django的 startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。2. application1. 使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。它通常在服务器可访问的Python模块中作为名为 application 的对象提供。startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。
common commandline
# 启动uwsgi --ini uwsgi.ini# 停止uwsgi --stop uwsgi.pid# restartuwsgi --reload uwsgi.pid
explaination of configuration
#在退出uwsgi环境后,清空环境变量vacuum = true# 后台启动daemonize = yes
操作步骤
安装uwsgi并且检查状态
安装UWSGIpip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi# 检查是否安装成功pip listuWSGI 2.0.20
uwsgi 配置信息
[uwsgi]# Django-related settings# 填写CRM项目第一层绝对路径chdir = /tmp/Blog/Blog2# 填写 CRM 项目第二层相对路径,找到第二层目录下的wsgi.py# 这里写的不是路径,而是以上一个参数为相对,找到第二层目录下的wsgi.py文件module = whereabouts.wsgi# 虚拟环境Python解释器路径home = /tmp/Blog/envb# process-related settings# mastermaster = true# 推荐性能为 核数 * 2 + 1processes = 3#threads = 2# socket和Nginx结合部署 unix-socket参数,这里先临时暂停使用# the socket (use the full path to be safe#socket = 1010# 线上部署不会使用http参数,对于后端不安全,使用socket连结是安全的,用Nginx反向代理去访问# 后端程序是运行在防火墙内部,外网无法直接访问# 临时使用http参数,便于浏览器直接调试http = 0.0.0.0:10001# ... with appropriate permissions - may be needed# chmod-socket = 664# clear environment on exitvacuum = truepidfile=uwsgi.piddaemonize=uwsgi.log
启动项目
cd /tmp/Blog/Blog2d
报错
1 [uWSGI] getting INI configuration from uwsgi.ini
https://blog.csdn.net/lch551218/article/details/104844454
总结
此时CRM 项目已经用 uwsgi 支持三个进程的启动了,但是由于 uwsgi 对静态文件的解析能力很弱,该资源是分配给 nginx 处理的;
补充-查看与 UWSGI 对应的 Python 版本
uwsgi --python -versionPython version: 3.9.6 (default, Oct 9 2021, 15:55:21) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
注意 uwsgi配置文件 要与manage.py同级
引用与参考
https://www.jianshu.com/p/09846dafef13
supervisor进程管理工具
简介
Linux系统的进程管理方式1. ps -ef | grep python32. ps -ef | grep uwsgi # 检查 uwsgi 进程,确认 Django 是否存活,如果检测到 PID 是 5999 停止 uwsgi3. kill -9 5999# 检测 uwsgi 挂掉之后,自动重启# 使用supervisor 进程管理工具,启动 uwsgi 之后,进程挂掉会重启,相当于 Docker的 daemon 后台守护CRM 的技术栈nginx + uwsgi + django + mysql 我们可以手动的启动单独的进程还可以通过 supervisor 一键启动这四个进程, 进行批量管理,批量停用,非常方便
使用
yum install epel-releaseyum install -y supervisorsystemctl enable supervisordsystemctl start supervisordsystemctl restart supervisord# 查看状态ps -ef|grep supervisord
参考及引用
[CentOS7 安装Supervisor及使用详解]:(1条消息) CentOS7 安装Supervisor及使用详解_魂影魔宅-CSDN博客
常用命令
进入控制台之后
reread # 重读reload # 重载restart all # 重启stop all # 关闭tail Luffyvue stdout # 查看标准输出
报错: Unlinking stale socket /tmp/supervisor.sock
Unlinking stale socket /tmp/supervisor.sock
报错:error: <class 'xmlrpclib.Fault'>, <Fault 6: 'SHUTDOWN_STATE'>: file: /usr/lib64/python2.7/xmlrpclib.py line: 794
supervisord -c /etc/supervisord.conf
报错: uwsgi出现invalid request block size: 21573 (max 4096)...skip
# 配置文件中指定大小,不能超过物理4GB 分配的4Kbuffer-size = 65536# 从socket[提供给Nginx用于代理的接口]转换为Http方式
报错 bind(): Permission denied [core/socket.c line 230]
修改uwsgi 以及 Nginx中配置,将所有地址均加上本地IP地址作为前缀
正常启动
(env_blog) [root@vvkt7whznuckhiz2-0723575 whereabouts]# uwsgi --ini ./uwsgi.ini[uWSGI] getting INI configuration from ./uwsgi.ini*** Starting uWSGI 2.0.20 (64bit) on [Mon Oct 25 20:18:29 2021] ***compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-44) on 25 October 2021 07:23:15os: Linux-3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021nodename: vvkt7whznuckhiz2-0723575.novalocalmachine: x86_64clock source: unixpcre jit disableddetected number of CPU cores: 1current working directory: /opt/whereaboutswriting pidfile to uwsgi.piddetected binary path: /opt/whereabouts/env_blog/bin/uwsgisetgid() to 1001setuid() to 1001chdir() to /opt/whereaboutsyour processes number limit is 7268your memory page size is 4096 bytesdetected max file descriptor number: 65535lock engine: pthread robust mutexesthunder lock: disabled (you can enable it with --thunder-lock)uwsgi socket 0 bound to TCP address 192.168.1.9:20001 fd 3Python version: 3.9.6 (default, Oct 9 2021, 15:55:21) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]PEP 405 virtualenv detected: /opt/whereabouts/env_blogSet PythonHome to /opt/whereabouts/env_blog*** Python threads support is disabled. You can enable it with --enable-threads ***Python main interpreter initialized at 0x229aa70your server socket listen backlog is limited to 100 connectionsyour mercy for graceful operations on workers is 60 secondsmapped 291680 bytes (284 KB) for 3 cores*** Operational MODE: preforking ***/opt/whereaboutsWSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x229aa70 pid: 23727 (default app)*** uWSGI is running in multiple interpreter mode ***spawned uWSGI master process (pid: 23727)spawned uWSGI worker 1 (pid: 23728, cores: 1)spawned uWSGI worker 2 (pid: 23729, cores: 1)spawned uWSGI worker 3 (pid: 23730, cores: 1)[pid: 23730|app: 0|req: 1/1] 8.210.90.161 () {42 vars in 851 bytes} [Mon Oct 25 20:18:36 2021] GET / => generated 14127 bytes in 172 msecs (HTTP/1.1 200) 7 headers in 226 bytes (1 switches on core 0)[pid: 23730|app: 0|req: 2/2] 167.94.138.114 () {28 vars in 313 bytes} [Mon Oct 25 20:24:01 2021] GET / => generated 14127 bytes in 24 msecs (HTTP/1.1 200) 7 headers in 226 bytes (1 switches on core 0)
1 安装 supervisor
# 使用清华大学的数据yum install epel-releasesed -e 's!^metalink=!#metalink=!g' \-e 's!^#baseurl=!baseurl=!g' \-e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \-e 's!http://mirrors!https://mirrors!g' \-i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repoyum -y install supervisor
2 生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
定义配置文件
supervisord.conf配置文件参数解释[program:xx]是被管理的进程配置参数,xx是进程的名称[program:xx]command=; 程序启动命令autostart=true ; 在supervisord启动的时候也自动启动startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启startretries=3 ; 启动失败自动重试次数,默认是3stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
虚拟环境准备
cd /tmp/Blog/Blog2python3 -m venv envbcd /envb/bin/source activatecd /tmp/Blogpip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pippip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txtpip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi
再次确认 uwsgi 相关文件路径
# 虚拟环境下的 uwsgi 的位置/tmp/Blog/envc/bin# uwsgi.ini的位置/tmp/Blog/Blog2
uwsgi 启动命令
/tmp/Blog/envc/bin/uwsgi --ini /tmp/Blog/Blog2/uwsgi.ini
修改 supervisord.conf 配置文件
# supervisord.conf配置文件参数解释# [program:xx]是被管理的进程配置参数,xx是进程的名称[program:Blog]command=/tmp/Blog/envc/bin/uwsgi --ini /tmp/Blog/Blog2/uwsgi.iniautostart=true ; 在supervisord启动的时候也自动启动startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启startretries=3 ; 启动失败自动重试次数,默认是3stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
启动 supervisor
supervisord -c /etc/supervisord.confsupervisorctl -c /etc/supervisord.confBlog RUNNING pid 17058, uptime 0:02:27supervisor> statusBlog RUNNING pid 17058, uptime 0:02:30supervisor> quit
补充
ps -ef | grep uwsgiroot 16453 15744 0 11:48 pts/1 00:00:00 grep --color=auto uwsgi# uwsgi 为 grep 过滤产生的临时数据,并未运行
报错: exited: Blog (exit status 1; not expected)
1. 探索性解决:找到日志,不指定则存放在项目根目录 即 /tmp 名为: supervisord.log2. 指定日志的方式 在配置文件 supervisord.conf 中新增如下内容stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MBstdout_logfile=/tmp/sp.out ; 需要用户新建该目录3. 定位问题:单独启动UWSGIrobably another instance of uWSGI is running on the same address (0.0.0.0:10001).4. 更换端口号即可解决,注意当前虚拟环境必须与uwsgi指定虚拟环境完全一致
supervisor 常用命令
#查看所有进程的运行状态 supervisorctl status#查看某一进程的运行状态 supervisorctl status 进程名#启动某一进程 supervisorctl start 进程名#启动所有进程 supervisorctl start all#停止某一进程 supervisorctl stop 进程名#停止所有进程 supervisorctl stop all#重启某一进程 supervisorctl restart 进程名#重启所有进程 supervisorctl restart all#新增进程后,更新进程(不影响其他进程运行) supervisorctl update#新增进程后,重启所有进程 supervisorctl reload
对 Nginx 工作原理的 补充
- master — 工头进程 / 主人进程
- worker — 主进程突然挂了, 工作进程就变为僵尸进程
- 因此杀死 uwsgi 需要向这个进程组发送终止信号,杀死一组进程
