Linux
Linux介绍
对于初创型的小公司,用户量很少,网站并发数也很低,开发架构不能太复杂,选择网站的黄金架构LNMP(Linux+Nginx+Mysql+PHP/Perl/Python)
shell壳的作用
老王学习python,在cmd里面写入了一段代码 print("隔壁的小孩长得越来越像我...")
↓
交给python翻译官
解释成机器码
↓
机器认识这一段话的作用,开始执行,然后 输出给用户
用户在命令行敲下 ls cd mkdir 这些linux的命令,计算机也是不认识的
↓
shell(linux下的bash脚本语言的解释器,翻译官)
↓
翻译给机器,去执行
图形化软件界面
图形化是linux安装了名为 gnonne的软件
进入到linux界面后,可以输入 ifconfig命令查看网络ip地址
1.登录系统后,需要切换root超级用户,否则权限很低
su - root #需要输入root密码
如果不能用,输入,
yum install net-tools -y #安装软件包 net-tools
2.此时你应该就可以输入ifconfig命令了
切换图形化和纯黑屏的命令
ctrl + alt + f1~f7 代表linux默认的7个终端
f1 是图形化 其他是纯黑屏
这些我们几乎用不上,我们都是用远程连接的方式操作
远程连接linux
对于服务器而言,我们不会直接去触碰机器,而是通过网络连接
1.确保你的服务器,正确的获取到了ip地址
ifconfig #查看到讲师的机器ip是 192.168.178.134
2.安装远程连接工具
windows点的同学,安装xshell 或者 secureCRT 或者
这2个软件其实也就是封装了 ssh命令而已
用macos的同学,直接使用ssh命令即可
ssh root@192.168.178.134
ip地址,标识了计算机在网络中的地址信息
123.206.16.61 这是一个公网的ip地址段,全世界都可以访问的
192.168.178.134 这是一个局域网的地址段,只有局域网内可以访问
127.0.0.1 ,本地回环地址,用于测试机器内部间通信的一个ip,只能自己和自己玩的地址
django程序启动在 127.0.0.1:8000
0.0.0.0 这个地址,表示注册绑定一台机器,所有的ip地址
由于一台服务器可能存在多个网卡,比如
linux机器 的2个ip
网卡1:192.168.178.134
网卡2:193.168.178.140
此时我启动django, python3 manage.py runserver
默认启动在 127.0.0.1:8000 windows机器能访问到吗? 答案是不能
那我启动在 python3 manage.py runserver 192.168.178.134:8000
windows怎么访问?直接访问192.168.178.134:8000地址即可
这样启动,192.168.178.140用户就无法访问到django了
所以在服务器上启动项目,一般都直接使用0.0.0.0地址,能够同时注册在
网卡1:192.168.178.134
网卡2:193.168.178.140
这2个ip上,
如此启动python3 manage.py runserver 0.0.0.0:8000
用户访问 192.168.178.134:8000
或者
193.168.178.140:8000 都可以了
port端口的概念,常见端口是?
一个端口对应一个服务
8080 ------自定义用的端口
3306--- mysql默认端口
80 --- http默认端口
443 ---https默认端口
6379 --- redis默认端口
22 ----- 用于远程连接服务器用的端口 22
linux命令提示符
linux命令语法如下
[root@bogon ~]# ls /tmp #这个命令表示,我要查看 /tmp 这个目录下的内容
#第二个简单的命令
#rm 命令 -f 参数(强制性删除) /tmp/oldboy.txt
rm -f /tmp/oldboy.txt
简单的命令 敲打
[root@bogon ~]# cd /home #目录切换,切换到 /home文件夹下
[root@bogon home]#pwd #我在哪 ,能够输出当前所在的绝对路径
[root@bogon home]# pwd
/home
[root@bogon home]# whoami #我是谁
root
[root@bogon pyyu]# pwd
/home/pyyu #linux的路径写法,如此
linux的文件系统 目录结构
windows的目录
windows的目录结构,是反斜杠的目录分隔符
是
C:\
D:\
E:\
这种多个盘符的形式,可能存在多个目录顶点
linux的目录
只有一个 根目录
/
例如
/home # 根目录下有一个home文件夹
/s25 #根目录下有一个s25文件夹
#根目录下有2个同级的文件夹,男同学和女同学
/s25/男同学/小明.txt
/s25/女同学
文件目录增删改查操作
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
如果开机没有ip怎么办
1.vim编辑网卡配置文件,修改如下参数
[root@s25linux tmp]# cd /etc/sysconfig/network-scripts/
ls 查看 ifcfg-ens33文件
vim修改此文件,找到如下参数,改为yes
ONBOOT="yes"
2.确保vmware 正确选择了 桥接 或是NAT,且已经连接上了
3. 命令重启网络设置
systemctl stop NetworkManager #关闭无线网络服务
systemctl restart network #重启有线网服务
#这2个命令执行都没有任何提示,表示正确的重启了网络配置
4.此时查看ip地址是否存在了
ip addr show
hostname 查看主机名
hostnamectl set-hostname 新的主机名
passwd 用户名 更改/设置用户密码
useradd 用户名
su - 用户名 切换用户
Linux常用命令
mkdir
mkdir 感谢老铁的花花 感谢老铁送上的飞机
mkdir -p 斗鱼/lol 虎牙/王者农药
tree
树的意思,以树状图显示文件目录的层级结构
#确保你的机器可以上网 ,yum如同pip一样,自动的安装东西,解决依赖
# pip 是给python安装模块的工具
# yum 是给linux安装系统软件的工具
yum install tree -y # -y默认yes同意安装
[root@s25linux tmp]# mkdir -p a/b c/d
[root@s25linux tmp]# tree
查看linux命令的帮助信息
1.用man手册,linux提供的帮助文档
man ls
man cp
man mkdir
2.命令加上 --help参数,查看简短帮助信息
mkdir --help
rm --help
3.在线的搜索一些命令查询网站
http://linux.51yip.com/
4.在线询问人工智能---超哥
...
echo命令
echo命令如同python的print一样,能够输出字符串到屏幕给用户看
案例
[root@s25linux tmp]# echo "感谢老铁送上的奥力给"
感谢老铁送上的奥力给
#linux在命令行的变量赋值,是临时生效的
#输出变量的值
#定义变量,中间有空格
name="感谢老铁送上的飞机"
#输出变量的值
[root@s25linux tmp]# echo $name
感谢老铁送上的飞机
PATH变量
PATH就是定义一些常用的软件可执行命令的目录,放入系统中,可以快捷的查询,而不需要每次都输入绝对路径
1.为什么系统能够直接找到python解释器?
[root@s25linux tmp]# which python #输出命令所在的绝对路径
/bin/python
2.学习linux的PATH,
[root@s25linux tmp]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
注意,PATH的路径,是有先后顺序的,从左往右,读取的
3.如果编译安装了一个python3,装在了 /opt/python36/目录下,怎么添加PATH?
#这个变量赋值的代码,就是添加python3到环境变量中了
PATH="/opt/python36/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:"
4.由于上述变量赋值的操作,只是临时生效,我们想永久的更改PATH的值,还得修改/etc/profile
vim /etc/profile #打开文件,在文件末尾,添加PATH值的修改
PATH="/opt/python36/bin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:"
PATH的寻找原理图
修改linux的全局配置文件
1.名字叫做 /etc/profile,里面是shell脚本语言
2.编辑这个文件,写入你想永久生效的变量和值,系统每次开机都会读取这个文件,让其生效
vim /etc/profile
写入如下内容
###这是自定义的变量,每次开机都能够读取了,第一条是设置系统中文的变量
export LC_ALL=zh_CN.UTF-8 #打开注释,系统支持中文
#export LC_ALL=en_US.UTF-8 #打开注释,系统就支持英文了
linux单引号和双引号的区别
单引号中的内容,仅仅就是个字符串了,不识别任何其他的特殊符号
双引号中的内容,能够识别特殊符号,以及变量
[root@s25linux ~]# echo '$name'
$name
[root@s25linux ~]# echo "$name"
我们是穿越在银河的火箭队
vim编辑器的用法
最基本的编辑器
windows
- 记事本
- sublime
- notapad++
- ....
linux
- vi 等同于记事本,很难用,没有语法颜色提示灯
- vim,等同于Notepad++,有颜色高亮,支持安装第三方插件,语法补全等等高级编辑器
vim使用流程
1. vim 需要单独安装的
yum instal vim -y # 安装
2.vim打开一个不存在的文件,默认会创建此文件
#用vim写一个python脚本,
#vim的使用流程
第一步:vim first.py ,此时会进入命令模式,按下字母 i,进入编辑模式
第二步:想要退出编辑模式,按下键盘的esc,回到命令模式
第三部:此时输入 shfit+冒号,输入一个英文的冒号,进入底线命令模式
第四步:输入 :wq! ,write写入内容,quit退出vim ! 强制性的操作
:wq! 强制保存写入退出vim
:q! 强制不保存内容,直接退出
3.此时可以查看一下文件内容
[root@s25linux tmp]# cat first.py
#!coding:utf-8
print ("你看这个灯,它又大又量")
4.如何执行这个脚本?
python fisr.py #即可执行脚本文件了
cat命令
cat 猫,用这个只猫瞄一眼 文件的内容
cat 文件名
[root@s25linux tmp]# cat first.py
print ("你看这个灯,它又大又量")
#读取内容,且显示行号
cat -n 文件名
#利用cat写入文件内容,写一首诗
[root@s25linux tmp]# cat >> second.py << EOF
> #!coding:utf-8
> print("爱的魔力转圈圈")
> EOF
[root@s25linux tmp]#
[root@s25linux tmp]#
[root@s25linux tmp]#
[root@s25linux tmp]#
[root@s25linux tmp]# cat second.py
#!coding:utf-8
print("爱的魔力转圈圈")
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
cp命令
拷贝
#对于配置文件的修改,或者是代码文件的修改,防止突然写错了,复制一份
#复制文件
[root@s25linux tmp]# cp 木兰诗.txt 新_木兰诗.txt
#复制文件夹,复制文件夹需要添加 -r 递归复制参数
[root@s25linux tmp]# cp -r a new_a
mv命令
mv命令可以 移动文件 ,文件夹的路径
mv命令也能够进行 重命名
1.重命名的功能
语法是
mv 旧文件名 新文件名
[root@s25linux tmp]# mv 木兰诗.txt new_木兰诗.txt
2.移动位置
语法
mv 你要移动的文件或是文件夹 移动之后的目录名(如果文件夹存在,则移动,不存在是改名)
案例
mv test.txt b #移动 test.txt文件 到 b文件夹下(b文件夹得存在,b不存在则test.txt)
alias别名命令
为什么rm命令默认会有一个让用户确认删除的动作呢?
解答是因为 rm 的-i参数作用
alias #直接输入可以查看当前系统的别名
案例
1.给系统添加一个别名
当你敲下start就是在执行后面的长串命令,很方便
alias start="python3 /home/mysite/manager.py runserver 0.0.0.0:8000"
find命令
可以用于搜索机器上所有的资料,按照文件名字搜索,linux一切皆文件
语法
find 你要从哪找 -type 你要的文件类型是什么 -size 你要的文件内容多大 -name 你要的内容名字是什么
-type f 是找普通文本文件
-type d 是找 文件夹 类型
-name 是指定文件的名字内容
#在系统上 全局搜索,所有的.txt文件
find / -name "*.txt"
#指定在etc目录下,进行局部搜索,一个网卡配置文件,网卡名字是以ifcfg开头的 ,文本类型文件
find /etc -type f -name "ifcfg*"
案例2
1.准备好测试的数据,在/tmp目录下
mkdir /tmp/python{1..5} #在/tmp目录下 创建 出 python1 ptyhon2 ... python5
touch /tmp/python_{a..d} #在/tmp目录下创建出 python_a ptyhon_b .. python_d 几个文件
2.查看准备好的测试文件
[root@s25linux tmp]# ls
python1 python3 python5 python_b python_d
python2 python4 python_a python_c
3.在/tmp目录下联系find命令
4.找出/tmp目录下所有的pyton相关内容
[root@s25linux tmp]# find . -name "python*"
./python1
./python2
./python3
./python4
./python5
./python_a
./python_b
./python_c
./python_d
5.找出/tmp 下所有的python相关的文件
[root@s25linux tmp]# find . -type f -name "python*"
./python_a
./python_b
./python_c
./python_d
6.反之找出所有的文件夹
find . -type d -name "python*"
7.全局搜索,超过10M大小的 txt文本
[root@s25linux tmp]# find / -size +10M -name "*.txt"
/tmp/python2.txt
/tmp/python3.txt
查看文件,文件夹大小
ls -lh # -h参数,是显示文件单位,以kb mb gb大小为单位 -l是列表形式,列出文件夹中详细信息
linux的管道符命令

1.例如过滤服务器上的进程信息
2.例如过滤服务器上的端口状态信息
grep命令
grep是linux强大的三剑客之一,从文本中,过滤有用信息的命令
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=[]
案例2
cat 文件 | grep "你想要的内容" #用法二
1.找出linux的用户信息文件,中 有关pyyu的行信息 /etc/passwd
[root@s25linux tmp]# cat /etc/passwd | grep "pyyu"
pyyu:x:1000:1000:pyyu:/home/pyyu:/bin/bash
head、tail命令
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 #能够检测文件内容的变化
如何查看文件的,中间20行-30行的内容
head -30 pwd.txt | tail -20 先读取前30行的内容,从后往前读取10行内容
scp命令
在2台linux机器(macos)之间,通过网络安全的传输文件,文件夹
scp命令 语法是
环境准备,准备2台linux机器
确保两台机器能够通信
机器1:192.168.178.134
机器2:192.168.178.235
案例1:
我登录的是 机器1
需求1:将机器1的/tmp/好嗨哦.txt 发送到 机器2的/tmp目录下
[root@s25linux tmp]# scp /tmp/好嗨哦.txt root@192.168.178.235:/tmp/
需求2:把机器2的/tmp目录下的资料 给拿到本地的/opt目录下
scp 你想要的内容 内容发送到哪里
scp root@192.168.178.235:/tmp/小样别偷看.txt /opt/
情况2,我登录的是 机器2
【把别人的资料拿来】
案例1:我想拿到机器1的/opt/test.txt 拿到机器2的/tmp目录下
scp 我想要的内容 内容存放的地点
scp root@192.168.178.134:/opt/test.txt /tmp/
【把自己的资料发给别人】
案例2:我想把本地的/home/fisrst.py 发送给机器1的/home目录下
scp /home/first.py 账号@机器1:/home/
scp /home/first.py root@192.168.178.134:/home/
#如果发送的是整个文件夹,就得加上 -r 递归的拷贝参数
[root@s25linux tmp]# scp -r ./lol root@192.168.178.235:/tmp/
#用通配符发送多个文件
[root@s25linux tmp]# scp -r ./* root@192.168.178.235:/tmp/134bak/
lrzsz工具
用于windows(基于xshell工具)和linux之间互相传递文件
1.安装此工具
yum install lrzsz -y
2.安装好lrzsz之后,就存在了2个命令 一个是 rz 一个是sz
rz #直接输入rz命令,能够蹦出一个弹窗,接收windows的资料
sz 文件 #发送linux的一个文件,发给 windows某个位置,也是出现一个弹窗
du命令
用法
du 【参数】【文件或目录】
-s 显示总计
-h 以k,M,G为单位显示,可读性强
案例
统计/var/log/文件夹大小
du -sh /var/log/
#显示当前目录下 所有文件的大小
[root@s25linux tmp]# du -h ./*
vim命令的用法
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的行号
top命令
windows的任务管理器见过吧
能够显示 动态的进程信息
cpu、内存,网络,磁盘io等使用情况 ,也就是一个资源管理器
那么linux的资源管理器 就是top命令
第一行 (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:缓冲的交换区总量,内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
ps命令
用于查看linux进程信息的命令
语法就是
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
1.一个django运行后,如何验证django是否运行了,它会产生些什么内容?
能够产生日志,检测到用户的请求,说明django运行了
查看端口情况,django会占用一个端口
产生一个python相关的进程信息
kill命令
杀死进程的命令
kill 进程的id号
如果遇见卡死的进程,杀不掉,就发送 -9 强制的信号
kill -9 pid
netstat命令
查看linux的网络端口情况
语法如下
常用的参数组合 -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
#有些公司为了保护服务器安全,更改了默认的远程连接端口
# 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:
grep是支持正则表达式的
查看系统发行版
不同的发行版,使用命令有所区别,安卓手机----IOS手机--操作方式不一样
centos---常用的命令---yum软件管理工具
ubuntu---常用命令差不多的-----没有yum-只有apt软件管理工具
#此文件,之后红帽系统才有
[root@vm_0_8_centos tmp]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
#任何的linux系列都有的一个文件
[root@s25linux ~]# cat /etc/os-release
history 历史记录命令
可以查看用户之前敲打的命令
可以用感叹号,加行号,快速执行之前的命令
centos7用什么命令管理服务
systemctl #这是centos7
systemctl start ngixn # 7系列这么启动
service #这是centos7以下系列系统,使用的命令
service nginx start # 6系列启动命令
Linux用户管理
对于一个qq群而言,有哪些角色划分,权利的划分
群主-----qq群里面,权利最大,想干嘛就干嘛,可以随意的拉人,踢人等等----相当于皇帝----相当于linux的root用户
管理员---他是root赋予的临时的超级权限-在用皇帝的身份狐假虎威---钦差大人---linux系统中的sudo命令--尚方宝剑
吃瓜群众---权利最低的,基本上只能够在自己的家目录,进行增删改查,其他目录,权限都很低-----linux的普通用户
系统创建了用户,同时会创建一个同名的组
例如
useradd caixukun #创建普通用户 caixukun,系统会在/etc/passwd文件中,增加一行用户信息
且同时创建了一个用户组 也叫caixukun ,存放在/etc/group 文件中
id命令
查看用户的账户信息的命令
例如
id root
[root@s25linux tmp]# id root
uid=0(root) gid=0(root) 组=0(root)
id caixukun
[root@s25linux tmp]# id caixukun
uid=1004(caixukun) gid=1004(caixukun) 组=1004(caixukun)
组的概念
对于技术部门,运维需要分配的单个用户的权限太散,太多,人太多了。。。
【权限控制,其实控制的就是,不同的组,不同用户,针对不同的文件夹,文件,操作的权限的不同】
比如说
mysql的默认数据存放路径,如 /var/lib/mysql/* 那么这个mysql的数据文件,以及所有的文件夹,是属于哪个组,哪个用户管理呢?
比如说有一个文件
-rw-r--r--. 1 root root 0 2月 17 08:52 mysql.log

前端组
后端组,权利稍微大一点。
运维组,对于服务器操作权限很大,可以使用root的权限
测试部门
安全部门
DB部门
运维都得对上述的人,进行权限控制,对于服务器的操作权限
因此引入组的概念,针对整个组管理,就方便多了,
root而言
root为什么叫root,是因为系统提出了UID的概念,用户id号,用户id为0的就是系统的超级用户
普通用户由root用户创建,默认的UID是从1000开始进行累计,权利很低
普通用户
默认用户家目录都在/home
例如
/home/pyyu/
/home/alex/
/home/wupeiqi/
用户管理的命令
添加删除用户,注意的是,涉及到权限的修改,只能用root去操作,其他人基本上没权限
useradd caixukun #创建用户caixukun
passwd caixukun #给用户修改密码,
userdel caixukun #删掉caixukun这个用户
userdel -rf caixukun #删除用户,且删除用户的家目录
用户登录切换
su - 用户名 #用户登录切换,普通用户切换,需要输入密码,root用户想干嘛都不需要密码
#这个减号必须加上,叫做,完全的环境变量切换,是正确的切换方式
比如
su - pyyu
su - root
尚方宝剑命令sudo
1.当pyyu用户,想要进入/root文件夹,发现权限不够,怎么办
思路:
1.使用sudo命令,默认以root身份去执行命令
例如 sudo cd /root
思路2:
把pyyu用户,加入到root组里,也就拥有了root组的权限,但是还是得查看这个group的权限
思路3:
直接修改/root文件夹的权限,允许其他人,也可以读写执行 ,其他人也就能够进入到/root文件夹了
【sudo命令使用配置流程】
1.使用visudo命令,修改配置文件,添加你允许执行sudo命令的用户
visudo #打开文件后,找到大约在91行的内容,修改为如下
91 ## Allow root to run any commands anywhere
92 root ALL=(ALL) ALL
93 pyyu ALL=(ALL) ALL
2.保存退出之后,即可使用sudo命令了
sudo ls /root
Linux文件、目录权限管理
文件管理的权限-----也就是针对这文件,属于哪个用户,属于哪个组,以及对应的权限是什么
背景:比如武沛奇,有一个手机 iphone7
这个iphone7 属于哪个用户?他的权限应该是怎样的?(他对于这个手机使用的权限)
(这个手机属于 武沛奇,并且他的权限,应该是 最大的权限,可以随意的把玩 )
对于武沛奇自己而言
是可以任意的把玩,用读写执行的权限
武沛奇可以看手机,改手机资料,手机给砸了
那武沛奇的家庭成员(他老婆),对于这个手机而言,属于什么样的关系?并且可能的权限是什么?
读,写,执行(可以看手机,改手机内容,以及砸掉手机)
他老婆属于武沛奇这个家庭组里,可能分配的权限是,读写权限(这个权限都是有权利最大的人分配的,好比一家之主说话才算话)
因此,武沛奇家庭组的人,可能只能读写,,也就是,可以 看手机 ,,玩手机,而不能砸掉
那此时,超哥来了,对于这个武沛奇的手机而言,属于什么身份关系?以及可能用的 读写执行权限是什么??
超哥对于这个手机而言,就属于一个 其他人,没有任何的关系,因此权限一般很低,只能看一看,摸都不给摸
对于如上的比喻做一个总结
对于linux系统而言,文件、文件夹,都是有 user 属主, group属组的一个角色分配,还存在一个other其他人
这三个身份的划分
并且设定了 r w x 三个权利的限制,也就是 读,写,执行(对于文件的读写执行)
场景:
1. root用户在/tmp目录下 创建了一个 文件 叫做 root.txt ,因此这个文件默认就属于root用户,属于root用户组
2.此时 一个普通用户,登录了机器 ,如
ssh chaoge@192.168.178.134 登录机器之后,chaoge对于这个 root.txt文件而言,就是一个其他人的身份了


查看文件夹的详细信息
[root@s25linux ~]# ll /tmp
总用量 4
drwxr-xr-x. 2 root root 6 2月 17 11:00 hehe #文件夹
解读它的信息
drwxr-xr-x 拆分如下
d d代表是一个文件夹
rwx user是root,root可以读写执行
r-x group也是root,root组里的成员,可以读,执行
r-x others权限是 读,执行
#文件的权限,必须顺序是 rwx ,没有权限则写一个-号
-rw-r--r--. 1 pyyu pyyu 2328 2月 17 09:15 pwd.txt #文件
#解读如上的权限
- 开头是 -号,就是普通的文本类型
rw- user是pyyu,pyyu这个用户权限是 可读、可写,不可执行
r-- group是pyyu,只读
r-- 此时peiqi这个用户对于pwd.txt这个文件,权限就是 只读的
对于文件的rwx
r cat,more,less,head,等读取文件内容的操作
w vim ,echo,等写入内容的操作
x 可以执行的脚本,例如bash,python等脚本,文件会变成绿色
对于文件夹的rwx
r ls 查看文件夹内容
w 允许在文件夹中创建文件等操作
x 允许cd进入此文件夹
chmod命令总结
chmod 可以更改文件的权限,更改针对 user,group,other的权限修改,例如
chmod u+r file.txt #给文件的user,添加读的权限
chmod g-x file.txt #给文件的group组权限,去掉可执行
chmod o+r,o+w,o+x file.txt #给文件的other身份,最大的权限,读写执行
chmod 000 file.txt #给与文件最低的权限,任何人不得读写执行

chown
change owner缩写
更改文件的拥有者,user
chown 新的属主 file.txt
chgrp
更改文件的拥有组,group
change group 缩写
chgrp 新的属组 file.txt
软连接
windows的一个快捷方式而已
创建命令
ln -s 目标文件绝对路径 软连接绝对路径
[root@s25linux tmp]# ln -s /tmp/test.txt /opt/t.txt #给/tmp/test.txt创建一个快捷方式,放在/opt/t.txt 这里
删除快捷方式,删除软连接是不会影响源文件的
windows下装另一个qq在 D:\qq\qq.exe ,发送快捷方式到桌面
打包、压缩、解压缩
也就是linux的tar命令
打包,不节省空间
压缩,节省磁盘空间
语法
tar 命令
功能参数
-z 调用gzip命令,对文件压缩 ,加上这个参数,才会节省磁盘空间
-x 解包,拆快递
-v 显示整个过程
-f 必须写在参数结尾,指定压缩文件的名字
-c 打包,收拾快递
压缩文件的后缀,本没有意义,只是告诉别人,这个文件是用什么命令压缩/解压缩
*.gz gzip命令解压缩
*.tar 用tar命令解压缩
*.xz 用xz命令解压
*.zip 用unzip命令解压
案例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 ./
疑问:必须先打包再压缩吗?能对一个文件夹直接压缩吗?
解答: 打包,压缩是一体的,是调用tar命令,加上-z参数,自动就压缩了
tar -zcvf dir.tar.gz ./testdir/ #压缩此文件夹,放入到一个压缩文件 dir.tar.gz中
.gz是 压缩的常见后缀格式
防火墙
用于控制服务器的出/入流量
防止恶意流量攻击服务器,保护服务器的端口等服务。
在学习阶段是直接关闭的,专业的运维人员需要学习iptables软件的一些指令
云服务器,默认都有一个硬件防火墙,以及软件防火墙(iptables、firewalld)
我在服务器上,运行了django服务,如果开启了防火墙服务器,且没有自定义规则,默认是拒绝所有外来流量 ,导致我们windows无法访问到linux运行的django等程序
1.清空防火墙规则
iptables -F #清空防火墙规则
2.关闭防火墙的服务
systemctl stop firewalld #关闭防火墙服务
systemctl disable firewalld #禁止防火墙开机自启
DNS域名解析
什么是dns解析?
dns解析系统-------手机上的电话簿------- 小王----132xxx 小莉---186xxxx
dns服务器,存储了公网注册的所有(域名----ip)对应的解析关系
linux的dns客户端配置文件/etc/resolv.conf
里面定义了主备的两个dns服务器地址
[root@s25linux ~]# cat /etc/resolv.conf
# Generated by NetworkManager
#search localdomain
nameserver 119.29.29.29 # 改成 223.5.5.5 速度快(阿里巴巴DNS服务器地址)
nameserver 223.5.5.5 # 改成 223.6.6.6 速度快(阿里巴巴DNS服务器地址)
linux的本地dns强制解析文件 /etc/hosts,可以写入一些测试的域名,用于本地机器使用,域名解析优先级更高
[root@s25linux ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 pythonav.cn
nslookup命令
域名查找命令
nslookup www.pythonav.cn #寻找dns对应关系
浏览器输入url之后,是怎么解析的?发生了什么事?
浏览器里面输入 www.pythonav.com发生了什么
1.浏览器进行dns查找,解析 域名对应的ip机器,找到之后浏览器访问此ip地址
2.用户请求,发送到了服务器之后,优先是发给了nginx(web服务器),用户请求的是静态资源(jpg,html,css,jquery)nginx直接从磁盘上找到资料给与用户查看
如果nginx检测到用户请求是一个动态请求,登录,注册,读取数据库,例如 .php 例如 .aspx ,通过url匹配发现是动态请求,转发给后端的应用服务器(php,tomcat,django)
3.django处理完用户的动态请求之后,如果发现需要读取数据库,再通过pymysql向mysql读取数据
4.如果django处理请求,发现读取的是redis,再通过pyredis向redis拿数据
5.django处理完毕之后,返回给nginx
6.nginx返回给用户浏览器
7.浏览器渲染数据之后,给与用户查看页面
大型网站技术架构,很nb,好好看,面试可劲吹
crontab定时任务
crond定时任务服务,提供了一个客户端管理命令crontab
crontab -e #编辑定时任务配置文件
crontab -l #查看定时任务的规则
定时任务,注意的是 ,几号,和星期几不得共用
案例
1.每分钟,将一句话,追加写入到一个文件中
第一步:crontab -e #打开配置文件
写入如下内容,用的是vim编辑器命令
* * * * * /usr/bin/echo "有人问王思聪,钱是万能的吗?王思聪答:钱是万达的" >> /tmp/wsc.txt
2.检查定时任务
crontab -l
定时任务的语法规则
* * * * * 命令的绝对路径
分 时 日 月 周
3,5 * * * * #每小时的第3,第5分钟执行命令
15 2-5 * * * ¥每天的2点一刻,3点一刻,4点一刻,5点一刻,执行命令
每天8.30上班
30 08 * * * 去上班
每天12下班回家睡觉
00 00 * * * 回家睡觉
定时任务语法练习
#每分钟执行一次命令
* * * * * 命令的绝对路径
分 时 日 月 周
#每小时的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 命令绝对路径



记住一句话,服务器上操作,用绝对路径,基本不会出错了,除非手误,单词写错了。。。。
能用绝对路径,别用相对路径!
休息一下,4点来,配置好yum环境
linux软件包管理
windows的软件管理,安装文件的后缀 *.exe
macos的应用程序安装 后缀 *.dmg
linux的二进制软件包 都是 *.rpm 格式的
软件的依赖关系
pip install flask #仅仅就安装了flask模块吗?肯定不是,会安装一堆依赖的模块,比如jinja2等模块
那么在linux平台,一个软件想要正确的运行,也得解决系统的开环库环境,解决依赖关系
linux平台的软件安装形式,有3个
- 源代码编译安装,此方式较为麻烦,但是可以自由选择软件的版本(因为是去官网下载最新版本代码),也可以扩展第三方额外的功能(五颗星)
- 扩展第三方功能
- 指定软件安装目录
- rpm包手动安装,此方式拒绝,需要手动解决依赖关系,贼恶心(两颗星)
- yum自动化安装软件,需要配置好yum源,能够自动搜索依赖关系,下载,安装,处理依赖关系(五颗星)
- 不好的地方在于,yum源仓库的软件,版本可能较低
- 无法指定安装路径,机器数量较多的时候,不容易控制
更换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
systemctl enable redis #设置redis开机自启
systemctl disable redis #禁止redis开机自启
8.使用redis的客户端命令,连接redis数据库
[root@s25linux yum.repos.d]# redis-cli
127.0.0.1:6379> ping
PONG
9.用yum安装mysql服务且启动,在centos7系列系统上,mysql以及更名了,叫做mariadb数据库
yum install mariadb-server mariadb -y #安装2个有关mariadb的软件包
systemctl start mariadb #启动mysql数据库服务
mysql -uroot -p #初次进入不用密码,直接回车进入数据库
Linux编译python3开发环境
发博客,尝试是否能照着博客,搭建出python3的开发环境
https://www.cnblogs.com/pyyu/p/7402145.html
编译安装python3的步骤
编译安装python3的步骤
1.很重要,必须执行此操作,安装好编译环境,c语言也是编译后运行,需要gcc编译器golang,对代码先编译,再运行,python是直接运行
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
2.获取python的源代码,下载且安装,下载源代码包的形式,自由选择
用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


window上安装lol的过程
1.下载lol可执行安装文件 lol.ext
2.双击安装 ,首次应该是指定lol的安装位置
3.下一步开始安装,lol会检查系统的微软的基础游戏运行组件,如果缺少某组件,游戏会安装失败(缺少什么就安装什么即可),如果微软的开发环境正常,则正常安装
4.直到游戏安装完毕,生成可执行的游戏执行程序
5.进入游戏安装目录,开始使用
linux平台安装软件,也是这个过程,只不过用命令行代替了点点的操作
创建django项目,linux运行django
注意你的python3版本,和django的版本,是否合适!!
python3.6.9
django选择用1.11.25
1.安装django模块
pip3 install -i https://pypi.douban.com/simple django==1.11.25
#检查一下pip3的模块信息
pip3 list
2.升级pip3工具
pip3 install -i https://pypi.douban.com/simple --upgrade pip
3.在linux平台,使用命令创建django项目了
django-admin startproject dj1
4.创建一个app01
[root@s25linux dj1]# django-admin startapp app01
5.编写一个视图函数,hello视图,修改app01,【访问hello视图,返回字符串,s25期的靓仔们很强】
5.1 修改django的settings.py ,注册app01 ,修改如下
#并且修改允许访问的主机列表
# 默认只允许 本地 127.0.0.1访问
# 启动在了linux的机器上 ,如果不修改windows无法访问
# 写一个 * 表示允许所有的主机访问
ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
5.2 先修改django的 urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/', views.hello),
]
5.3 编写django的app01.views,添加如下代码
from django.shortcuts import render,HttpResponse
def hello(requests):
return HttpResponse("s25期的靓仔们很强")
6. 进行数据库迁移
[root@s25linux dj1]# python3 manage.py migrate
6.1.指定ip和端口,启动django
[root@s25linux mysite]# python3 manage.py runserver 0.0.0.0:9000
7.如何访问django项目?
访问linux的ip地址+django的端口
8.出现无法访问的问题,要根据报错去思考,到底是什么问题
网站直接是白屏,白花花什么都看不见,


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=python3 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=python3 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,也就表示退出了
激活虚拟环境的原理图


利用了虚拟环境,可以分别运行多个干净、隔离的python web环境
保证开发环境,生产环境python模块一致性
软件开发的环境
小公司,服务器环境可能没那么严格(本地开发人员+测试环境+线上环境)
大公司,(本地环境+测试环境+预生产环境+线上环境)
Python web开发组
-
开发环境(windows,macOS,ubuntu,本地开发代码的一个环境),装python3 pip3项目依赖的模块
- python3环境
- mysql环境
- redis环境
- vue
- nginx
-
测试服务器,代码测试bug,以上的环境,还得再搭一遍,测试服务器才能运行项目
-
线上服务器,还得环境搭建一遍,,,,很难受。。
如何解决环境问题?
- 虚拟机的模板克隆,打包好一个基础开发环境,克隆多份,生产多个部署环境
- 利用docker容器技术的,一个镜像打包技术
在这里,是看一下
在windows开发一个项目,pip3 安装了很多的模块,最终该项目才可以运行,比如crm代码
代码上传到一个新的服务器,是一个空的环境,还得在部署一遍,比如crm代码
土办法:运行代码,查看报错,一个一个模块单独去安装解决
不那么土的办法:
pip3 freeze > requirements.txt #把你当前解释器所有用到的模块,信息导出到一个文件中
1.在windows的cmd命令行中,通过此命令导出模块信息
pip3 freeze > requirements.txt
2.把此文件发送给linux机器,或者直接拷贝其内容,也可以
在linux机器上,安装此文件即可,自动读取文件每一行的模块信息,自动安装
pip3 install -i https://pypi.douban.com/simple -r requirements.txt
本质用法:这个命令其实就是,将一个解释器的模块信息导出,丢给其他人去安装
学习阶段,模拟使用
1.在物理解释器下,安装各种模块
2.在虚拟环境下,安装此模块文件


linux启动crm项目
1.准备好crm代码,讲师的,或是自己所写的,上传至linux服务器中
lrzsz
xftp
scp
上传至服务器的代码是tf_crm.zip ,zip用unzip命令解压缩
unzip tf_crm.zip
2.新建一个虚拟环境,用于运行crm
在项目下,生成虚拟环境,便于管理此文件夹
[root@s25linux tf_crm]# virtualenv --python=python venv_crm
source venv_crm/bin/activate
3.立即解决crm运行所需的模块依赖
pip3 freeze > requirements.txt
上传至linux服务器
在venv_crm虚拟环境中,安装此文件即可
如果没有此模块依赖文件,那么就手动解决吧,。。。。
此时你要注意
python3 manage.py runserver 这个命令,并不是让你启动django项目的!!!
因为此命令,调用的是python 内置的wsgiref单机socket模块,性能低下,单进程单线程。。。
#手动安装所有模块
pip3 install -i https://pypi.douban.com/simple django==1.11.25
(venv_crm) [root@s25linux tf_crm]# pip3 install -i https://pypi.douban.com/simple pymysql
(venv_crm) [root@s25linux tf_crm]# pip3 install -i https://pypi.douban.com/simple django-multiselectfield
4.缺少mysql,因此需要安装mariadb,且启动
(venv_crm) [root@s25linux tf_crm]# yum install mariadb-server mariadb -y
是否激活虚拟环境,会影响yum工具吗?
不会,因为激活虚拟环境,只是添加了一个PATH而已,只会影响python相关的操作,不会影响到其他的linux命令....
无论是否激活虚拟环境,也不会影响yum等等..
5.启动mariadb数据库
(venv_crm) [root@s25linux tf_crm]# systemctl start mariadb
6.注意可能需要修改django的settings.py有关数据库连接的账密信息等
7.还要注意,由于数据库是空的,还得进行数据库表的导入,导出本地数据库表,导出
# 参数--all-databases能够导出所有的数据库,表,也可以指定某一个数据库。表导出
大家使用此命令行就可以了!!!!导出所有的库表,然给交给linux导入
大家使用此命令行就可以了!!!!导出所有的库表,然给交给linux导入
大家使用此命令行就可以了!!!!导出所有的库表,然给交给linux导入
mysqldump -uroot -p --all-databases > alldb.sql
#冯浩敲打的命令,如下,指定数据库导出
# -d 参数是只导出表结构,不要表中的数据
mysqldump -uroot -p123 -d tf_crm > tf_crm.sql
8.发送此alldb.sql文件,给linux机器,再进行数据导入
就是将第七步的SQL文件,通过lrzsz、scp、xftp等方式,发送此文件,给linux
mysql -uroot -p < /opt/alldb.sql
9.此时再次尝试启动crm项目
(venv_crm) [root@s25linux tf_crm]# python3 manage.py runserver 0.0.0.0:9090
mysql导出数据的命令
数据库备份与恢复
mysqldump命令用于备份数据库数据
[root@master ~]# mysqldump -u root -p --all-databases > /tmp/db.dump
2.导出db1、db2两个数据库的所有数据
mysqldump -uroot -proot --databases db1 db2 >/tmp/user.sql


部署步骤并不难,做好笔记,按照流水线来操作即可
vue前后端分离的部署,难度会+1
virtualenvwrapper是吧,那个是virtualenv的升级版,用哪个都一样,都是创建多个虚拟环境
virtualenv不支持查看所有虚拟环境,virtualenvwrapper支持,是 lsvirtualenv命令
uwsgi启动python web
让你的django在linux上,支持并发形式启动,支持多进程,多线程,乃至于协程的一个C语言编写的高性能工具
1.安装uwsgi工具
pip3 install -i https://pypi.douban.com/simple uwsgi
2.编写uwsgi.ini配置文件,以多进程形式启动luffy_crm
cd /opt/luffy_crm 下创建 uwsgi.ini文件, touch uwsgi.ini #手动创建此uwsgi的配置文件,写入如下的内容参数,去启动crm
# 写入如下的功能性的参数配置,用于启动项目
# 这些部署的流程,是国外的uwsgi官网,给与的用法,我们照着用即可
# 注意要根据你自己的目录,修改如下的参数
[uwsgi]
# Django-related settings
# the base directory (full path)
# 1.填写crm项目的第一层绝对路径
chdir = /opt/luffy_crm
# Django's wsgi file
# 2.填写crm项目第二层的相对路径,找到第二层目录下的wsgi.py
# 这里填写的不是路径,是以上一个参数为相对,找到第二层项目目录下的wsgi.py文件
module = luffy_crm.wsgi
# the virtualenv (full path)
# 3.填写虚拟环境解释器的第一层工作目录
home = /opt/luffy_crm/venv_crm
# process-related settings
# master
master = true
# maximum number of worker processes
# 代表定义uwsgi运行的多进程数量,官网给出的优化建议是 2*cpu核数+1 ,单核的cpu填写几?
# 如果是单进程,十万个请求,都丢给一个进程去处理
# 4.分配3个工作进程,十万个请求,就分给了3个进程去分摊处理
processes = 3
# the socket (use the full path to be safe
# 这里的socket参数,是用于和nginx结合部署的unix-socket参数,这里临时先暂停使用
# socket = 0.0.0.0:8000
# 线上不会用http参数,因为对后端是不安全的,使用socket参数是安全的连接,用nginx反向代理去访问
# 后端程序是运行在防火墙内部,外网是无法直接访问的
# 临时使用http参数,便于我们用浏览器调试访问
http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
3.此时可以用命令,基于uwsgi协议的一个高性能web后端启动了
uwsgi --ini ./uwsgi.ini #指定配置文件启动后端
4.此时crm项目,已经用uwsgi支持了3个进程的启动了,但是由于uwsgi对静态文件的解析性能很弱,线上是丢给nginx去处理的
5.未完待续。。。留在部署时候再讲

supervisor工具
目前你所学的linux技能,对crm的进程进行管理,启停
ps -ef | grep python3
ps -ef | grep uwsgi 检查uwsgi的进程,确认django是否存活,假如检测到pid是 5999
停止uwsgi,kill -9 5999 杀死主进程
pkill -9 uwsgi 杀死uwsgi进程组
检测uwsgi如果挂掉之后,自动帮你重启
使用supervisor这个python开发的进程管理工具,用它启动uwsgi之后,uwsgi进程挂掉后,自动会再启动
比如,crm的部署技术栈
nginx+uwsgi+django+mysql ,我们可以手动的,单独启动每一个进程
还可以通过supervisor一键启动这四个进程,进行批量管理,批量启停 ,很好用
安装supervisor工具
1.使用yum命令即可直接安装
[root@s25linux ~]# yum install supervisor -y
2.生成supervisor的配置文件
[root@s25linux ~]# echo_supervisord_conf > /etc/supervisord.conf
3.修改supervisor的配置文件,添加管理crm的任务
vim /etc/supervisor.conf #再最底行,添加如下内容
#[program:xx]是被管理的进程配置参数,xx是进程的名称
[program:s25crm]
command=写入启动uwsgi的命令 ;supervisor其实就是在帮你执行命令而已!
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
master--工头进程,主人进程--突然工头挂了..
worker---主进程突然挂了,工作进程就变为了僵尸进程,
worker
worker
因此,杀死uwsgi,需要向这个进程组,发送终止信号,杀死一组进程
linux系统使用uwsgi部署crm(完整版)👍
1.编译安装好python3的开发环境
讲师机器环境是:/opt/python369/bin/python3
以及pip3的绝对路径:/opt/python369/bin/pip3
2.生成一个新的虚拟环境,去运行crm,以及uwsgi
pip3 install -i https://pypi.douban.com/simple virtualenv #安装虚拟环境工具
通过命令生成新的虚拟环境
virtualenv --python=python3 venv_crm_again
[root@s25linux opt]# source venv_crm_again/bin/activate
(venv_crm_again) [root@s25linux opt]# echo $PATH
/opt/venv_crm_again/bin:/opt/python369/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin::/root/bin
3.在虚拟环境下,安装,crm所需的模块信息
pip3 install -i https://pypi.douban.com/simple -r requirements.txt
#此模块依赖文件的信息,如下,大家也可以手动的复制粘贴,也可以~~~
(venv_crm_again) [root@s25linux tf_crm]# cat requirements.txt
Django==1.11.25
django-multiselectfield==0.1.11
PyMySQL==0.9.3
pytz==2019.3
uWSGI==2.0.18
4.模块依赖解决了,检查你是否需要修改crm项目的settings.py
修改如下参数ALLOWED_HOSTS = ["*"]
5.注意需要启动mysql,提前配置好yum源,阿里云的yum源,如果下载过慢,怎么办?
择优dns选择,不同的dns服务器,解析速度也有快慢之分,就好比移动,联通信号由快慢一样
可以在腾讯,阿里云,114的dns服务器之间做选择
dns劫持,dns被人劫持了,你访问baidu.com ,强制给你解析到某恶意网站的ip上,因此浏览器看到不一样的内容了
#填入2个阿里的dns服务器地址
vim /etc/resolv.conf
nameserver 223.5.5.5
nameserver 223.6.6.6
yum install mariadb-server mariadb -y
#启动mysql
systemctl start mariadb
systemctl status mariadb
#从windows中导出数据
mysqldump -uroot -p --database tf_crm > tf_crm.sql #这个命令是在cmd命令行敲的!!!!
#发送此sql文件,给linux,进行数据导入
mysql -uroot -p tf_crm < tf_crm.sql #数据导入的命令,注意,你linux的机器,得提前创建tf_crm库!!
6.尝试调试crm,是否能够运行
python3 manage.py runserver 0.0.0.0:7777 #可以查看到页面后,表示此项目可以用uwsgi部署了
7.下载安装uwsgi工具,写好uwsgi.ini配置文件
pip3 install -i https://pypi.douban.com/simple uwsgi -y
touch uwsgi.ini #写入如下内容
[uwsgi]
# Django-related settings
# the base directory (full path)
# 填写crm项目的第一层绝对路径
chdir = /opt/tf_crm/
# Django's wsgi file
# 填写crm项目第二层的相对路径,找到第二层目录下的wsgi.py
# 这里填写的不是路径,是以上一个参数为相对,找到第二层项目目录下的wsgi.py文件
module = tf_crm.wsgi
# the virtualenv (full path)
# 填写虚拟环境解释器的第一层工作目录
home = /opt/venv_crm_again
# process-related settings
# master
master = true
# maximum number of worker processes
# 代表定义uwsgi运行的多进程数量,官网给出的优化建议是 2*cpu核数+1 ,单核的cpu填写几?
# 如果是单进程,十万个请求,都丢给一个进程去处理
# 3个工作进程,十万个请求,就分给了3个进程去分摊处理
processes = 3
# the socket (use the full path to be safe
# 这里的socket参数,是用于和nginx结合部署的unix-socket参数,这里临时先暂停使用
# socket = 0.0.0.0:8000
# 线上不会用http参数,因为对后端是不安全的,使用socket参数是安全的连接,用nginx反向代理去访问
# 后端程序是运行在防火墙内部,外网是无法直接访问的
# 临时使用http参数,便于我们用浏览器调试访问
http = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true

接着上面的笔记
8.uwsgi和uwsgi.ini都配置完毕之后,开始使用supervisor工具进行管理了
先明确,启动uwsgi的绝对路径命令是什么
8.1 找到uwsgi的绝对路径 /opt/venv_crm_again/bin/uwsgi
8.2 找到uwsgi.ini的绝对路径 /opt/tf_crm/uwsgi.ini
8.3 因此 启动 crm项目的 完整绝对路径命令是
/opt/venv_crm_again/bin/uwsgi --ini /opt/tf_crm/uwsgi.ini
9.修改supervisor的配置文件
vim /etc/supervisord.conf #写入如下
[program:s25crm]
command=/opt/venv_crm_again/bin/uwsgi --ini /opt/tf_crm/uwsgi.ini ;supervisor其实就是在帮你执行命令而已!
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
10.启动supervisor,默认就会直接启动uwsgi了
supervisord -c /etc/supervisord.conf #启动supervisor服务端,指定配置文件启动
启动完毕supervisor之后,检查进程信息
ps -ef|grep supervisor #检查supervisor是否存在了进程,是否启动
ps -ef|grep uwsgi #检查uwsgi是否启动
11.进度supervisor任务管理终端
看到如下的结果,表示你自定义的任务s25crm,也就是uwsgi进程,正确的启动了
supervisorctl -c /etc/supervisord.conf
(venv_crm_again) [root@s25linux tf_crm]# supervisorctl -c /etc/supervisord.conf
s25crm RUNNING pid 41451, uptime 0:01:34
supervisor>
12.看到了没有静态文件的 crm界面,就是正确的了
13.supervisorctl的管理命令
提供了如下命令
(venv_crm_again) [root@s25linux tf_crm]# supervisorctl -c /etc/supervisord.conf
s25crm RUNNING pid 41451, uptime 0:01:34
supervisor>
supervisor>start s25crm
supervisor>stop s25crm
supervisor>status
supervisor>start all
supervisor>stop all
14.uwsgi异常崩溃的话,supervisor会立即重启uwsgi
15.如果要运行多个 uwsgi项目,在supervisor中定义多个任务即可

nginx学习
需要装2个虚拟机
nginx 官方nginx
tenginx 淘宝nginx
这2个一模一样,淘宝的nginx,官方文档更详细
小提示: 如果你想删除 编译安装的软件 1,清空PATH 2,删除文件夹即可
注意,编译软件之前,还是需要解决系统的开发环境,例如如下
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 openssl openssl-devel -y
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:"
source /etc/profile
8.首次启动nginx,注意要关闭防火墙
直接输入nginx命令即可启动
有关nginx的命令
nginx #首次输入是直接启动,不得再次输入
nginx -s reload #平滑重启,重新读取nginx的配置文件,而不重启进程
nginx -s stop #停止nginx进程
nginx -t #检测nginx.conf语法是否正确
9.默认访问nginx的首页站点url是
http://192.168.178.140:80/index.html
nginx的配置文件
nginx的配置文件是c语言的代码风格
以; 号 表示每一行配置的结束
nginx.conf中 是以代码块形式 编写的
例如 主要的几个代码块
http{ } #里面定义了多个代码,是nginx的核心功能配置点
server{ } #虚拟主机代码块,定义了网站的目录地址,以及首页文件名字,监听的端口,等等功能
location { } #域名匹配代码块。。

nginx.conf 注释如下:
#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;
}
}
}
nginx的web站点功能
也称之为是nginx的虚拟主机站点配置
指的就是在nginx中,能够通过文件目录的不同,可以定义多个不同的网站
修改nginx的首页内容,你们信不信我,一分钟做出一个dnf(腾讯的游戏官网)的官网~ 相信的扣1,觉得我在吹牛皮的,扣2
1.如何修改nginx的首页地址,进入html目录下,找到index.html文件,默认读取的是这个文件
[root@s25linux html]# pwd
/opt/tngx232/html
[root@s25linux html]# ls
50x.html index.html
2.在自己的站点下,存放一些静态资料,如gif,jpg等
[root@s25linux html]# ls
50x.html 55kai.jpg index.html s25.html

nginx的多站点功能

- 基于域名的多虚拟主机
修改hosts文件,强制写入域名对应关系,比较麻烦
- 基于端口的多虚拟主机
1.修改nginx.conf配置如下,定义2个server{} 区域块即可
第一个虚拟主机的配置
# 目前这里是第一个server {} 区域块,端口是85
server {
# 定义该网站的端口
listen 85;
#填写域名,没有就默认即可
server_name localhost;
#更改nginx的编码支持
charset utf-8;
#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;
}
}
改完配置文件后,分别创建2个站点的资源目录
[root@s25linux conf]#
[root@s25linux conf]# mkdir /s25linux /s25python
[root@s25linux conf]#
[root@s25linux conf]#
[root@s25linux conf]# echo "i like linux ,i very happy" > /s25linux/index.html
[root@s25linux conf]#
[root@s25linux conf]#
[root@s25linux conf]# echo "i use python,i very nb" > /s25python/index.html
#注意,改了配置文件,一定要平滑重启,否则不生效
[root@s25linux conf]# nginx -s reload
#此时分贝访问2个站点,即可看到2个站点的资料
192.168.178.140:85
192.168.178.140:85
nginx的404页面优化
如果nginx不做404优化,那么页面是非常丑的。。
1.修改nginx.conf,修改一行参数即可
server {
# 定义该网站的端口
listen 85;
#填写域名,没有就默认即可
server_name localhost;
#更改nginx的编码支持
charset utf-8;
# 如此添加一行参数,当用户请求出错,出现404的时候,就返回 root定义的目录去寻找40x.html文件
# 讲师机器的配置,也就是去 /s25python/ 这个目录下 寻找 40x.html
error_page 404 /40x.html; #注意别忘了分号
......
手动创建一个40x.html,咱们也可以去网上搜索404的html模板,修改此40x.html即可
[root@s25linux conf]# cat /s25python/40x.html
<meta charset=utf8>
我是自定义的404页面,你看我美不美...
注意还得重启nginx
nginx -s reload
Nginx的访客日志
nginx的方可日志,能够记录,分析用户的请求行为
-什么时间点,访问的最频繁,比如路飞的网站,网站的流量,基本都在晚上,学生下了班,在线学习各种技术
-记录用户的请求频率,以此检测是否是爬虫等恶意请求,进行封禁。
-检测躲在代理ip后的 真实用户ip
-检测用户ip,请求时间,请求的url内容,等等。。。。
如何配置日志呢
修改nginx.conf 在 http{}代码块中,打开如下注释即可
#打开此nginx的访问日志功能,即可查看日志
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#如果25期所有学生,在班级,同时访问路飞官网
# nginx日志检测到的ip地址是一样,还是不一样的?
# 答案是一样的,因为大家都从同一路由器转发出去的公网
# 我们都是通过同一个宽带运营商提供的公网ip和路飞通信的
access_log logs/access.log main;
日志变量解释
$remote_addr 记录客户端ip
$remote_user 远程用户,没有就是 “-”
$time_local 对应[14/Aug/2018:18:46:52 +0800]
$request 对应请求信息"GET /favicon.ico HTTP/1.1"
$status 状态码
$body_bytes_sent 571字节 请求体的大小
$http_referer 对应“-” 由于是直接输入浏览器就是 -
$http_user_agent 客户端身份信息,以此可以nginx判断,用户客户端是手机浏览器,就转发移动端页面给与用户如果是pc的客户端,就转发给pc页面给与用查看
$http_x_forwarded_for 记录客户端的来源真实ip 97.64.34.118,机器A用机器B的ip去访问,可以抓出机器A的地址,这个参数不是万能的,爬虫和反扒是相互的
重启nginx -s reload
实时监测访客日志的信息
tail -f logs/access.log
nginx反向代理


正向代理,,代理服务器,代理的是客户端
反向代理,,代理服务器,,代理的是服务端
反向代理,实验配置
讲道理,需要准备2台linux服务器
192.168.178.134
192.168.178.140

考虑到咱们同学的笔记本,安装2个虚拟机会比较卡,
因此决定用如下的方案,很巧妙,用到了nginx支持的多虚拟主机功能
准备1台机器即可
如192.168.178.140 ,基于端口的不同,运行不同的站点
1.准备一台linux机器,安装好nginx之后,,修改nginx.conf如下,配置好2个server{}标签
第一个server{}标签,用于反向代理的作用,修改nginx.conf如下
# 第一个虚拟主机的配置,作用是反向代理了
#
server {
listen 80;
server_name localhost;
charset utf-8;
error_page 404 /40x.html;
# 这里的locaiton 路径匹配,如果你写的是root参数,就是一个web站点功能
# 如果你写的是proxy_pass参数,就是一个请求转发,反向代理功能
location / {
#当请求发送给 192.168.178.140:80的时候
#直接通过如下的参数,转发给90端口
proxy_pass http://192.168.178.140:90;
}
}
第二个server{}标签,作用是返回机器上的资料,也就是一个web站点的功能
#第二个虚拟主机,作用是web站点功能,资源服务器,提供页面的
server {
listen 90;
server_name _;
#当请求来到 192.168.178.140:90的时候,就返回/s25proxy目录下的index.html
location / {
root /s25proxy/;
index index.html;
}
}
创建资源文件夹,以及html页面内容
[root@s25linux conf]# cat /s25proxy/index.html
<meta charset=utf8>
我是资源服务器,我是192.168.178.140 的90端口
重启nginx
nginx -s reload
测试访问代理服务器,查看页面效果

反向代理对于项目部署的意义

nginx负载均衡



nginx负载均衡实验的搭建,修改nginx.conf如下
第一个虚拟主机server{}的作用,是反向代理,80端口
# 用upstream关键词定义负载均衡池,写入资源服务器的地址
# 负载均衡的算法,默认是轮询机制,一台服务器处理一次
upstream s25real_server {
server 192.168.178.140:90;
server 192.168.178.140:95;
}
server {
listen 80;
server_name localhost;
charset utf-8;
error_page 404 /40x.html;
# 这里的locaiton 路径匹配,如果你写的是root参数,就是一个web站点功能
# 如果你写的是proxy_pass参数,就是一个请求转发,反向代理功能
location / {
#当请求发送给 192.168.178.140:80的时候
#直接通过如下的参数,转发给90端口
proxy_pass http://s25real_server;
}
}
第二个server{}标签的配置,作用是提供资源给用户看的,90端口
#第二个虚拟主机,作用是web站点功能,资源服务器,提供页面的
server {
listen 90;
server_name _;
#当请求来到 192.168.178.140:90的时候,就返回/s25proxy目录下的index.html
location / {
root /s25lol/;
index index.html;
}
}
第三个server{}标签的作用,同样是返回资源页面,查看负载均衡效果的,95端口
#第三个server{}虚拟主机,作用是 提供资源服务器的内容的
server {
listen 95;
server_name _;
location / {
root /s25dnf/;
index index.html;
}
}
此时分别准备2个资源服务器的内容
准备好 /s25lol/index.html
准备好 /s25dnf/index.html
最终访问效果如下

负载均衡实验原理图

nginx负载均衡算法
1.默认是轮询机制,每台服务器处理一次
2.加权轮询,修改nginx.conf如下,给与机器不同的权重
upstream s25real_server {
server 192.168.178.140:90 weight=4;
server 192.168.178.140:95 weight=1;
}
django项目部署
crm纯后端部署
supervisor+nginx+uwsgi+django+virtualenv+mariadb
crm部署流程
crm是通过模板语言进行和前端通信的 ,前端代码写在后端中
{{static.el}}


如何停止supervisor以及uwsgi
1.必须得先停止supervisor才可以停止uwsgi
pkill -9 supervisor
2.杀死uwsgi
pkill -9 uwsgi
kill命令,是基于pid杀死进程,如 kill 5888
pkill命令, 是基于进程的名字 杀死进程 pkill uwsgi
crm部署的史上最详细的流程部署笔记
#先从后端搞起 uwsgi+crm进行项目运行
老师电脑的环境变量
PATH="/opt/python369/bin:/opt/tngx232/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:"
1.先创建虚拟环境,用于运行crm
(s25_crm) [root@s25linux s25crm]#
2.上传代码到linux中,调试项目是否能够运行
pip3 install -i https://pypi.douban.com/simple django==1.11.25
pip3 install -i https://pypi.douban.com/simple pymysql
pip3 install -i https://pypi.douban.com/simple django-multiselectfield
3.在调试好crm的模块依赖,以及mariadb数据库的安装,以及数据导入之后(数据导入出错了,基本事sql文件的问题,单独找我),crm调试可以正确运行了
4.在线上,是使用uwsgi结合uwsgi.ini配置文件,启动crm的,因此 ,启动方式如下
pip3 install -i https://pypi.douban.com/simple uwsgi #安装uwsgi
#今日的线上部署,uwsgi.ini需要修改的地方是,添加如下参数,关闭http参数
#今日的线上部署,uwsgi.ini需要修改的地方是,添加如下参数,关闭http参数
#今日的线上部署,uwsgi.ini需要修改的地方是,添加如下参数,关闭http参数
# 这里的socket参数,是用于和nginx结合部署的unix-socket参数,这里临时先暂
停使用
# 使用此协议运行后台,就无法通过浏览器访问了,协议不一样
socket = 0.0.0.0:8000
# 线上不会用http参数,因为对后端是不安全的,使用socket参数是安全的连接>,用nginx反向代理去访问
# 后端程序是运行在防火墙内部,外网是无法直接访问的
# 临时使用http参数,便于我们用浏览器调试访问
#http = 0.0.0.0:8000
5.使用supervisor启动uwsgi进程,需要修改supervisord.conf配置文件了,看好文件的名字!!!!
vim /etc/supervisord.conf #修改如下参数
[program:again_s25crm]
command=/s25crm/s25_crm/bin/uwsgi --ini /s25crm/tf_crm/uwsgi.ini
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
stopasgroup=true ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=true ;默认为false,向进程组发送kill信号,包括子进程
6.检查后台的状态,以及启动命令
【但凡supervisor这里无法正常启动,立即去检查 supervisord.conf里面定义的任务参数是否正确】
(s25_crm) [root@s25linux tf_crm]# supervisord -c /etc/supervisord.conf
Unlinking stale socket /tmp/supervisor.sock
(s25_crm) [root@s25linux tf_crm]# supervisorctl -c /etc/supervisord.conf
again_s25crm STARTING
supervisor>
supervisor>
supervisor> status
again_s25crm STARTING
supervisor> status
again_s25crm RUNNING pid 64285, uptime 0:00:13
7.此时配置好nginx.conf就完事了,修改如下,配置nginx,请求转发给后台即可
server {
listen 80;
server_name localhost;
#这是一个局部的变量,只对当前这个server{}代码块生效,编码设置为utf-8
charset utf-8;
error_page 404 /40x.html;
# 这里的locaiton 路径匹配,如果你写的是root参数,就是一个web站点功能
# 基于uwsgi协议的一个高性能的反向代理转发,新的参数
location / {
#当请求发送给 192.168.178.140:80的时候
#通过uwsgi_pass把请求转发给后端的uwsgi服务器
uwsgi_pass 0.0.0.0:8000;
#这个参数,是固定的,是添加一些转发请求头内容
include uwsgi_params;
}
#这个配置的意义就是当请求的url是192.168.178.143/static/js
# 192.168.178.143/static/css
# 如此之类以/static开头的url,都告诉nginx,去linux的/s25static目录下寻找静态文件
location /static {
alias /s25static;
}
}
8.重启nginx
nginx -s reload
8.1 此时发现静态文件丢失,例如如下的静态文件
http://192.168.178.143/static/js/common.js
http://192.168.178.143/static/css/style.css
http://192.168.178.143/static/js/jquery.validate.min.js
9.还得配置nginx接收所有的django静态文件,修改命令如下
第一步:修改django的配置文件,收集所有的静态文件,放入一个统一管理的目录
vim settings.py #添加如下内容
STATIC_ROOT='/s25static/' #作用是定义一个统一管理的目录,收集所有crm的静态文件
第二步:用命令收集静态文件
python3 manage.py collectstatic
10.通过nginx去找到如下的静态文件即可
在nginx.conf文件中加入如下配置:
location /static {
alias /s25static;
}

nginx找到crm的静态文件原理图



浙公网安备 33010602011771号