DRF源码分析

Linux 系统相关操作

一、Linux 基础

1、Linux 命令提示符

![image-20220806165838745](Linux 系统相关操作.assets/image-20220806165838745.png)

2、Linux 文件系统 目录结构

![image-20220806165953608](Linux 系统相关操作.assets/image-20220806165953608.png)

![image-20220806170018385](Linux 系统相关操作.assets/image-20220806170018385.png)

3. 文件目录增删改查操作

linux命令的语法

命令   可选参数     你要操作的对象

修改linux支持文件的命令

export LC_ALL=zh_CN.UTF-8   #设置linux一个全局的中文变量

1.创建一个普通文本文件 语法是  touch  文件名 
[root@bogon tmp]# touch  music.txt

2.创建一个隐藏的文件,创建一个隐藏的 singer.txt
touch    .singer.txt   #创建隐藏文件 

3.创建一个文件夹,名字叫做s25
[root@bogon tmp]# mkdir     s25

4.创建一个递归的文件夹,如 /s25/男同学    /s25/女同学 
mkdir  -p   /s25/男同学     /s25/女同学    # -p参数是 创建文件夹及其父文件夹

5.创建一个递归的文件夹 ,如 /s25new/男同学   /s25new/女同学
mkdir  -p   /s25new/{男同学,女同学}  #创建一个/s25文件夹,且创建2个平级的文件夹


rm命令,是remove的缩写,删除文件或是文件夹
#语法是 
rm     文件/文件夹  #删除文件/文件夹 

比如 
rm    test.txt #删除文件,默认有让用户确认删除的提示
rm  -f  test.txt  #强制删除文件,不需要提示确认
rm  -r   文件夹名  #递归删除文件夹,及其内部的文件

#提问,如何强制性删除 文件夹 ,以及其内部的资料

#这是一个危险的命令!!!!请理解后慎用!!!
#这是一个危险的命令!!!!请理解后慎用!!!
#这是一个危险的命令!!!!请理解后慎用!!!

rm   -rf   /*   #叫做删库到跑路,准备被打死吧。。。。万万不得敲。。。。
rm   -rf   /*   #叫做删库到跑路,准备被打死吧。。。。万万不得敲。。。。

rm    -rf   ./*  #强制性删除当前目录下的所有内容 

cd  /home   #切换到 /home目录下
ls  .   #查看相对的home目录下有什么内容

#查询当前目录下的内容   ls命令 
ls命令,就是list的缩写 
[root@bogon /]# ls   .
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

#查看文件夹中所有内容,以及隐藏的文件,在linux下,以.开头的文件,是隐藏的,默认直接看不到
[root@bogon tmp]# ls   -a  firefox_pyyu/  

几个特殊的目录

.   代表当前的目录     

..  代表上一级的目录     #比如  cd ..  进入上一级目录 

~    代表当前登录用户的家目录,root用户就是/root   pyyu用户就是 /home/pyyu 

-    代表上一次的工作目录  

绝对路径,相对路径

绝对路径:只要是从根目录开始的写法,就是绝对路径

相对路径:非从根目录开始的写法,就是相对路径

#在/home目录下创建 s25文件夹,绝对,相对路径的写法

1.相对路径,以你当前的位置为相对,创建
比如我此时在 /tmp目录下,我的上一级就是  /  ,因此可以这么写
[root@bogon tmp]# mkdir     ../home/s25

2.绝对路径的写法,一般是绝不会错的,无需考虑你当前所在的位置,直接敲绝对路径即可
 mkdir    /home/s25

4. Linux常用命令

1. mkdir 创建文件夹
# 创建一个文件夹
  mkdir  文件名    mkdir  abc
# 递归创建文件夹
  mkdir  -p  文件夹路径   mkdir  aaa/bbb/ccc/ddd    mkdir  aaa/bbb/ccc/{ddd,eee}
2. echo 打印
# 案例
su@su-virtual-machine:~$ echo hello world
hello world

su@su-virtual-machine:~$ name=xiaoming   #linux在命令行的变量赋值,是临时生效的
su@su-virtual-machine:~$ echo $name  
xiaoming
3. PATH变量

PATH就是定义一些常用的软件可执行命令的目录,放入系统中,可以快捷的查询,而不需要每次都输入绝对路径

su@su-virtual-machine:~$ echo $PATH
/home/su/.local/bin:/usr/local/python38/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin:

1.如果编译安装了一个python3,装在了 /opt/python36/目录下,怎么添加PATH?

#这个变量赋值的代码,就是添加python3到环境变量中了
PATH="/opt/python36/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:"

2.由于上述变量赋值的操作,只是临时生效,我们想永久的更改PATH的值,还得修改/etc/profile 

vim  /etc/profile #打开文件,在文件末尾,添加PATH值的修改
PATH="/opt/python36/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:"
4. Linux 全局配置文件 /etc/profile
编辑这个文件,写入你想永久生效的变量和值,系统每次开机都会读取这个文件,让其生效

vim  /etc/profile 
写入如下内容
###这是自定义的变量,每次开机都能够读取了,第一条是设置系统中文的变量
export LC_ALL=zh_CN.UTF-8  #打开注释,系统支持中文
#export LC_ALL=en_US.UTF-8  #打开注释,系统就支持英文了

source  /etc/profile
5. linux 单引号和双引号的区别
单引号中的内容,仅仅就是个字符串了,不识别任何其他的特殊符号

双引号中的内容,能够识别特殊符号,以及变量

[root@s25linux ~]# echo '$name'
$name

[root@s25linux ~]# echo "$name"
我们是穿越在银河的火箭队
6. vim 编辑器的用法
vim  文件名

vim打开一个不存在的文件,默认会创建此文件

#vim的使用流程
第一步:vim  first.py  ,此时会进入命令模式,按下字母 i,进入编辑模式
第二步:想要退出编辑模式,按下键盘的esc,回到命令模式
第三部:此时输入 shfit+冒号,输入一个英文的冒号,进入底线命令模式 
第四步:输入 :wq!  ,write写入内容,quit退出vim  ! 强制性的操作
:wq!  强制保存写入退出vim
:q!  强制不保存内容,直接退出

1.  vim  文件名   # 此时进入命令模式,你敲击键盘的动作都会被识别是一个vim的命令 ,比如 a,i,o  进入插入模式
2.但凡进入插入模式之后,敲击键盘的动作就会被识别为是 普通的字符串了
3.按下esc退出编辑模式之后,又进入命令模式了
4.输入 :wq!  保存vim的写入内容,然后退出vim,结束操作


在命令模式下,常用的指令 

$  快速移动到行尾
0  快速移动到光标的行首
x  删除光标所在的字符
g  移动到文件的第一行
G  移动到文件的最后一行 

/string    你要从文件开头寻找的内容,例如 /to   找出文件中所有的to字符,按下n键,跳转到下一个匹配的字符

?string     从文件的第行,向上搜索字符串信息   

%   找到括号的另一半 

yy   复制光标当前行 
3yy   复制光标后3行 
p    打印yy所复制的内容 
dd   删除光标所在行
4dd  删除光标向下的4行内容
dG   删除光标当前行,到行尾的所有内容
u  就是撤销上一次的动作 

如何快速的复制,打印生成多行内容 
例如 按下  9999yy  就是 复制  9999行,然后按下p打印,就能够快速的复制N多行了...


底线命令模式下
:wq!
:q!  不保存退出
:数字   快速的定位到某一行
:set nu   显示vim的行号 
7. cat 查看文件内容
cat 文件名 

[root@s25linux tmp]# cat  first.py
print ("你看这个灯,它又大又量")

#读取内容,且显示行号
cat  -n  文件名 

#利用cat写入文件内容
[root@s25linux tmp]# cat >> second.py << EOF
> #!coding:utf-8
> print("爱的魔力转圈圈")
> EOF
8. linux 的重定向符号
>    #重定向输出覆盖符  ,如同 python的 with open 中的  w模式 
>>	 #重定向输出 追加符  ,如同 a模式 

<    #重定向写入覆盖符,用的很少,用在数据导入等操作中,mysql数据导入 
<<  #用在cat命令中,很少见 

案例

1.echo输出一个字符串,内容不在屏幕上打印,写入到一个文件中
[root@s25linux tmp]# echo "左手跟我一起画个龙"  >  迪斯科.txt
[root@s25linux tmp]# echo "左手跟我一起画个龙"  >  迪斯科.txt
[root@s25linux tmp]# echo "左手跟我一起画个龙"  >  迪斯科.txt
[root@s25linux tmp]# echo "左手跟我一起画个龙"  >  迪斯科.txt
[root@s25linux tmp]# echo "左手跟我一起画个龙"  >  迪斯科.txt
[root@s25linux tmp]#
[root@s25linux tmp]#
[root@s25linux tmp]# cat -n  迪斯科.txt
     1	左手跟我一起画个龙
     
2.追加写入文件内容
[root@s25linux tmp]# echo "右手和我划一道彩虹"  >>  迪斯科.txt
9. cp 拷贝命令
# 拷贝文件
cp  旧文件   新文件
[root@s25linux tmp]# cp  木兰诗.txt     新_木兰诗.txt

#复制文件夹,复制文件夹需要添加 -r 递归复制参数
[root@s25linux tmp]# cp  -r  a   new_a
10. mv命令 移动文件或文件夹

mv命令可以 移动文件 ,文件夹的路径

mv命令也能够进行 重命名

1.重命名的功能
语法是
mv  旧文件名      新文件名  
[root@s25linux tmp]# mv  木兰诗.txt      new_木兰诗.txt

2.移动位置 
语法

mv  你要移动的文件或是文件夹       移动之后的目录名(如果文件夹存在,则移动,不存在是改名)

案例
mv   test.txt      b   #移动 test.txt文件  到 b文件夹下(b文件夹得存在)
11. alias 别名命令
案例
给系统添加一个别名
当你敲下start就是在执行后面的长串命令,很方便 
alias start="python3  /home/mysite/manager.py runserver  0.0.0.0:8000"
12.find 查找命令
语法
find   你要从哪找    -type 你要的文件类型是什么 -size  你要的文件内容多大  -name  你要的内容名字是什么
-type  f  是找普通文本文件 
-type  d  是找 文件夹 类型 

-name  是指定文件的名字内容 

#在系统上 全局搜索,所有的.txt文件

find  /    -name  "*.txt"

#指定在etc目录下,进行局部搜索,一个网卡配置文件,网卡名字是以ifcfg开头的 ,文本类型文件
find   /etc   -type  f   -name   "ifcfg*"
13. ls 查看文件
ls -lh  # -h参数,是显示文件单位,以kb  mb gb大小为单位   -l是列表形式,列出文件夹中详细信息
14. grep 命令 过滤信息

grep是linux强大的三剑客之一,从文本中,过滤有用信息的命令,grep是支持正则表达式的

1.语法
grep "你想过滤的字符串"   需要过滤的文件  #用法一

准备一个测试的文件test.txt
[root@s25linux tmp]# cat test.txt



跟着我左右右手一个慢动作


#左右右手慢动作重播


一个大西瓜,送给你,也不送给他

ALLOW_HOSTS=[]



2.过滤文件中的相关内容
#找出文件中含有 "大" 字的行,且显示此内容,在哪一行
grep -n "大"   test.txt   # -n 参数是显示行号

#忽略大小写,找出ALLOW_HOSTS=[]参数是否被修改
grep -i "al"  test.txt 

#过滤出此文件非空白行,如何操作?
拆解如下
找出所有的空白行 
[root@s25linux tmp]# grep "^$"   test.txt   #  "^$"  以空开头,以空结尾,因此是空白行
# -v 参数是 翻转过滤结果 ,找出 空白行以外的内容
[root@s25linux tmp]# grep -v   "^$"   test.txt


#过滤掉注释行,和空白行 ,如何操作?
[root@s25linux tmp]# grep -v  "^#"   test.txt | grep -v "^$"
跟着我左右右手一个慢动作
一个大西瓜,送给你,也不送给他
ALLOW_HOSTS=[]
15. head、tail 、more、less命令 读取文件内容
headtail都是能够读取文件内容的
语法是 

head  文件名  #默认从文件的前10行看

head  /etc/passwd  #默认看前10行
head -3  /etc/passwd  #查看文件的前3行

tail  文件名 #默认从文件的后10行看
tail -2  /etc/passwd   #查看文件的后2行


tail命令的 实时监控用法 ,可以用于检测线上的日志文件,检测用户的请求信息

tail -f  文件名  #实时刷新文件内容 

tail -f /tmp/test.txt  #能够检测文件内容的变化 

more 查看文件内容,适用于大文件,只能从上往下查看

more 1.py

less 查看文件内容,适用于大文件,提供上下查看的操作

less 1.py
16. scp 命令 Linux机器之间传输文件

在2台linux机器(macos)之间,通过网络安全的传输文件,文件夹

案例:

需求:将机器1的/tmp/好嗨哦.txt  发送到 机器2的/tmp目录下 
[root@s25linux tmp]# scp  /tmp/好嗨哦.txt root@192.168.178.235:/tmp/

#用通配符发送多个文件
[root@s25linux tmp]# scp -r  ./*  root@192.168.178.235:/tmp/134bak/
17. lrzsz 工具 window系统传输文件

用于windows(基于xshell工具)和linux之间互相传递文件

1.安装此工具
yum install  lrzsz -y  

2.安装好lrzsz之后,就存在了2个命令   一个是 rz  一个是sz
rz  #直接输入rz命令,能够蹦出一个弹窗,接收windows的资料

sz  文件  #发送linux的一个文件,发给 windows某个位置,也是出现一个弹窗
18. du 命令 查看文件或文件夹大小
用法
du 【参数】【文件或目录】
-s 显示总计
-h 以k,M,G为单位显示,可读性强

统计/var/log/文件夹大小 
du -sh  /var/log/  

#显示当前目录下 所有文件的大小
[root@s25linux tmp]# du  -h ./*
19.top 命令,资源管理器

linux的资源管理器 就是top命令,能够显示 动态的进程信息

cpu、内存,网络,磁盘io等使用情况 ,也就是一个资源管理器

第一行 (uptime)
系统时间 主机运行时间 用户连接数(who) 系统1515分钟的平均负载

第二行:进程信息
进程总数 正在运行的进程数 睡眠的进程数 停止的进程数 僵尸进程数

第三行:cpu信息
1.5 us:用户空间所占CPU百分比
0.9 sy:内核空间占用CPU百分比
0.0 ni:用户进程空间内改变过优先级的进程占用CPU百分比
97.5 id:空闲CPU百分比
0.2 wa:等待输入输出的CPU时间百分比
0.0 hi:硬件CPU中断占用百分比
0.0 si:软中断占用百分比
0.0 st:虚拟机占用百分比

第四行:内存信息(与第五行的信息类似与free命令)
total:物理内存总量
used:已使用的内存总量
free:空闲的内存总量(free+used=total)
buffers:用作内核缓存的内存量

第五行:swap信息
total:交换分区总量
used:已使用的交换分区总量
free:空闲交换区总量
cached Mem:缓冲的交换区总量,内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
20. ps 命令 查看进程信息
语法就是 
ps  -ef    # -ef,是一个组合参数,-e  -f 的缩写,默认显示linux所有的进程信息,以及pid,时间,进程名等信息 

#过滤系统有关vim的进程 
[root@s25linux ~]# ps -ef |  grep  "vim"
root      24277   7379  0 16:09 pts/1    00:00:00 vim ps是怎么用的.txt

ps aux
21. kill 命令 杀死进程
杀死进程的命令

kill   进程的id号
如果遇见卡死的进程,杀不掉,就发送 -9  强制的信号 
kill -9  pid

pkill -9 进程名字
22. netstat 命令 查看网络端口
语法如下
常用的参数组合  -t -n -u -l -p    

[root@s25linux tmp]# netstat -tunlp   #显示机器所有的tcp、udp的所有端口连接情况

#例如验证服务器80端口是否存在
netstat  -tunlp  |  grep  80

#过滤3306端口是否存在 
netstat -tunlp |grep 3306


#过滤ssh服务是否正常
[root@s25linux tmp]# netstat -tunlp  |   grep   ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1147/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1147/sshd

#有些公司为了保护服务器安全,更改了默认的远程连接端口(默认为22)
# ssh端口 26674    ip 是  123.206.16.61   账号是 xiaohu   密码是 xiaohu666

#我怎么登陆服务器呢?用如下的命令去连接服务器 
ssh  -p  26674    xiaohu@123.206.16.61  


ssh  -p 22 root@192.168.178.134
root@192.168.178.134's password:
23. ln 软连接命令,相当于快捷方式
创建命令

ln  -s  目标文件绝对路径     软连接绝对路径
[root@s25linux tmp]# ln  -s  /tmp/test.txt   /opt/t.txt  #给/tmp/test.txt创建一个快捷方式,放在/opt/t.txt 这里

删除快捷方式,删除软连接是不会影响源文件的
24. tar 命令 打包、压缩、解压(还有bzip2,gzip,rar,zip等压缩文件)

打包,不节省空间

压缩,节省磁盘空间

语法
tar 命令
功能参数

-z   调用gzip命令,对文件压缩 ,加上这个参数,才会节省磁盘空间
-x   解包,拆快递
-v    显示整个过程
-f    必须写在参数结尾,指定压缩文件的名字 
-c    打包,收拾快递

压缩文件的后缀,本没有意义,只是告诉别人,这个文件是用什么命令压缩/解压缩

*.gz   gzip命令解压缩
*.tar   用tar命令解压缩
*.xz   用xz命令解压
*.zip   用unzip命令解压

# 解压缩各种类型文件
# 基于bzip算法压缩文件内容,不能压缩目录!!!生成的文件后缀.bz2
bzip2 demo.txt        # 压缩一个叫做 'demo.txt' 的文件,得到压缩包,demo.txt.bz2
bunzip2 demo.txt.bz2 # 解压一个叫做 'demo.txt.bz2'的文件

# 基于gzip算法压缩文件,压缩程度把上面的要好,gzip可以针对文件进行打包
# 最常用
gzip demo.txt       # 压缩一个叫做 'demo.txt'的文件,得到压缩包,demo.txt.gz
gunzip demo.txt.gz  # 解压一个叫做 'demo.txt.gz'的文件 
gzip -9 demo.txt    # 最大程度压缩,默认就是最大程度压缩

# 基于rar针对文件或目录打包
# ContOS安装:
#        wget https://www.rarlab.com/rar/rarlinux-x64-6.0.2.tar.gz
#        tar zxvf rarlinux-x64-6.0.2.tar.gz -C /usr/local
# Ubuntu安装:
#        sudo apt install rar
rar a day18.rar day18           # 打包day18目录,并创建一个叫做 'day18.rar' 的包,并没有压缩
rar a day18.rar file1 file2 dir1 # 同时把多个文件或目录一起追加打包到day18.rar的包中 
rar x day18.rar  # 解压rar包

# 基于tar针对文件或目录打包,Linux最常用这个
tar -cvf day18.tar day18                   # 创建一个非压缩的 day18.tar的包 
tar -cvf day18.tar file1 file2 dir1        # 把多个文件或目录追加打包到day18.tar中
tar -tf  day18.tar                         # 显示一个包中的内容
# ar -tf  day18.tar | grep md              # 显示包中的内容并使用grep进行过滤查找

tar -xvf day18.tar # 释放一个包,解包
tar -xvf demo.tar -C 001/ # 将包释放到 001 目录下,前提是001目录是存在的

tar -jcvf day18.tar.bz2 day18   # 创建一个bzip2格式的压缩包,压缩包的文件名,往往会体现打包格式以及压缩算法 
tar -jxvf day18.tar.bz2         # 解压一个bzip2格式的压缩包 
mkdir -p 001 && tar -jxvf day18.tar.bz2 -C 001/   # 创建一个目录001,并把压缩包解压到001目录下

# 重要!最常用的打包压缩命令!
tar -zcvf day18.tar.gz day18   # 创建一个gzip格式的压缩包 
tar -zxvf day18.tar.gz          # 解压一个gzip格式的压缩包

mkdir -p 002 && tar -zxvf day18.tar.gz -C 002/  # 创建一个目录002,并把压缩包解压到002目录下

# zip
zip -r day18.zip day18 # 创建一个zip格式的压缩包 
zip -r day18.zip file1 file2 dir1 # 将几个文件和目录追加压缩到一个zip格式的压缩包 
unzip day18.zip # 解压一个zip格式压缩包 

案例1:打包/opt/目录下所有的内容,打包生成tar包allopt.tar

第一步:打包opt下所有内容
[root@s25linux opt]# tar   -cvf  allopt.tar   ./*

第二步:解包这个tar包
[root@s25linux opt]# tar  -xvf  allopt.tar   ./

案例2:打包,且压缩/opt目录下所有内容,生成tar.gz包allopt.tar.gz

第一步:打包,且压缩,就是加一个-z参数即可
[root@s25linux opt]# tar   -zcvf  allopt.tar   ./*

第二步:解压缩,常见的*.tar.gz,也有人会缩写成  *.tgz ,都可以如此的去解压缩
[root@s25linux opt]# tar  -zxvf  allopt.tar.gz   ./
25. nslookup命令 域名查找命令
域名查找命令
nslookup   www.pythonav.cn  #寻找dns对应关系
26. systomctl 命令

systemctl是用于在centos7管理系统的各种软件,服务的命令,常用指令如下

systemctl  status  redis  #查看redis服务的状态
systemctl  start  redis
systemctl  stop  redis  
systemctl  restart redis  
systemctl  enable  redis  #设置redis开机自启
systemctl  disable  redis  #禁止redis开机自启 
27.man用于查看命令的帮助文档
man  ls
man grep
28.wc 统计文件内容的字数/单词/数字
# 统计单个文件
wc a.txt
 4    4      20   a.txt
 行  单词数   字母数
 
 
# 统计一个目录下的文件
su@su-virtual-machine:~$ wc test/*
  4   4  20 test/1.py
  6   6  12 test/2.py
  3   4  33 test/3.py
 47  47 231 test/4.py
 60  61 296 总用量
29.sed 文本处理(替换查找)
# sed 文本的查看、删除、替换,支持正则使用。
echo "
hello world
welcome to beijing。
hello world
welcome to shanghai。
hello world
welcome to beijing。
" > demo.txt

# 不修改源文件,针对文件内容输出到终端时进行替换
sed "s/hello world/Hi, xiaoming/g" demo.txt    # 先将demo.txt文件内容提取出来,
                                               # 再把内容中的 "hello world" 替换成 "Hi, xiaoming"以后
                                               # 输出到终端,不修改源文件的内容
sed "s/hello world/Hi, xiaoming/g" demo.txt > demo2.txt # 在上面命令的基础上,把替换后的内容写入新文件demo2.txt中

# 替换源文件内容
sed -i "s/hello world/Hi, xiaoming/g" demo.txt # 将demo.txt中的 "hello world" 替换成 "Hi, xiaoming",
                                               # 并修改源文件内容。
sed '/^$/d' demo2.txt         # 从demo2.txt文件中删除所有空白行,并显示内容,不修改文件内容
sed -i '/^$/d' demo2.txt      # 从demo2.txt文件中删除所有空白行,并修改文件内容

# 准备测试文件
cat << EOF >>demo3.py
from rest_framework.viewsets import ViewSet
# 首页视图类
class HomeViewSet(ViewSet):
    def get_banner(self,request):
        # 获取banner列表数据
        pass		
    def get_nav(self, request):
        # 获取导航数据
        pass
EOF

# 整行删除
sed "/^ *#/d" demo3.py   # 从demo3.py文件中删除以空格+#号开头的行内容或者是以#号开头的行内容
sed "/^ *#/d; /pass/d" demo3.py  # 从demo3.py文件中删除注释行和pass关键字所在行
sed '/ *#/d; /^$/d' demo3.py    # 从demo3.py文件中删除所有注释和空白行,常用于代码压缩

# 删除一行的部分内容
sed -e 's/ *$//' demo3.py       # 删除每一行最后的空白字符 
sed -e "s/#.*//" demo3.py       # 删除文件中每一行以#开头的部分内容
sed -e "s/#.*//; /^ *$/d" demo3.py | wc  # 删除文件demo3.py中所有注释和空白,输出结果作为wc的参数进行统计 
sed -e 's/xiaoming//g' demo3.py  # 从文档demo3.py中只删除"xiaoming"并保留剩余全部

# 根据关键字查看内容
sed -n '/from/p' demo3.py       # 查看demo3.py文件中,包含导包关键字from的行内容 
sed -n "/def/p" demo3.py        # 查看demo3.py文件中,包含定义函数关键字def的行内容

# 指定行查看内容
sed -n '2,4p;4q' demo.txt        # 查看从第2行到第4行内容
sed -n '5p;5q'   demo.txt        # 只查看第5行 
30.awk 文本处理(分割处理)
# awk 按换行、按空格处理文本, 按列处理文本内容
# awk会根据文本内容,按空格进行分列,$1,表示第一列,$2表示第二列,以此类推... print表示打印
echo "hello world xiaoming" | awk '{print $1,$3}'  # 输出文本的第1和第3列
# hello xiaoming
echo "hello world xiaoming" | awk '{print $1,$2}'  # 输出文本的第2和第2列
# hello world
echo "hello world xiaoming" | awk '{print $1,$2, $3}' # 输出文本的第1,2,3列
# hello world xiaoming
echo "hello world xiaoming" | awk '{print $1,$3, $2}' # 输出文本的第1,3,2列,可以自己排序。
# hello xiaoming world
echo "hello world xiaoming" | awk '{print $1,$3}' > 1.txt  # 把awk处理的结果写入到文件1.txt中

# 读取文件1.txt的内容,把每一行按空格分列,输出第2列的内容
cat 1.txt | awk '{print $2}'

# NR表示行号
cat demo.txt | awk 'NR%2==1'  # 读取文件demo.txt的内容,输出奇数行内容

二、Linux进阶

1. corntab 定时任务

crontab  -e  #编辑定时任务配置文件

crontab -l  #查看定时任务的规则

定时任务,注意的是 ,几号,和星期几不得共用

#每分钟执行一次命令
*  *  *  *  *   命令的绝对路径
分 时  日 月 周  

案例

1.每分钟,将一句话,追加写入到一个文件中

第一步:crontab -e  #打开配置文件
写入如下内容,用的是vim编辑器命令
*  *  *  *  *  /usr/bin/echo  "有人问王思聪,钱是万能的吗?王思聪答:钱是万达的" >>  /tmp/wsc.txt


2.检查定时任务
crontab -l


#每分钟执行一次命令
*  *  *  *  *   命令的绝对路径
分 时  日 月 周  

#每小时的3,15分钟执行命令
*  *  *  *  *   命令的绝对路径
分 时  日 月 周  

3,15  * *  *  *   命令


#在上午8-11点的第3和第15分钟执行
*  *  *  *  *   命令的绝对路径
分 时  日 月 周  
3,15  8-11  *  *  *  



#每晚9:30执行命令
*  *  *  *  *   命令的绝对路径
分 时  日 月 周  
30  21  *  *  *  


#每周六、日的下午1:30执行命令
*  *  *  *  *   命令的绝对路径
分 时  日 月 周  
30  13  *  *  6,7

#每周一到周五的凌晨1点,清空/tmp目录的所有文件,注意执行的命令请用绝对路径,否则会执行失败
*  *  *  *  *   命令的绝对路径
分 时  日 月 周  
0  1  *  *  1-5  /usr/bin/rm -rf /tmp/*  


#每晚的零点重启nginx
0  0  *  * *  /usr/bin/systemctl  restart nginx  


#每月的1,10,22日的4:45重启nginx
*  *  *  *  *  
分 时  日 月 周   
45  4  1,10,22   *  *     /usr/bin/systemctl  restart nginx  

#每个星期一的上午8点到11点的第3到15分钟执行命令
*  *  *  *  *  
分 时  日 月 周
3-15  8-11   *  *  1   命令绝对路径 

2. Linux 软件包管理

windows的软件管理,安装文件的后缀 *.exe
macos的应用程序安装 后缀  *.dmg
linux的二进制软件包 都是  *.rpm 格式的

linux平台的软件安装形式,有3个

  • 源代码编译安装,此方式较为麻烦,但是可以自由选择软件的版本(因为是去官网下载最新版本代码),也可以扩展第三方额外的功能(五颗星)
    • 扩展第三方功能
    • 指定软件安装目录
  • rpm包手动安装,此方式拒绝,需要手动解决依赖关系,贼恶心(两颗星)
  • yum自动化安装软件,需要配置好yum源,能够自动搜索依赖关系,下载,安装,处理依赖关系(五颗星)
    • 不好的地方在于,yum源仓库的软件,版本可能较低
    • 无法指定安装路径,机器数量较多的时候,不容易控制
1. 更换 yum 源

yum源的默认仓库文件夹是 /etc/yum.repos.d/,只有在这个目录第一层的*.repo结尾的文件,才会被yum读取

# 1.下载wget命令
yum install wget -y   #wget命令就是在线下载一个url的静态资源

# 2.备份旧的yum仓库源
cd  /etc/yum.repos.d

mkdir  repobak
mv *.repo   repobak  #备份repo文件

# 3.下载新的阿里的yum源仓库,阿里的开源镜像站https://developer.aliyun.com/mirror/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 4.继续下载第二个仓库 epel仓库
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 5.此时已经配置完毕,2个新的yum仓库,可以自由的嗨皮,下载软件了
[root@s25linux yum.repos.d]# ls
CentOS-Base.repo  epel.repo  repobak

# 6.下载一个redis玩一玩
[root@s25linux yum.repos.d]# yum install redis -y  #就能够自动的下载redis,且安装redis

# 7.此时可以启动redis软件了,通过yum安装的redis,这么启动
systemctl  start redis   

# 8.使用redis的客户端命令,连接redis数据库
[root@s25linux yum.repos.d]# redis-cli

127.0.0.1:6379> ping
PONG

3. python环境安装

#编译安装python3的步骤

# 1.很重要,必须执行此操作,安装好编译环境,c语言也是编译后运行,需要gcc编译器golang,对代码先编译,再运行,python是直接运行
# centos 7 中
	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
# Ubuntu中
	sudo apt-get install build-essential


# 2.获取python的源代码,下载且安装,下载源代码包的形式,自由选择
# 用windows的迅雷极速下载,下载完了之后,发送给linux机器即可
# mac系统,可以用scp或者等传输工具

windows的可以用lrzsz(yum install lrzsz -y ),xftp(自行去网站下载,支持断点续传,大文件传输)等文件传输工具

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    

#编译的第二曲,和第三曲,可以简写成  make && make install   #代表make成功之后,继续make install 

# 6.等待出现如下结果,表示python3编译安装结束了
Successfully installed pip-18.1 setuptools-40.6.2

# 7.此时可以去检查python3的可执行程序目录
[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

4. 安装虚拟环境 virtualenv

1.virtualenv 安装虚拟环境
# virtualenv 可以在系统中建立多个不同并且相互不干扰的虚拟环境。
# python3的虚拟环境工具配置
# 1.下载虚拟环境工具
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv

# 2.通过命令行创建虚拟环境
#pip3安装的模块会放在这里
[root@s25linux ~]# find /opt/python369/  -name site-packages
/opt/python369/lib/python3.6/site-packages
#  --python=python3  指定venv虚拟解释器,以哪个解释器为本体

# 这个命令如果你用相对路径,就得注意你在哪敲打的此命令
[root@s25linux opt]# virtualenv --python=python  venv1

# 3.创建好venv1之后,需要激活方可使用,这个激活其实就是在修改PATH而已
[root@s25linux 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]#
(venv1) [root@s25linux bin]# which pip3
/opt/venv1/bin/pip3
(venv1) [root@s25linux bin]#
(venv1) [root@s25linux bin]# pip3 list
Package    Version
---------- -------
pip        20.0.2
setuptools 45.2.0
wheel      0.34.2

# 5.在venv1中安装django1
(venv1) [root@s25linux opt]# pip3 install -i https://pypi.douban.com/simple django==1.11.9
(venv1) [root@s25linux opt]# django-admin  startproject  venv1_dj119

# 6.再开一个ssh窗口,再创建venv2,用于运行django2 版本
virtualenv --python=python  venv2
# 激活虚拟环境venv2
[root@s25linux opt]# source /opt/venv2/bin/activate
# 创建django版本2的项目
pip3 install -i https://pypi.douban.com/simple django==2.0.1
# 创建diango2项目
django-admin  startproject  venv2_dj2

# 7.分别启动2个版本的django,浏览器访问效果


# 8.deactivate  #直接执行此命令,退出虚拟环境,系统会自动删除venv的PATH,也就表示退出了
2. virtualenv 和 virtualenvwrapper 安装虚拟环境
# 容器内部是没有安装python3的pip工具,所以需要安装
apt install python3-pip

# 使用pip安装虚拟环境
pip3 install virtualenv -i https://pypi.douban.com/simple/
pip3 install virtualenvwrapper  -i https://pypi.douban.com/simple/

# 配置虚拟环境的环境变量
# 执行命令
mkdir $HOME/.virtualenvs

# 执行命令,打开并编辑 ~/.bashrc
vim  ~/.bashrc

# 文件末尾添加以下几行代码,:wq 保存退出。
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

# 刷新配置文件
source ~/.bashrc

# 创建虚拟环境
mkvirtualenv luffy -p python3

# 创建好虚拟环境之后,可以通过workon查看虚拟环境和进入虚拟环境
workon  # 查看虚拟环境
workon 虚拟环境名称   # 进入虚拟环境

5. supervisor 进程管理工具

#检测uwsgi如果挂掉之后,自动帮你重启
#使用supervisor这个python开发的进程管理工具,用它启动uwsgi之后,uwsgi进程挂掉后,自动会再启动 

# 1.使用yum命令即可直接安装
[root@s25linux ~]# yum install  supervisor -y

# 2.生成supervisor的配置文件
[root@s25linux ~]# echo_supervisord_conf >  /etc/supervisord.conf

# 3.修改supervisor的配置文件,添加管理crm的任务
vim  /etc/supervisord.conf #再最底行,添加如下内容

# [program:xx]是被管理的进程配置参数,xx是进程的名称

[program:xxx]  xxx是进行的名称
command=写入启动uwsgi的命令  ;supervisor其实就是在帮你执行命令而已!
autostart=true       ; # 在supervisord启动的时候也自动启动
startsecs=10         ; # 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; #程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true     ; # 默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true     ; # 默认为false,向进程组发送kill信号,包括子进程

例如

[program:luffy]
command=/root/.virtualenvs/luffy/bin/uwsgi  --ini  /home/luffyapi/uwsgi.ini  ;
user=root            ;
autostart=true       ;
startsecs=10         ;
autorestart=true     ;
stopasgroup=true     ;
killasgroup=true     ;

6. Nginx安装

1. 通过nginx docker镜像安装
# 在docker中下载nginx镜像
docker image pull nginx

# 使用git把码云上面的编译过的vue项目克隆到服务器/home
# 在本地终端通过以下命令上传编译后的项目文件
git add -f lufei_pc/dist

# 阿里云服务器中,已经内置了git,所以可以直接从码云克隆项目下来: /home/luffy
# git clone 项目git地址
git clone https://gitee.com/mooluo/luffy.git
# 注意,上面提交的代码版本中,真正的前端项目编译代码在dev分支下面,所以我们需要切换分支
git checkout dev


# 创建nginx容器,并以80端口对外提供服务
# /usr/share/nginx/html 是nginx在安装时,系统默认分配的网站项目的根目录
docker run  -itd -p 80:80 -v /home/luffy/lufei_pc/dist:/usr/share/nginx/html --name=lufei_pc nginx
# 执行上面的命令,理论上来说,就可以让前端项目,可以阿里云的IP地址访问到了。

"""
/etc/nginx              # nginx容器中nginx的配置目录
/etc/nginx/conf.d/default.conf  # 默认站点的配置文件
/usr/share/nginx/html   # nginx容器中网站根目录
"""
2. 安装淘宝nginx
nginx   官方nginx
tenginx  淘宝nginx

# 这2个一模一样,淘宝的nginx,官方文档更详细
# 小提示: 如果你想删除 编译安装的软件  1,清空PATH  2,删除文件夹即可

注意,编译软件之前,还是需要解决系统的开发环境,例如如下
# centos 7 中
	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
# Ubuntu中
	sudo apt-get install build-essential

# 1.进入淘宝nginx官网,下载源代码,进行编译安装
http://tengine.taobao.org/index_cn.html

# 2.在linux的opt目录下,下载nginx源代码
wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz

# 3.解压缩源代码,准备编译三部曲
[root@s25linux opt]# tar -zxvf  tengine-2.3.2.tar.gz

# 4.进入源码目录,指定nginx的安装位置
[root@s25linux tengine-2.3.2]# ./configure --prefix=/opt/tngx232/

# 5.编译且编译安装,生成nginx的可执行命令目录
make && make install 

# 6.安装完毕后,会生成/opt/tngx232/文件夹,nginx可以使用的配置都在这里了
[root@s25linux tngx232]# ls
conf  html  logs  sbin

conf  明显是存放*.conf配置文件的
html  存放网页的静态文件的目录
logs  日志
sbin  存放nginx的可执行命令 


# 7.添加nginx到PATH中,可以快捷执行命令

永久修改PATH,开机就去读
vim /etc/profile  
写入PATH="/opt/tngx232/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:"

# 8.首次启动nginx,注意要关闭防火墙
直接输入nginx命令即可启动
有关nginx的命令

nginx						 #首次输入是直接启动,不得再次输入 
nginx -s reload  #平滑重启,重新读取nginx的配置文件,而不重启进程
nginx -s stop  	#停止nginx进程 
nginx -t   #检测nginx.conf语法是否正确
3. nginx配置文件
# nginx的配置文件是c语言的代码风格 

# 以; 号 表示每一行配置的结束

# nginx.conf中 是以代码块形式 编写的

# 例如 主要的几个代码块

http{   }  # 里面定义了多个代码,是nginx的核心功能配置点

server{  }  # 虚拟主机代码块,定义了网站的目录地址,以及首页文件名字,监听的端口,等等功能

location {  }  # 域名匹配代码块。。

####比喻代码块的含义
def  hello():
	 # 我是缩进,被hello这个函数 控制
	 # 我们都是缩进内的代码块。。。
	  
func hello(){
		# 我们都是在花括号内的代码。。
		# 我们是各改代码块。。。。
}	 

![image-20220807105411562](Linux 系统相关操作.assets/image-20220807105411562.png)

#user  nobody;
#  定义nginx的工作进程数,以cpu核数 为准
worker_processes  5;
# 想用哪个用能,直接打开注释,或者写进来即可
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#error_log  "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";
# pid文件的作用是,pid是用于启停进程的号码
# ps -ef去获取nginx的进程id
# 吧pid写入到 此 nginx.pid文件中,
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}
# 这个http区域,是nginx的核心功能区域
http {
    include       mime.types;
    default_type  application/octet-stream;
    #打开此nginx的访问日志功能,即可查看日志
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    #nginx开启静态资源压缩,比如nginx返回磁盘的html文件特别大,里面包含了诸多的js css,图片引用
    #  一个html文件 达到4m大小
    #  传输图片 等等都是高兴的 1080p图片
    #  打开此功能,能够极大的提升网站访问,以及静态资源压缩
    gzip  on;

    # 提供静态资源缓存功能,第一次访问过网页之后,nginx能够让图片js等静态资源,缓存到浏览器上
    # 浏览器下次访问网站,速度就几乎是秒开了
    # 想要用这些功能,只需要在nginx里打开某些配置即可,作者都已经写好了该功能
    #
    #这里的server区域配置,就是虚拟主机的核心配置
    # nginx支持编写多个server{} 区域块,以达到多虚拟主机,多个站点的功能
    #   server{} 区域块,可以存在多个,且默认是自上而下去加载,去匹配的
    #   目前这里是第一个server {} 区域块,端口是85
    server {
        # 定义该网站的端口
        listen       85;
        #填写域名,没有就默认即可
        server_name  localhost;
        #更改nginx的编码支持
        charset utf-8;
        # 如此添加一行参数,当用户请求出错,出现404的时候,就返回 root定义的目录去寻找40x.html文件
        # 讲师机器的配置,也就是去  /s25python/ 这个目录下 寻找 40x.html
        error_page  404  /40x.html;
        #access_log  logs/host.access.log  main;
        
        
       #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
        # nginx的域名匹配,所有的请求,都会进入到这里
        # 例如  192.168.178.140:85/lubenwei.jpg
        #    192.168.178.140:85/menggededianhua.txt
        location / {
            #这个root参数,是定义该虚拟主机,资料存放路径的,可以自由修改
            #  当用户访问  192.168.178.140:85的时候,就返回该目录的资料
            root   /s25python/;
           # index参数,用于定义nginx的首页文件名字  ,只要在/s25nginx目录下存在index.html文件即可
            index  index.html index.htm;
        }

    }

#这里就是上一个Server{}的标签闭合处了,,可以写入第二个server{}
# 注意 ,注意,server{} 标签快,是平级的关系,不得嵌套,检查好你的花括号
# 这里是第二个虚拟主机的配置了
server  {
listen 89;
server_name  _;
#nginx的域名匹配
# 当用户访问 192.168.178.140:89的时候,返回该目录的内容
location  / {
        root   /s25linux/;
        index  index.html;

}

}
}

三、项目搭建

1. 安装docker

1. centos 7 安装 docker

安装docker

# 1.卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

# 2.设置存储库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-config-manager  --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 3.安装docker社区版
sudo yum install docker-ce
# 4.启动关闭docker
systemctl start docker

启动docker

systemctl start docker  #启动docker
systemctl enable docker #开机启动docker
systemctl status docker #查看docker状态

镜像加速

#一条命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
#事后重启docker
systemctl restart docker

获取镜像

从docker registry获取镜像的命令是docker pull。命令格式是:
docker pull [选项][docker registry地址] 仓库名:标签
docker register地址:地址的格式一般是 域名:端口,默认地址是docker hub
仓库名:仓库名是两段格式,用户名/软件名,如果不写用户,默认docker hub用户名是library,也就是官方镜像
2. ubuntu 安装 docker

更新ubuntu的apt源索引

sudo apt-get update

安装包允许apt通过HTTPS使用仓库

sudo dpkg --configure -a
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

添加Docker官方GPG key【这个是国外服务器地址,所以网路不好的时候,会失败!在网路好的情况下,多执行几次就没问题了】

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置Docker稳定版仓库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

添加仓库后,更新apt源索引

sudo apt-get update

前面的准备工作完成以后,接下来安装最新版Docker CE(社区版)

sudo apt-get install docker-ce

检查Docker CE是否安装正确

sudo docker run hello-world

出现了helo from Docker则表示上面的安装成功!

获取镜像文件,可以直接去官方网站上获取: https://hub.docker.com/

2. 前端项目搭建

1. 下载安装nginx镜像
# 在docker中下载nginx镜像
docker image pull nginx

# 使用git把码云上面的编译过的vue项目克隆到服务器/home
# 在本地终端通过以下命令上传编译后的项目文件
git add -f luffyweb/dist

# 阿里云服务器中,已经内置了git,所以可以直接从码云克隆项目下来: /home/luffy
# git clone 项目git地址
git clone https://gitee.com/mooluo/luffy.git
# 注意,上面提交的代码版本中,真正的前端项目编译代码在dev分支下面,所以我们需要切换分支
git checkout dev


# 创建nginx容器,并以80端口对外提供服务
# /usr/share/nginx/html 是nginx在安装时,系统默认分配的网站项目的根目录
docker run  -itd -p 80:80 -v /home/luffy/luffyweb/dist:/usr/share/nginx/html --name=luffyweb nginx
# 执行上面的命令,理论上来说,就可以让前端项目,可以阿里云的IP地址访问到了。

# docker run 选项:
# -v 目录映射,把服务器中的真实目录,映射到 容器内部的指定目录,当容器内部操作指定目录时,则相当于操作服务器里面的真实目录
# -p 端口映射,把服务器中的真实端口,映射到 容器内部的执行端口,当用户访问/操作真实端口时,则相当于访问/操作容器里面的端口

"""
/etc/nginx                        # nginx容器中nginx的配置目录
/etc/nginx/conf.d/default.conf    # 默认站点的配置文件
/usr/share/nginx/html             # nginx容器中网站根目录
"""
2. nginx配置文件
# 进入nginx容器,修改/etc/nginx/conf.d/default.conf文件
# 要在容器里面编辑文件,可以通过 apt-get update 和 apt install vim 来安装一个编辑器。
docker container exec -it <容器名称/容器ID> bash
vim /etc/nginx/conf.d/default.conf
# 修改 server_name 对应的路径
server {
    listen       80;
    server_name  www.luffyxxx.com;  # 填写域名

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;   # 页面刷新不会报错
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

# 重启nginx
nginx -s reload

3. MySQL数据库搭建

1. 安装mysql数据库的docker镜像,并创建容器
# 如果之前的mysql已经镜像没有下载,则下载命令如下:
docker image pull mysql:5.7
# -e 设置容器内部的环境变量,一个容器在创建的时候,可以多个不同的环境
# 启动mysql容器,MYSQL_ROOT_PASSWORD 指代的就是mysql的root用户的登录密码
docker run -itd -p3306:3306 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
# 如果需要多台mysql容器安装在一台服务器中,那么容器内部的端口可以不用设置,但是真实物理系统的端口必须要修改,保证端口唯一!
# docker run -itd -p3307:3306 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
2. 进入mysql容器,并进行配置
# 1. 通过 docker container exec -it 容器名/容器id  bash 进入容器
# 2. 进入数据库,创建数据库
mysql -uroot -p123
create database luffycity;
# 如果使用的数据库是低于8.0,使用下面的语句
# create database luffycity default charset=utf8mb4;

# 我们可以在任意一个外部网路中,远程链接到数据库中
# 注意使用命令远程链接mysql,必须使用的地方有mysql
mysql -hIP -P端口 -uroot -p密码
# mysql -uroot -p123456 -h39.108.60.95

# 3. 进行相关配置
# 8.0版本以上的mysql/MariaDB10.3
# 创建用户:create user '用户名'@'主机地址' identified by '密码';
create user 'luffycity_user'@'%' identified by 'luffycity';  # %表示任意主机都可以通过当前账户登录到mysql
# 分配权限:grant 权限选项 on 数据库名.数据表 to 'luffycity_user'@'%' with grant option;
grant all privileges on luffycity.* to 'luffycity_user'@'%' with grant option;

# create user 'xiaoming'@'%' identified by 'xiaoming';
# grant select,insert on homework.* to 'xiaoming'@'%' with grant option;

# mysql8.0/MariaDB10.3版本以下,创建数据库用户并设置数据库权限给当前新用户,并刷新内存中的权限记录
create user luffycity_user identified by 'luffycity';
grant all privileges on luffycity.* to 'luffycity_user'@'%';
flush privileges;
3. 数据库数据的导出和导入
# 远程链接数据库
# mysql -u 用户名 -p 密码 -h ip -P端口
mysql -uroot -p123 -h39.108.60.95 -P3306
# 创建数据库
create database luffy charset=utf8mb4;
exit
# 把本地的数据库导出
mysqldump -uroot -p123 luffy > ~/luffycity/luffy.sql

# 把桌面下导出的数据库文件导入到docker容器中的mysql数据库
mysql -uroot -p123456 -h39.108.60.95 -P3306 luffy <  ~/luffycity/luffy.sql

4. redis 数据库搭建

# 下载redis的docker镜像
docker pull redis

# 创建redis容器并运行redis
docker run -itd -p6379:6379 redis
    
# 可以进入到容器中,进行测试redis是否已经成功启动
docker container exec -it <容器名称/容器ID> bash

# 容器内部,执行 redis-cli

5. 后端项目环境搭建

项目部署到线上,首先是要对配置文件进行修改

1. 服务端收集静态文件

我们先收集所有静态文件。项目中的静态文件除了我们使用的上传文件之外,django本身还有自己的静态文件,如rest_framework、xadmin、admin、ckeditor等。我们需要收集这些静态文件,集中一起放到静态文件服务器中。

我们要将收集的静态文件放到项目的static目录中,所以先创建目录static。

Django提供了收集静态文件的方法。先在配置文件中配置收集之后存放的目录

settings/prod.py和dev.py ,代码:

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static')

因为目前在本地我们依然使用了dev.py文件运行项目,所以我们在本地项目收集静态文件就需要把配置信息同步到dev.py

在终端下执行收集命令

python manage.py collectstatic
2. 创建镜像,centos 或者 ubuntu
# 创建接下来运行django项目的容器
docker pull ubuntu:18.04
docker pull centos:7
# 因为我们的api项目已经上传到了真实服务器中,所以我们执行映射api项目的文件到容器中/home/luffycity目录下
docker run -itd -p 8000:8000 -v /home/luffy/luffyapi:/home/luffyapi --name=luffyapi ubuntu
# 进入容器
docker container exec -it luffyapi bash
# 更新镜像源[如果有时间,可以修改这个容器的镜像源]
apt-get update
# 安装基本软件和命令
apt-get install procps
apt-get install vim
# 检车当前容器中的python版本,如果没有python3则安装python3
  1. 配置虚拟环境
# 容器内部是没有安装python3的pip工具,所以需要安装
# ubuntu镜像
	apt install python3-pip
# centos镜像
	# 1.下载python源代码
	wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz # 去官网选择相应版本
    # python官网:https://www.python.org/
    # 2.然后进行解压,编译三部曲
    # 编译第一曲,结束后,主要是生成makefile,用于编译的
	./configure --prefix=/opt/python369/    
	#编译第二曲:开始进行软件编译
	make
	#编译第三曲:编译安装,生成python3的可执行程序,也就是生成/opt/python369/
	make install    
	#或者是 make&make install
    # 3.配置路径PATH,vim /etc/profile 
    
# 使用pip安装虚拟环境
pip3 install virtualenv -i https://pypi.douban.com/simple/
pip3 install virtualenvwrapper  -i https://pypi.douban.com/simple/

# 配置虚拟环境的环境变量
# 执行命令
mkdir $HOME/.virtualenvs

# 执行命令,打开并编辑 ~/.bashrc
vim  ~/.bashrc

# 文件末尾添加以下几行代码,:wq 保存退出。
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

# 刷新配置文件
source ~/.bashrc

# 创建虚拟环境
mkvirtualenv luffy -p python3

# 查看和进入虚拟环境
workon               # 查看
workon  虚拟环境名称   # 进入
  1. 把本地虚拟环境中导出模块包列表,在线上服务器里面容器里重新安装
# 在容器中同步之前的个人开发环境中安装包列表到当前虚拟环境中 requirements.txt
cd /home/luffyapi/docs
pip install -r requirments.txt -i https://pypi.douban.com/simple/

# 项目中有些包是之前使用下载包方式安装的,则这里需要我们手动安装
# 安装完成这些手动安装的包以后,我们再次执行上面的命令
pip install -r requirments.txt -i https://pypi.douban.com/simple
  1. 安装uwsgi,并在项目根目录下创建 uwsgi.ini 文件,进行uwsgi的配置
[uwsgi]
#使用nginx连接时使用,Django程序所在服务器地址
socket=0.0.0.0:8000
#直接做web服务器使用,Django程序所在服务器地址
# http=0.0.0.0:8000
#项目根目录
chdir=/home/luffyapi
#项目中wsgi.py文件的目录,相对于项目根目录
wsgi-file=luffyapi/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的角色
master=True
# 存放进程编号的文件
pidfile=uwsgi.pid
# 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
daemonize=uwsgi.log
# 指定依赖的虚拟环境
virtualenv=/root/.virtualenvs/luffy

启动uwsgi

cd /home/luffyapi/
# 经过上面的步骤,我们直接切到uwsgi.ini所在目录下,运行项目
# 注意,必须先进入虚拟环境中, workon luffy,才能运行
uwsgi --ini uwsgi.ini
# 运行过程中, 如果报错了,则直接查看uwsgi.log

6. 使用 supervisor 进程管理工具对 uwsgi 进行进程管理

安装 supervisor

1.使用yum命令即可直接安装
[root@s25linux ~]# yum install  supervisor -y

2.生成supervisor的配置文件
[root@s25linux ~]# echo_supervisord_conf >  /etc/supervisord.conf

3.修改supervisor的配置文件,添加管理crm的任务
vim  /etc/supervisord.conf #再最底行,添加如下内容

#[program:xx]是被管理的进程配置参数,xx是进程的名称

[program:luffy]
command=写入启动uwsgi的命令  ;supervisor其实就是在帮你执行命令而已!
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true     ;默认为false,向进程组发送kill信号,包括子进程

例如

[program:luffy]
command=/root/.virtualenvs/luffy/bin/uwsgi  --ini  /home/luffyapi/uwsgi.ini  ; # 使用绝对路径
user=root            ;
autostart=true       ;
startsecs=10         ;
autorestart=true     ;
stopasgroup=true     ;
killasgroup=true     ;

7. 使用nginx对uwsgi进行反向代理

修改/etc/nginx/conf.d/default.conf文件

     upstream luffy {
         server 39.108.60.95:8000;  # 云服务器ip和端口
         # server 39.108.60.95:8001;
     }

     # 代理uwsgi
     server {
         listen  80;
         server_name api.luffyxxx.com;  # 域名解析之后的二级域名

         location / {
             include uwsgi_params;
             uwsgi_pass luffy;
         }
     }

重启nginx

nginx -s reload

8. 对服务端提供静态文件支持

因为之前在前端项目部署的时候,已经有了一个nginx容器,所以我们接下来,就直接让前端的nginx容器同时提供静态文件的访问支持。

进入前端nginx容器并在nginx的配置文件default.conf里面的server部分中配置提供静态文件的访问!

先删除前端的vue项目的容器,然后再创建一个新的nginx容器,同时在创建的时候,我们进行目录映射。

前端项目要映射到容器,同时还要把api项目的static静态文件目录也要映射到该容器中。

# 先把现有的前端nginx容器打包成镜像
# docker commit  容器名/容器id  镜像名
docker commit  luffyweb  luffyweb

# 停止并删除前端nginx服务容器
docker container stop luffyweb
docker container rm luffyweb

# 基于上面的luffyweb镜像重新创建一个容器。
# 真实服务器下的客户端vue项目目录     /home/luffy/luffyweb/dist 
# 真实服务器下的服务端drf项目目录     /home/luffy/luffyapi/static
docker run -itd -p 80:80 -v /home/luffy/luffyweb/dist:/usr/share/nginx/html -v /home/luffy/luffyapi/static:/usr/share/nginx/static --name=lufei_pc front

修改配置文件 /etc/nginx/conf.d/default.conf

upstream luffy {
    server 120.77.220.233:8000;
    # server 120.77.220.233:8001;
}

server {
    listen  80;
    server_name api.luffyxxx.com;

    location / {
        include uwsgi_params;
        uwsgi_pass luffy;
    }
    
    location /static {
        root /usr/share/nginx;
    }
    
}

server {
    listen       80;
    server_name  www.luffyxxx.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;  # 页面刷新不会报错
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

重启nginx,然后进行访问

nginx -s reload
posted @   小苏xx  阅读(218)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示