DRF源码分析
Linux 系统相关操作
一、Linux 基础
1、Linux 命令提示符

2、Linux 文件系统 目录结构


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命令 读取文件内容
head和tail都是能够读取文件内容的
语法是
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) 系统1,5,15分钟的平均负载
第二行:进程信息
进程总数 正在运行的进程数 睡眠的进程数 停止的进程数 僵尸进程数
第三行: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(){
# 我们都是在花括号内的代码。。
# 我们是各改代码块。。。。
}

#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
- 配置虚拟环境
# 容器内部是没有安装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 虚拟环境名称 # 进入
- 把本地虚拟环境中导出模块包列表,在线上服务器里面容器里重新安装
# 在容器中同步之前的个人开发环境中安装包列表到当前虚拟环境中 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
- 安装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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix