Linux用户管理

  1. 对于一个QQ群而言,有哪些角色划分,权利的划分“
  2. 群主—QQ群里面权限最大
  3. 管理员—root临时赋予的超级权限,—在用皇帝的身份狐假虎威,拿着尚方宝剑—Linux中的sudo命令
  4. 吃瓜群众—权限最低,基本只能够在自己的家目录进行增删改查,其他目录的权限都很低—-Linux的普通用户

系统创建了用户,同时也会创建一个同名的组,例如

  1. useradd canxun # 创建普通用户
  2. 系统会在 ```/etc/passwd```下增加一行用户信息,且同时创建了一个用户组,也叫做*canxun*
  3. 该用户组存放在/etc/group

查看普通用户

  1. tail -5 /etc/passwd
  2. polkitd:x:999:998:User for polkitd:/:/sbin/nologin
  3. tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
  4. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  5. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  6. caesar:x:1000:1000::/home/caesar:/bin/bash

root而言

为什么叫做root用户?

  1. 因为系统设计了`UID`的概念,用户ID号码,用户ID为零,指的是系统的超级用户;
  2. 普通用户由root用户创建,默认的`UID`是从1000开始,权限很低;

普通用户

默认用户的家目录都在 /home下,例如:

  1. `/home/caesar`
  2. `/home/tylor`

用户管理的命令

添加删除用户,需要注意的是:涉及到权限的修改,只能由root用户操作,其他人基本没有权限;

  1. useradd canxun # 创建用户:canxun
  2. passwd canxun # 给用户修改密码
  3. userdel canxun # 删除用户
  4. userdel -rf canxun # 删除用户以及用户home目录
  5. passwd # 未指定用户则修改当前用户的密码

删除用户以及重新检查

  1. [root@vvkt7whznuckhiz2-0723575 ~]# userdel -rf caesar
  2. [root@vvkt7whznuckhiz2-0723575 ~]# grep "caesar" /etc/passwd
  3. [root@vvkt7whznuckhiz2-0723575 ~]#

用户切换

  1. # 添加用户以及设置密码
  2. useradd tylor
  3. passwd qwe98322@
  4. # 切换用户以及环境变量
  5. [root@vvkt7whznuckhiz2-0723575 home]# su - tylor
  6. [tylor@vvkt7whznuckhiz2-0723575 ~]$
  7. # 当前用户的工作目录
  8. [tylor@vvkt7whznuckhiz2-0723575 ~]$ pwd
  9. /home/tylor

尚方宝剑命令

  1. 1. tylor用户想要进入/root文件夹时发现用户权限不够,应该怎么办呢?
  2. 思路:
  3. 1. 使用sudo命令,默认以root身份去执行命令
  4. 例如: sudo cd /root
  5. 2. tylor用户加入root组里,也就拥有了root权限,但还是需要查看用户组权限;

[sudo]命令使用配置流程

  1. 1. 使用visudo命令,修改配置文件,添加 你允许执行的sudo命令用户
  2. 修改配置信息,如下:
  3. 99 ## Allow root to run any commands anywhere
  4. 100 root ALL=(ALL) ALL
  5. 101 tylor ALL=(ALL) ALL
  6. 2. 代码示例
  7. [tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo cd /root
  8. [sudo] password for tylor:
  9. [tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo cd /root # 加上sudo命令已经能够进入 /root文件夹
  10. [tylor@vvkt7whznuckhiz2-0723575 ~]$ pwd
  11. /home/tylor
  12. [tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo ls /root # 查看root下所有文件
  13. admin.text admir.text
  14. [tylor@vvkt7whznuckhiz2-0723575 ~]$ touch /root/tylor到此一游 # 普通用户身份仍然无法创建文件夹
  15. touch: cannot touch ‘/root/tylor到此一游’: Permission denied
  16. [tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo touch /root/person
  17. [tylor@vvkt7whznuckhiz2-0723575 ~]$ sudo ls /root # 创建成功查看文件信息
  18. admin.text admir.text person

id命令

查看用户的账户信息

  1. [root@vvkt7whznuckhiz2-0723575 ~]# id root
  2. uid=0(root) gid=0(root) groups=0(root)

组的概念

对于技术部门,运维需要分配单个用户的权限太散,太多;

  1. [权限控制:针对不同的组,不同的用户,针对不同的文件夹,文件设置不同的权限];
  2. 前端组;后端组;运维组;测试部门;安全部门;DB部门;

运维都得对上述的人进行权限控制,对于服务器操作权限;因此引入组的概念,针对整个组进行管理,更加方便;

比如:

  1. MySQL的默认数据存放位置,如/var/lib/mysql/* 那么这个MySQL数据文件以及文件夹是属于哪个组,那个用户管理呢?
  2. [root@vvkt7whznuckhiz2-0723575 ~]# ll /tmp/
  3. total 44828
  4. -rw-r--r-- 1 root root 946 Sep 30 16:09 admin.text
  5. drwxr-xr-x 2 root root 4096 Sep 30 20:48 hsperfdata_root
  6. drwxr-xr-x 2 root root 4096 Sep 29 16:03 python1
  7. 第一组数据指的是读写权限,第二组为当前所属用户,第三组为当前所属组,

Linux文件,目录权限管理

对于Linux而言,文件夹,文件都有user, group,属主和属组的角色划分,还存在一个other其他人三个身份的划分;

设置了三种权限,可读可写可执行,分别为 R, W, X;

数值与权限

  1. 读取权限:等于4 用 r 表示
  2. 写入权限:等于2 用 w 表示
  3. 执行权限:等于1 用 x 表示

文件与目录权限

Linux设置权限的目的:保护账户资料

Linux权限主要按照三种身份划分:

  1. other/owner 文件使用者,文件属于哪个用户;
  2. group 属组。文件属于哪个组;
  3. other既不是 user 也不是group,就是other,其他人;

Linux的权限观察

  1. [root@vvkt7whznuckhiz2-0723575 ~]# ls -l /tmp
  2. total 44828
  3. -rw-r--r-- 1 root root 946 Sep 30 16:09 admin.text
  4. # 每三个一组
  5. - 代表普通文件类型
  6. rw-:user的权限
  7. r--:group的权限
  8. r--:other的权限
  9. # 1 指的是文件链接数目
  10. # 第一个root指的是属主,第二个root指的是属组
  11. # 其次为文件大小
  12. # 最后为文件最后修改日期和文件名字

案例1:普通用户如何写入root用户创建的文件呢?

  1. [root@vvkt7whznuckhiz2-0723575 tmp]# chmod o+w test.py
  2. [root@vvkt7whznuckhiz2-0723575 tmp]# su - tylor
  3. Last login: Fri Oct 1 11:11:02 CST 2021 on pts/0
  4. [tylor@vvkt7whznuckhiz2-0723575 ~]$ echo "给other赋予写入权限之后就可以自行写入文件,然而other是相当于属主而言的" >> test.py
  5. [tylor@vvkt7whznuckhiz2-0723575 ~]$ cat test.py
  6. other赋予写入权限之后就可以自行写入文件,然而other是相当于属主而言的

chmod命令总结

  1. chmod 可以更改文件权限,修改针对user, group, other的权限,例如:
  2. chmod u+r file.text # 给文件的user 添加读的权限
  3. chmod g-x file.text # 删除文件用户组的执行权限
  4. chmod o+r / o+w / o+x file.test # 给文件的other身份最大的权限,读写可执行
  5. chmod 000 file.text # 给文件最低的权限 任何人不能读写执行

chgrp命令

更改用户所属的组

  1. chgrp 新的属组 file.text

chown命令

更改文件的所有者owner/user

  1. chown 新的属主 file.text

对于文件的rwx权限

  1. 1. r cat, more, less, head,等读取文件的操作
  2. 2. w vim, echo 等写入文件的操作
  3. 3. x 可执行脚本,比如bash,python,文件会变为绿色

案例1—测试脚本文件的执行

  1. [tylor@vvkt7whznuckhiz2-0723575 tmp]$ vim echo.sh
  2. [tylor@vvkt7whznuckhiz2-0723575 tmp]$ bash echo.sh
  3. 我是用来测试脚本文件的
  4. [tylor@vvkt7whznuckhiz2-0723575 tmp]$ cat echo.sh
  5. echo "我是用来测试脚本文件的"
  6. # 第二种方法:给用户或者所有者添加可执行权限,然后以脚本方式运行
  7. [root@vvkt7whznuckhiz2-0723575 tmp]# chmod u+x echo.sh
  8. [root@vvkt7whznuckhiz2-0723575 tmp]# su - tylor
  9. Last login: Fri Oct 1 11:30:10 CST 2021 on pts/0
  10. [tylor@vvkt7whznuckhiz2-0723575 ~]$ cd /tmp
  11. [tylor@vvkt7whznuckhiz2-0723575 tmp]$ ./echo.sh
  12. 我是用来测试脚本文件的

对于文件夹的rwx

  1. R, W,X的数值分别是4,2,1,因此对用户,组,其他设置的权限可以用数字表达;
  2. 所以各个用户的最高权限为777, 最低权限为000. vim编辑后权限为664.;
  3. 如果一个文件的权限为664,表示对于用户的权限为读写,对于组权限为读写,对于其他的权限为读;

软链接

windows的一个快捷方式而已

创建语法: ln -s /tmp/test.py[原始文件] /opt/test.text[目标文件,开始链接时创建]

删除快捷方式:test.text不会影响原文件

  1. [root@vvkt7whznuckhiz2-0723575 tmp]# ls
  2. admin.text hsperfdata_root python2 python3 python4 python_a python_c python.txt wrapper-615-1-in
  3. echo.sh python1 python2.txt python3.txt python5 python_b python_d test.py wrapper-615-1-out
  4. [root@vvkt7whznuckhiz2-0723575 tmp]# echo "我是一只小小鸟" >> test.py
  5. [root@vvkt7whznuckhiz2-0723575 tmp]# cat /tmp/test.py
  6. "我是测试数据"
  7. 我是一只小小鸟
  8. [root@vvkt7whznuckhiz2-0723575 tmp]# ln -s /tmp/test.py /opt/test.text
  9. [root@vvkt7whznuckhiz2-0723575 opt]# ll
  10. total 0
  11. lrwxrwxrwx 1 root root 12 Oct 1 16:59 test.text -> /tmp/test.py
  12. -rw-r--r-- 1 root root 0 Oct 1 16:56 test.txt
  13. [root@vvkt7whznuckhiz2-0723575 opt]# cat test.text
  14. "我是测试数据"
  15. 我是一只小小鸟

打包,压缩,解压缩

简介以及语法

打包不节省空间,便于传输;压缩,节省磁盘空间;

  1. 语法
  2. tar 命令
  3. 功能参数
  4. -z 调用gzip命令,对文件压缩,加上这个参数才会节省磁盘空间
  5. -x 解包,拆快递包裹的过程
  6. -v 显示整个过程
  7. -f 必须写在参数的结尾,指定压缩文件的名字
  8. -c 打包,收拾快递
  9. # 压缩文件的后缀只是告诉别人,该文件用什么命令压缩和解压缩
  10. ```*.gz``` gzip命令解压缩
  11. ```*.tar``` tar命令解压缩
  12. ```*.gz``` xz解压缩
  13. ```*.zip``` unzip解压缩

补充:解压 xz 文件

  1. xz -d xyz.tar.xz
  2. tar -xvf xyz.

案例1

打包test.txt文件,打包为tar文件allopt.tar

  1. [root@vvkt7whznuckhiz2-0723575 opt]# tar -cvf allopt.tar test.txt
  2. test.txt
  3. [root@vvkt7whznuckhiz2-0723575 opt]# ls
  4. allopt.tar q1.txt q2.txt q3.txt q.txt quanquan.txt test.text test.txt
  5. # 解包操作
  6. [root@vvkt7whznuckhiz2-0723575 zip]# tar -xvf /opt/allopt.tar
  7. test.txt
  8. [root@vvkt7whznuckhiz2-0723575 zip]# ls
  9. test.txt
  10. # 解包
  11. 第一步 打包某个文件
  12. tar -cvf /opt/test.py allopt.tar
  13. 第二步 解包tar到当前文件夹
  14. tar -xvf allopt.tar

案例2

打包且压缩/opt下所有内容,生成tar.gzallopt.tar.gz

第一步

  1. 第一步:打包且压缩 tmp下所有文件打包为alltmp.tar.gz并且放置在opt目录下
  2. [root@vvkt7whznuckhiz2-0723575 tmp]# tar -zcvf /opt/alltmp.tar.gz /tmp/*
  3. tar: Removing leading `/' from member names
  4. /tmp/admin.text
  5. /tmp/echo.sh
  6. /tmp/hsperfdata_root/
  7. /tmp/hsperfdata_root/620
  8. /tmp/python1/
  9. /tmp/python2/
  10. /tmp/python2.txt
  11. /tmp/python3/
  12. /tmp/python3.txt
  13. /tmp/python4/
  14. /tmp/python5/
  15. /tmp/python_a
  16. /tmp/python_b
  17. /tmp/python_c
  18. /tmp/python_d
  19. /tmp/python.txt
  20. /tmp/test.py
  21. /tmp/wrapper-615-1-in
  22. /tmp/wrapper-615-1-out

第二步

  1. 第二步: 解压缩,常见的 ```*.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

  1. <a name="8606f66d"></a>
  2. # 防火墙
  3. <a name="69fa3701"></a>
  4. ## 作用
  5. > 用于控制服务器的出入流量;防止恶意流量攻击服务器,提供保护服务器的端口等服务;
  6. > 在学习阶段直接关闭,专业的运维人员要学习`iptables`软件的一些指令
  7. <a name="706086ba"></a>
  8. ## 常识
  9. > 在云服务器上,默认有一个硬件防火墙和一个软件防火墙[`iptables, firewalled]`
  10. > 在云服务器上运行`Django`,如果服务器开启了防火墙,且没有自定义规则,默认是拒绝所有外来流量,导致我们的Windows浏览器无法访问到Linux服务器上运行的`Django`等程序
  11. <a name="0dfbe902"></a>
  12. ## 常用命令
  13. ```shell
  14. # 1. 清空防火墙规则
  15. iptables -F
  16. # 2. 关闭防火墙的服务
  17. systemctl stop firewalld
  18. systemctl disable firewalld # 禁止防火墙开机自启

DNS域名解析

原理

  1. 机器去本地hosts文件,检查是否写了对应的域名解析关系;

  2. 去指定的DNS服务器上寻找对应的解析关系;
    公网中的域名解析服务器:腾讯119.29.29.29

Linux下DNS客户端的配置文件

  1. # 配置文件定义了主备两个```DNS```服务器地址
  2. vim /etc/resolv.conf
  3. # Generated by NetworkManager
  4. search openstacklocal novalocal
  5. nameserver 100.125.0.250
  6. nameserver 114.114.114.114
  7. options single-request-reopen
  8. # Linux本地DNS强制解析文件 /etc/hosts,可以写入一些域名供本地测试使用
  9. # 本地强制解析文件的优先级比/etc/resolv.conf更高

nslookup[查找NDS域名解析与主机名]命令

原理

  1. 浏览器进行```DNS```查找,解析域名对应的```IP```地址,找到之后浏览器访问该```IP```地址;用户请求访问网页,请求到达服务器时,优先发给 ```Nginx```,用户请求静态资源,```Nginx```则直接从磁盘上找到资料给用户查看;
  2. 如果``Nginx``检测到用户请求是一个动态请求,登录,注册,读取数据库,例如 ```.php ```例如 ```.aspx```,通过URL匹配发现是动态请求,转发给后端的应用服务器```[tomcat, php, django]

Django处理完用户的动态请求之后,如果发现需要读取数据库,再通过pymysqlMySQL读取数据;

如果处理请求发现读取的是redis, 再通过pyredis向redis拿数据; Django 处理完请求之后,返回给nginx数据,nginx再返回给用户浏览器,浏览器渲染好页面后再展示给用户; 推荐阅读 《大型网站技术架构》

  1. <a name="ddf7d2a5"></a>
  2. ## 命令
  3. ```shell
  4. # 查找提供此命令的包
  5. yum provides */nslookup
  6. # 安装对应的包
  7. yum -y install bind-utils
  8. # 输入nslookup进入交互式命令
  9. nslookup
  10. # 输入网址进行查询
  11. > www.pythonav.cn
  12. Server: 100.125.0.250
  13. Address: 100.125.0.250#53
  14. # 退出
  15. exit

crontab定时任务

定时任务的语法规则

  1. 为什么设置脚本时使用绝对路径?
  2. crontab 存在局部环境变量,如果不指定精确位置,那么脚本运行时则没有支撑文件
  3. * * * * * 命令的绝对路径
  4. 分 时 日 月 周
  5. 3,5 * * * * 每小时的第三分钟,第五分支执行命令
  6. 15, 2-5 * * * 每天的两点一刻,三点一刻,四点一刻和五点一刻执行命令
  7. 30 08 * * * 每天八点半上班
  8. 00 00 * * * 每天24点下班
  9. 每分钟执行一次命令
  10. * * * * *
  11. 每小时的第三分钟,第五分钟执行
  12. 3, 15 * * *
  13. 上午8-11点的第三分钟,第十五分钟执行
  14. 3, 15 8-11 * * *
  15. 每晚九点半执行
  16. 30 21 * * * 二十四小时制
  17. 每周六,周日1:30执行
  18. 30 13 * * 6, 7
  19. 每周一至周五的凌晨一点,清空 /tmp 目录下的所有文件,注意执行命令请使用绝对路径,否则会失效
  20. 0 1 * * 1-5 /usr/bin rm -rf /tmp/*
  21. 每晚零点重启 nginx
  22. 0 0 * * * /usr/bin/systemctl restart nginx
  23. 每个月的1, 10, 22日的4:55重启nginx
  24. 55 4 1,10,22 * * /usr/bin/systemctl restart nginx
  25. 每个星期一的上午八点到十一点的第三分钟到第十五分钟执行命令
  26. 3-15 8-11 * * 1

定时任务服务,提供了一个客户端管理命令;几号和星期几不能共存;

  1. 命令说明
  2. crontab -e # 编辑定时任务配置文件
  3. crontab -l #查看定时任务的规则
  4. 配置参数说明
  5. minute hour day month week command
  6. 其中:
  7. minute 表示分钟,可以是从059之间的任何整数。
  8. hour:表示小时,可以是从023之间的任何整数。
  9. day:表示日期,可以是从131之间的任何整数。
  10. month:表示月份,可以是从112之间的任何整数。
  11. week:表示星期几,可以是从07之间的任何整数,这里的07代表星期日。
  12. command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
  13. 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  14. 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9
  15. 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6
  16. 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,
  17. 例如*/10,如果用在minute字段,表示每十分钟执行一次。

案例1-每分钟将一句话追加到一份文件当中

  1. 1. 打开配置文件
  2. crontab -e
  3. 2. 写入如下命令,命令写入后会有已安装的提示信息
  4. * * * * * /usr/bin/echo "有人问王思聪,钱是万能的吗?王思聪答:钱是万达的!" >> /tmp/wsc.txt
  5. 3. 检查命令
  6. crontab -l
  7. 4. 实时刷新
  8. tail -f /tmp/wsc.txt

其他小技巧–快速上手服务器

  1. ps -ef # 查看运行了那些进程
  2. netstat -tunlp # 查看监听了那些端口
  3. crontabl -l # c
  4. 原则: 绝对路径优先,一般不会出错

Linux软件包管理

软件安装形式

  1. 源代码安装,较为麻烦,可以自选软件版本,亦可扩展第三方额外功能,指定软件安装目录五颗星
  2. rpm包手动安装,需要手动解决依赖关系,两颗星
  3. yum 自动化安装,需配置好yum源,能够自行搜索依赖关系,下载安装和处理依赖关系,
  4. 缺点:版本可能较低;机器数量较多时不容易控制;

更换yum

  1. yum源的默认仓库文件夹是:/etc/yum.repos.d,只有在目录第一层的```*.repo```结尾的文件才会被```yum```读取;
  2. 1. 备份旧的仓库源
  3. cd /etc/yum.repos.d
  4. mkdir repobak
  5. mv *.repo repobak/
  6. 2. 下载repo,epl源文件
  7. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  8. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  9. 3. 测试安装速度
  10. yum -y install redis

Linux编译python3开发环境

采用编译安装的方式

下载包[从国内镜像站]

  1. wget http://npm.taobao.org/mirrors/python/3.9.6/Python-3.9.6.tgz

解决编译安装依赖

  1. 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-devel
  2. yum -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

当前目录下解压

  1. tar -zxvf Python-3.9.6.tgz

删除个别配置

  1. vim configure
  2. enable-optimizations # 删除该行

开始指定安装目录和检查依赖

  1. ./configure --prefix=/opt/python396

开始编译安装

  1. make && make install

安装成功显示的代码

  1. Looking in links: /tmp/tmpprh3c1wl
  2. Processing /tmp/tmpprh3c1wl/setuptools-56.0.0-py3-none-any.whl
  3. Processing /tmp/tmpprh3c1wl/pip-21.1.3-py3-none-any.whl
  4. Installing collected packages: setuptools, pip
  5. WARNING: The scripts pip3 and pip3.9 are installed in '/opt/python396/bin' which is not on PATH.
  6. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  7. Successfully installed pip-21.1.3 setuptools-56.0.0
  8. WARNING: 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的可执行程序目录

  1. [root@vvkt7whznuckhiz2-0723575 bin]# pwd
  2. /opt/python396/bin

系统环境变量中添加如下配置

  1. vim /etc/profile
  2. ### 自定义的python3.9.6的目录
  3. PATH="/opt/python396/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

检查环境变量,重新读取,检查环境是否安装成功

  1. echo $PATH
  2. source /etc/profile
  3. echo $PATH
  4. which pip3
  5. which python3

CentOS7.9.2009 部署Django3

1 安装django

  1. pip3 install django==3.2.7 -i https://pypi.tuna.tsinghua.edu.cn/simple

2 升级pip

  1. cd /opt/python396/bin/
  2. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip

3 创建项目并且进入

  1. django-admin startproject mysite
  2. cd mysite
  3. tree
  4. .
  5. ├── manage.py
  6. └── mysite
  7. ├── asgi.py
  8. ├── __init__.py
  9. ├── settings.py
  10. ├── urls.py
  11. └── wsgi.py
  12. 1 directory, 6 files

4 创建 app01并且查看目录结构

  1. django-admin startapp app01
  2. tree
  3. .
  4. ├── app01
  5. ├── admin.py
  6. ├── apps.py
  7. ├── __init__.py
  8. ├── migrations
  9. └── __init__.py
  10. ├── models.py
  11. ├── tests.py
  12. └── views.py
  13. ├── manage.py
  14. └── mysite
  15. ├── asgi.py
  16. ├── __init__.py
  17. ├── settings.py
  18. ├── urls.py
  19. └── wsgi.py

5 settings.py下注册 app01并且允许所有主机

  1. cd /opt/blog/bin/bbs/bbs
  2. vim settings.py
  3. /INSTALL搜索字符串
  4. 新增如下内容
  5. 注意允许所有主机

Linux进阶命令 - 图1

编写URL

  1. cd /opt/blog/bin/bbs/bbs
  2. vim urls.py
  3. 写入以下内容

Linux进阶命令 - 图2

6 编写Djangoapp01/views.py

  1. cd /opt/blog/bin/bbs/bbs

7 启动项目

  1. cd /opt/blog/bin/bbs [带manage的文件夹下运行]
  2. python3 manage.py runserver 0.0.0.0:10001

8 版本降级重新配置 urls.py

  1. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.25
  1. from django.conf.urls import url
  2. urlpatterns = [
  3. url('^admin/', admin.site.urls),
  4. url('^hello/', views.hello),
  5. ]

9 迁移数据库

  1. python manage.py migrate

10 正确的URL以及最终效果

Linux进阶命令 - 图3

补充 如何启动虚拟环境

  1. (blog) [root@vvkt7whznuckhiz2-0723575 bin]# ls
  2. activate activate.nu bbs django-admin.py pip-3.9 python sqlformat wheel-3.9
  3. activate.csh activate.ps1 deactivate.nu pip pip3.9 python3 wheel wheel3.9
  4. activate.fish activate_this.py django-admin pip3 __pycache__ python3.9 wheel3
  5. (blog) [root@vvkt7whznuckhiz2-0723575 bin]# source activate

补充 完整目录树[有删减]

  1. [root@vvkt7whznuckhiz2-0723575 blog]# tree -L 4
  2. .
  3. ├── bin
  4. ├── activate
  5. ├── activate_this.py
  6. ├── bbs
  7. ├── app01
  8. ├── admin.py
  9. ├── apps.py
  10. ├── __init__.py
  11. ├── migrations
  12. ├── models.py
  13. ├── __pycache__
  14. ├── tests.py
  15. └── views.py
  16. ├── bbs
  17. ├── asgi.py
  18. ├── __init__.py
  19. ├── __pycache__
  20. ├── settings.py
  21. ├── urls.py
  22. └── wsgi.py
  23. ├── db.sqlite3
  24. └── manage.py
  25. ├── deactivate.nu
  26. ├── django-admin
  27. ├── django-admin.py
  28. ├── pip
  29. ├── pip3
  30. ├── pip-3.9
  31. ├── pip3.9
  32. ├── wheel-3.9
  33. └── wheel3.9
  34. ├── lib
  35. └── python3.9
  36. └── site-packages
  37. ├── asgiref
  38. └── wheel-0.37.0.virtualenv
  39. └── pyvenv.cfg

8 报错 django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17).

自行创建数据库,用户及密码

  1. MariaDB [(none)]> drop database blog;
  2. Query OK, 0 rows affected (0.001 sec)
  3. MariaDB [(none)]> drop user blogger;
  4. Query OK, 0 rows affected (0.002 sec)
  5. MariaDB [(none)]> create database blog charset=utf8;
  6. Query OK, 1 row affected (0.000 sec)
  7. MariaDB [(none)]> create user blogger identified by 'blogger123';
  8. Query OK, 0 rows affected (0.001 sec)
  9. MariaDB [(none)]> grant all on blog.* to 'blogger'@'%' with grant option;
  10. Query OK, 0 rows affected (0.001 sec)

virtualenv虚拟工具及虚拟环境的使用

1 下载虚拟环境工具

  1. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv

2 创建虚拟环境

  1. virtualenv bbs[虚拟环境的名字]
  2. 默认为安装工具的python版本,无需指定
  3. virtualenv --help 查看参数说明

3 启动虚拟环境

  1. [root@vvkt7whznuckhiz2-0723575 bin]# ls
  2. activate activate.nu bbs django-admin.py pip-3.9 python sqlformat wheel-3.9
  3. activate.csh activate.ps1 deactivate.nu pip pip3.9 python3 wheel wheel3.9
  4. activate.fish activate_this.py django-admin pip3 __pycache__ python3.9 wheel3
  5. [root@vvkt7whznuckhiz2-0723575 bin]# pwd
  6. /opt/blog/bin
  7. [root@vvkt7whznuckhiz2-0723575 bin]# source activate
  8. (blog) [root@vvkt7whznuckhiz2-0723575 bin]#

4 创建 Django 项目及 app

  1. django-admin startproject blog
  2. cd blog
  3. django-admin startapp app01

5 退出虚拟环境

  1. cd /opt/blog/bin
  2. deactivate

4 查看虚拟环境下的资源

  1. (blog) [root@vvkt7whznuckhiz2-0723575 bin]# which python3
  2. /opt/blog/bin/python3
  3. (blog) [root@vvkt7whznuckhiz2-0723575 bin]# which pip3
  4. /opt/blog/bin/pip3
  5. (blog) [root@vvkt7whznuckhiz2-0723575 bin]# pip list
  6. Package Version
  7. ---------- -------
  8. asgiref 3.4.1
  9. Django 1.11.25
  10. pip 21.2.4
  11. pysqlite3 0.4.6
  12. pytz 2021.3
  13. setuptools 58.1.0
  14. sqlparse 0.4.2
  15. wheel 0.37.0
  16. (blog) [root@vvkt7whznuckhiz2-0723575 bin]# echo $PATH
  17. /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

关闭防火墙

  1. systemctl stop firewalld
  2. systemctl disable firewalld

查看和卸载mariadb

  1. rpm -qa | grep mariadb
  2. rpm -e --nodeps mariadb-libs
  3. rpm -e --nodeps mariadb-devel

预先处理依赖

  1. [root@centos7 ~]# yum -y install gcc-c++ ncurses ncurses-devel perl bison openssl openssl-devel gcc* libxml2 libxml2-devel
  2. yum -y install gcc-c++ ncurses ncurses-devel perl bison openssl openssl-devel gcc* libxml2 libxml2-devel

创建仅用于启动MySQL的用户

  1. useradd -s /sbin/nologin -M mysql
  2. id mysql

官网下载版本

opt下新建mysql文件夹,解压并且安装

  1. tar xf mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar
  2. rpm -ivh --nodeps mysql-community-common-8.0.26-1.el7.x86_64.rpm
  3. rpm -ivh --nodeps mysql-community-libs-8.0.26-1.el7.x86_64.rpm
  4. rpm -ivh --nodeps mysql-community-client-8.0.26-1.el7.x86_64.rpm
  5. rpm -ivh --nodeps mysql-community-server-8.0.26-1.el7.x86_64.rpm
  6. mysqld --initialize --user=mysql
  7. rpm -ivh --nodeps mysql-community-test-8.0.26-1.el7.x86_64.rpm

查看文件权限

  1. [root@localhost opt]# cd /var/lib/mysql
  2. [root@localhost mysql]# ll
  3. 总用量 176568
  4. -rw-r-----. 1 mysql mysql 56 10 6 01:23 auto.cnf
  5. -rw-------. 1 mysql mysql 1676 10 6 01:23 ca-key.pem
  6. -rw-r--r--. 1 mysql mysql 1112 10 6 01:23 ca.pem
  7. -rw-r--r--. 1 mysql mysql 1112 10 6 01:23 client-cert.pem
  8. -rw-------. 1 mysql mysql 1676 10 6 01:23 client-key.pem
  9. -rw-r-----. 1 mysql mysql 196608 10 6 01:23 #ib_16384_0.dblwr
  10. -rw-r-----. 1 mysql mysql 8585216 10 6 01:23 #ib_16384_1.dblwr
  11. -rw-r-----. 1 mysql mysql 5889 10 6 01:23 ib_buffer_pool
  12. -rw-r-----. 1 mysql mysql 12582912 10 6 01:23 ibdata1
  13. -rw-r-----. 1 mysql mysql 50331648 10 6 01:23 ib_logfile0
  14. -rw-r-----. 1 mysql mysql 50331648 10 6 01:23 ib_logfile1
  15. drwxr-x---. 2 mysql mysql 6 10 6 01:23 #innodb_temp
  16. drwxr-x---. 2 mysql mysql 143 10 6 01:23 mysql
  17. -rw-r-----. 1 mysql mysql 25165824 10 6 01:23 mysql.ibd
  18. drwxr-x---. 2 mysql mysql 8192 10 6 01:23 performance_schema
  19. -rw-------. 1 mysql mysql 1676 10 6 01:23 private_key.pem
  20. -rw-r--r--. 1 mysql mysql 452 10 6 01:23 public_key.pem
  21. -rw-r--r--. 1 mysql mysql 1112 10 6 01:23 server-cert.pem
  22. -rw-------. 1 mysql mysql 1680 10 6 01:23 server-key.pem
  23. drwxr-x---. 2 mysql mysql 28 10 6 01:23 sys
  24. -rw-r-----. 1 mysql mysql 16777216 10 6 01:23 undo_001
  25. -rw-r-----. 1 mysql mysql 16777216 10 6 01:23 undo_002

查看密码

  1. [root@localhost mysql]# cat /var/log/mysqld.log
  2. 2021-10-05T17:23:34.388370Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.26) initializing of server in progress as process 11108
  3. 2021-10-05T17:23:34.410027Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
  4. 2021-10-05T17:23:35.309481Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
  5. 2021-10-05T17:23:37.400348Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
  6. 2021-10-05T17:23:37.400750Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
  7. 2021-10-05T17:23:37.415729Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: hop+Dguuo8o=

登陆MySQL并且修改密码

  1. mysql -u root -p
  2. alter user user() identified by "root123";

默认密码

  1. hop+Dguuo8o=

参考致谢

  1. https://blog.csdn.net/qq_42527269/article/details/113835649
  2. https://blog.csdn.net/qq_32077121/article/details/118578343
  3. https://blog.csdn.net/webnum/article/details/81257755
  4. https://blog.csdn.net/HeatDeath/article/details/79065872

报错及解决

  1. error while loading shared libraries: libaio.so.1: cannot open shared object file: No such
  2. yum install -y libaio
  3. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
  4. ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
  5. ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

# 复习及拓展知识

如何查看系统发行版本?

  1. cat /etc/redhat-release
  2. CentOS Linux release 7.9.2009 (Core)
  3. 通用查看方案---适用于任何Linux系统
  4. cat /etc/os-release
  5. NAME="CentOS Linux"
  6. VERSION="7 (Core)"
  7. ID="centos"
  8. ID_LIKE="rhel fedora"
  9. VERSION_ID="7"
  10. PRETTY_NAME="CentOS Linux 7 (Core)"
  11. ANSI_COLOR="0;31"
  12. CPE_NAME="cpe:/o:centos:centos:7"
  13. HOME_URL="https://www.centos.org/"
  14. BUG_REPORT_URL="https://bugs.centos.org/"
  15. CENTOS_MANTISBT_PROJECT="CentOS-7"
  16. CENTOS_MANTISBT_PROJECT_VERSION="7"
  17. REDHAT_SUPPORT_PRODUCT="centos"
  18. REDHAT_SUPPORT_PRODUCT_VERSION="7"

Linux下UID GID是什么?

  1. id
  2. uid=0(root) gid=0(root) groups=0(root)

如何切换用户?

  1. su - 用户名 切换用户以及环境变量

普通用户无法执行命令怎么办?

  1. 1. 编辑配置文件
  2. vim /etc/sudoers
  3. sudo vim /etc/sudoers
  4. 2. 写入如下代码,添加用户
  5. ## Allow root to run any commands anywhere
  6. root ALL=(ALL) ALL
  7. vistor ALL=(ALL) ALL
  8. 3. 测试权限
  9. sudo touch /root/我五五开是清白的.txt
  10. 4. 查看文件
  11. sudo ls /root

如何避免压缩时包含父文件夹?

  1. 1. 包含父文件夹的打包方式,当前在opt目录下
  2. tar -zcvf /opt/tmpbak.tar.gz /tmp/*
  3. 2. 去掉父文件夹再打包, 当前就在tmp目录下
  4. tar -zcvf /opt/tmpbak.tar.gz ./*

CentOS使用什么命令管理服务?

  1. systemctl # CentOS7
  2. service # CentOS7更低版本使用的命令

CRM项目的部署

背景信息

  1. 软件开发的环境
  2. 小公司—> 本地开发人员 + 测试环境 + 线上环境
  3. 大公司 —> 本地测试环境 + 预生产环境 + 线上环境
  4. 阶段
  5. 开发环境 Windows Ubuntu MacOS 本地开发代码的环境
  6. 测试服务器 代码测试,以上环境还需要再搭建一遍,测试服务器才能运行项目
  7. 如何解决环境问题?
  1. 1. 虚拟机的模板克隆,打包一个基础开发环境,克隆多份已部署环境
  2. 2. 利用Dokcer容器化技术,镜像打包;

操作步骤

目录准备

  1. cd /tmp
  2. mkidr penv
  3. # 上传文件至此
  4. cd project_permission/

新建虚拟环境[env3]

  1. python3 -m venv env3

激活虚拟环境

  1. cd /env3/bin
  2. source activate

安装全部依赖以及升级pip

  1. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
  2. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip

安装其他的依赖

  1. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django==1.11.25
  2. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql
  3. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django-multiselectfield

导入数据库

  1. # 登录数据库
  2. mysql -u crm -p
  3. crm123
  4. use crm
  5. source /opt/Blog/test.sql

测试运行

  1. cd /tmp/Blog/Blog2
  2. python manage.py runserver 0.0.0.0:10001

uwsgi启动 python web

理论知识

  1. 1. 支持并发形式启动,支持多进程,多线程,乃至于协程的一个由C语言编写的高性能工具
  2. 2. Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI
  3. 是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。
  4. 3. wsgiref
  5. WSGI规范的参考实现,可用于将WSGI支持添加到Web服务器或框架。它提供了用于操纵WSGI环境变量和响应头的实用程序,
  6. 用于实现WSGI服务器的基类,为WSGI应用程序提供服务的演示HTTP服务器以及用于检查WSGI服务器和应用程序是否符合WSGI规范(PEP 333)的验证工具。
  7. 4. Gunicorn
  8. 是一个Python网络服务器网关界面(WSGIHTTP服务器。这是一个前叉工人模型,
  9. Ruby的独角兽项目移植。Gunicorn 服务器与许多Web 框架大致兼容,简单实现,轻视服务器资源,速度相当快。
  10. 5. mode_wsgi
  11. 格雷厄姆·邓普尔顿的阿帕奇 HTTP 服务器模块,
  12. 它为在阿帕奇下托管基于Python Web 应用程序提供了符合WSGI的界面。
  13. 截至版本 4.5.3 mode_wsgi 支持 Python 2 3 (从 2.6 3.2 开始)。
  14. 6. uWSGI
  15. uWSGI是一个软件应用程序,它"旨在开发一个完整的堆栈来构建托管服务"
  16. Web 服务器网关接口(WSGI 命名,这是该项目支持的第一个插件。
  17. uwsgi (所有小写)是 uWSGI 用于与其他服务器通信的本地二进制协议。
  18. uWSGI 通常用于与切罗基和NginxWeb 服务器一起为Python 网络应用程序提供服务,
  19. 这些服务器为 uWSGI 的本地 uwsgi 协议提供直接支持。
  20. 例如, 数据可能会这样流动: Http 客户端↔ Nginx uwsgi Python 应用程序。

补充知识

  1. 1. Django部署
  2. 1. Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。
  3. 2. Django startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。
  4. 2. application
  5. 1. 使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。
  6. 它通常在服务器可访问的Python模块中作为名为 application 的对象提供。
  7. startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。
  8. WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。

common commandline

  1. # 启动
  2. uwsgi --ini uwsgi.ini
  3. # 停止
  4. uwsgi --stop uwsgi.pid
  5. # restart
  6. uwsgi --reload uwsgi.pid

explaination of configuration

  1. #在退出uwsgi环境后,清空环境变量
  2. vacuum = true
  3. # 后台启动
  4. daemonize = yes

操作步骤

安装uwsgi并且检查状态

  1. 安装UWSGI
  2. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi
  3. # 检查是否安装成功
  4. pip list
  5. uWSGI 2.0.20

uwsgi 配置信息

  1. [uwsgi]
  2. # Django-related settings
  3. # 填写CRM项目第一层绝对路径
  4. chdir = /tmp/Blog/Blog2
  5. # 填写 CRM 项目第二层相对路径,找到第二层目录下的wsgi.py
  6. # 这里写的不是路径,而是以上一个参数为相对,找到第二层目录下的wsgi.py文件
  7. module = whereabouts.wsgi
  8. # 虚拟环境Python解释器路径
  9. home = /tmp/Blog/envb
  10. # process-related settings
  11. # master
  12. master = true
  13. # 推荐性能为 核数 * 2 + 1
  14. processes = 3
  15. #threads = 2
  16. # socket和Nginx结合部署 unix-socket参数,这里先临时暂停使用
  17. # the socket (use the full path to be safe
  18. #socket = 1010
  19. # 线上部署不会使用http参数,对于后端不安全,使用socket连结是安全的,用Nginx反向代理去访问
  20. # 后端程序是运行在防火墙内部,外网无法直接访问
  21. # 临时使用http参数,便于浏览器直接调试
  22. http = 0.0.0.0:10001
  23. # ... with appropriate permissions - may be needed
  24. # chmod-socket = 664
  25. # clear environment on exit
  26. vacuum = true
  27. pidfile=uwsgi.pid
  28. daemonize=uwsgi.log

启动项目

  1. cd /tmp/Blog/Blog2
  2. d

报错

1 [uWSGI] getting INI configuration from uwsgi.ini

  1. https://blog.csdn.net/lch551218/article/details/104844454

总结

此时CRM 项目已经用 uwsgi 支持三个进程的启动了,但是由于 uwsgi 对静态文件的解析能力很弱,该资源是分配给 nginx 处理的;

补充-查看与 UWSGI 对应的 Python 版本

  1. uwsgi --python -version
  2. Python 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同级

引用与参考

  1. https://www.jianshu.com/p/09846dafef13

supervisor进程管理工具

简介

  1. Linux系统的进程管理方式
  2. 1. ps -ef | grep python3
  3. 2. ps -ef | grep uwsgi # 检查 uwsgi 进程,确认 Django 是否存活,如果检测到 PID 是 5999 停止 uwsgi
  4. 3. kill -9 5999
  5. # 检测 uwsgi 挂掉之后,自动重启
  6. # 使用supervisor 进程管理工具,启动 uwsgi 之后,进程挂掉会重启,相当于 Docker的 daemon 后台守护
  7. CRM 的技术栈
  8. nginx + uwsgi + django + mysql 我们可以手动的启动单独的进程
  9. 还可以通过 supervisor 一键启动这四个进程, 进行批量管理,批量停用,非常方便

使用

  1. yum install epel-release
  2. yum install -y supervisor
  3. systemctl enable supervisord
  4. systemctl start supervisord
  5. systemctl restart supervisord
  6. # 查看状态
  7. ps -ef|grep supervisord

参考及引用

[CentOS7 安装Supervisor及使用详解]:(1条消息) CentOS7 安装Supervisor及使用详解_魂影魔宅-CSDN博客

常用命令

进入控制台之后

  1. reread # 重读
  2. reload # 重载
  3. restart all # 重启
  4. stop all # 关闭
  5. tail Luffyvue stdout # 查看标准输出

报错: Unlinking stale socket /tmp/supervisor.sock

  1. Unlinking stale socket /tmp/supervisor.sock

报错:error: <class 'xmlrpclib.Fault'>, <Fault 6: 'SHUTDOWN_STATE'>: file: /usr/lib64/python2.7/xmlrpclib.py line: 794

  1. supervisord -c /etc/supervisord.conf

报错: uwsgi出现invalid request block size: 21573 (max 4096)...skip

  1. # 配置文件中指定大小,不能超过物理4GB 分配的4K
  2. buffer-size = 65536
  3. # 从socket[提供给Nginx用于代理的接口]转换为Http方式

报错 bind(): Permission denied [core/socket.c line 230]

  1. 修改uwsgi 以及 Nginx中配置,将所有地址均加上本地IP地址作为前缀

正常启动

  1. (env_blog) [root@vvkt7whznuckhiz2-0723575 whereabouts]# uwsgi --ini ./uwsgi.ini
  2. [uWSGI] getting INI configuration from ./uwsgi.ini
  3. *** Starting uWSGI 2.0.20 (64bit) on [Mon Oct 25 20:18:29 2021] ***
  4. compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-44) on 25 October 2021 07:23:15
  5. os: Linux-3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021
  6. nodename: vvkt7whznuckhiz2-0723575.novalocal
  7. machine: x86_64
  8. clock source: unix
  9. pcre jit disabled
  10. detected number of CPU cores: 1
  11. current working directory: /opt/whereabouts
  12. writing pidfile to uwsgi.pid
  13. detected binary path: /opt/whereabouts/env_blog/bin/uwsgi
  14. setgid() to 1001
  15. setuid() to 1001
  16. chdir() to /opt/whereabouts
  17. your processes number limit is 7268
  18. your memory page size is 4096 bytes
  19. detected max file descriptor number: 65535
  20. lock engine: pthread robust mutexes
  21. thunder lock: disabled (you can enable it with --thunder-lock)
  22. uwsgi socket 0 bound to TCP address 192.168.1.9:20001 fd 3
  23. Python version: 3.9.6 (default, Oct 9 2021, 15:55:21) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
  24. PEP 405 virtualenv detected: /opt/whereabouts/env_blog
  25. Set PythonHome to /opt/whereabouts/env_blog
  26. *** Python threads support is disabled. You can enable it with --enable-threads ***
  27. Python main interpreter initialized at 0x229aa70
  28. your server socket listen backlog is limited to 100 connections
  29. your mercy for graceful operations on workers is 60 seconds
  30. mapped 291680 bytes (284 KB) for 3 cores
  31. *** Operational MODE: preforking ***
  32. /opt/whereabouts
  33. WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x229aa70 pid: 23727 (default app)
  34. *** uWSGI is running in multiple interpreter mode ***
  35. spawned uWSGI master process (pid: 23727)
  36. spawned uWSGI worker 1 (pid: 23728, cores: 1)
  37. spawned uWSGI worker 2 (pid: 23729, cores: 1)
  38. spawned uWSGI worker 3 (pid: 23730, cores: 1)
  39. [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)
  40. [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

  1. # 使用清华大学的数据
  2. yum install epel-release
  3. sed -e 's!^metalink=!#metalink=!g' \
  4. -e 's!^#baseurl=!baseurl=!g' \
  5. -e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \
  6. -e 's!http://mirrors!https://mirrors!g' \
  7. -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
  8. yum -y install supervisor

2 生成配置文件

  1. echo_supervisord_conf > /etc/supervisord.conf

定义配置文件

  1. supervisord.conf配置文件参数解释
  2. [program:xx]是被管理的进程配置参数,xx是进程的名称
  3. [program:xx]
  4. command=; 程序启动命令
  5. autostart=true ; supervisord启动的时候也自动启动
  6. startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1
  7. autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
  8. startretries=3 ; 启动失败自动重试次数,默认是3
  9. stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
  10. killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程

虚拟环境准备

  1. cd /tmp/Blog/Blog2
  2. python3 -m venv envb
  3. cd /envb/bin/
  4. source activate
  5. cd /tmp/Blog
  6. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
  7. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
  8. pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi

再次确认 uwsgi 相关文件路径

  1. # 虚拟环境下的 uwsgi 的位置
  2. /tmp/Blog/envc/bin
  3. # uwsgi.ini的位置
  4. /tmp/Blog/Blog2

uwsgi 启动命令

  1. /tmp/Blog/envc/bin/uwsgi --ini /tmp/Blog/Blog2/uwsgi.ini

修改 supervisord.conf 配置文件

  1. # supervisord.conf配置文件参数解释
  2. # [program:xx]是被管理的进程配置参数,xx是进程的名称
  3. [program:Blog]
  4. command=/tmp/Blog/envc/bin/uwsgi --ini /tmp/Blog/Blog2/uwsgi.ini
  5. autostart=true ; supervisord启动的时候也自动启动
  6. startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1
  7. autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
  8. startretries=3 ; 启动失败自动重试次数,默认是3
  9. stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
  10. killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程

启动 supervisor

  1. supervisord -c /etc/supervisord.conf
  2. supervisorctl -c /etc/supervisord.conf
  3. Blog RUNNING pid 17058, uptime 0:02:27
  4. supervisor> status
  5. Blog RUNNING pid 17058, uptime 0:02:30
  6. supervisor> quit

补充

  1. ps -ef | grep uwsgi
  2. root 16453 15744 0 11:48 pts/1 00:00:00 grep --color=auto uwsgi
  3. # uwsgi 为 grep 过滤产生的临时数据,并未运行

报错: exited: Blog (exit status 1; not expected)

  1. 1. 探索性解决:找到日志,不指定则存放在项目根目录 /tmp 名为: supervisord.log
  2. 2. 指定日志的方式 在配置文件 supervisord.conf 中新增如下内容
  3. stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
  4. stdout_logfile=/tmp/sp.out ; 需要用户新建该目录
  5. 3. 定位问题:单独启动UWSGI
  6. robably another instance of uWSGI is running on the same address (0.0.0.0:10001).
  7. 4. 更换端口号即可解决,注意当前虚拟环境必须与uwsgi指定虚拟环境完全一致

supervisor 常用命令

  1. #查看所有进程的运行状态 supervisorctl status
  2. #查看某一进程的运行状态 supervisorctl status 进程名
  3. #启动某一进程 supervisorctl start 进程名
  4. #启动所有进程 supervisorctl start all
  5. #停止某一进程 supervisorctl stop 进程名
  6. #停止所有进程 supervisorctl stop all
  7. #重启某一进程 supervisorctl restart 进程名
  8. #重启所有进程 supervisorctl restart all
  9. #新增进程后,更新进程(不影响其他进程运行) supervisorctl update
  10. #新增进程后,重启所有进程 supervisorctl reload

对 Nginx 工作原理的 补充

  1. master — 工头进程 / 主人进程
  2. worker — 主进程突然挂了, 工作进程就变为僵尸进程
  3. 因此杀死 uwsgi 需要向这个进程组发送终止信号,杀死一组进程