Fork me on GitHub

Linux

linux介绍

Linux运维人员的核心职责

对于初创型的小公司,陌陌公司刚起步,交友,用户量很少,网站并发数也很低

开发架构不能太复杂,必须招来一个专业的运维,并且可能会影响开发进度,开发难度

选择网站的黄金架构LNMP

(Linux+Nginx+Mysql+PHP/Perl/Python)

  • 网站数据不能丢,学习mysql的主从复制,MHA高可用容灾技术

    • Redis(缓存性数据库,新浪的微博评论,点赞,都存储在redis中)
    • redis内存性数据库,断电丢失,重启进程数据丢失
      • redis的主从复制(一主一备用服务器)
      • redis数据持久化来做(将内存数据库写入到磁盘上)
      • redis哨兵(等待后续揭晓..)
  • 网站7*24小时运转

    • 搭建监控系统,开发监控平台
    • 出了问题,立即打电话,发邮件,发微信,告诉运维,起来修电脑!
  • 提升用户体验,访问速度要快

    • 运维对于网站架构的优化

windows,mysql(突然嗝屁)

Linux就是一个操作系统

1.买一台硬件服务器,必须得有一个机器

(开发你得考虑,程序在机器上运行,消耗的内存,cpu等资源,IO吞吐量是否正常)

2.在这个机器上安装操作系统

告诉我,你的笔记本外观有什么?

  • 屏幕,显示屏,输出设备
  • 键盘,输入设备,用于数据输入的
  • 触摸板,输入设备
  • 各种借口,电源接口,USB借口
  • touch bar,使用的mac触摸屏
  • 光驱,安装操作系统,读取DVD资料的
  • 摄像头
  • 音箱

笔记本的内部有什么?(对于系统速度的提升,优化都是扯淡,花钱就能解决所有的问题,先从硬件角度考虑)

  • 硬盘,数据存储的,(SATA类型的机械硬盘,和SSD固态硬盘,对于数据的IO,哪个快?SSD胜出)
  • 主板,将各种硬件设备,组装在一起的,以及BIOS主板系统的安装
  • 内存条

一个纯python后台的应用,odoo,写的一平台,性能测试预计有5W的并发

由于新业务来到,并发超过5W了,后台吃撑不住了,出现大量的500报错

单纯的用uwsgi+odoo,运行的后台

  • 在网站前面挂一个中间层,nginx(负载均衡,动静态请求分发,支持大并发的一个软件)

  • 服务器内存使用量以及达到 80%以上

    • 扩大服务器内存16*2=32GB ,网站处理后台,立马正常了

    • 为什么资源消耗这么多?

      • 内存泄漏,with open 自动关闭文件句柄 ,释放内存

      • 用户请求- > 后台 -> 人脸识别登录功能,数据发给了百度的API -> 后台响应,识别是否通过

      • 照片数据放在一个变量当中

      • 在代码的结尾,没有人在使用这个变量了,

      • pic=' ' 将变量等于了一个空字符串 ,内存泄漏立马被解决了,照片数据被python自动gc回收了

常见的状态码,status code有哪些

  • 404 40x系列,客户端的请求报错,请求的url可能不存在,或者过期了
  • 302 30x系列,客户端的请求重定向,www.pythonav.cn 更换域名了,跳转到新域名www.pythonav.com
    • 浏览器的URL是会发生变化的
  • 503 50x 系列,指的是服务端代码出错,服务端处理请求出问题了
  • 200 20x系列,请求正确的被响应了
  • 100 100系列,临时响应

服务器

服务器是在网络中对外提供服务的,一个超强性能的计算机(更稳定,更安全,安装linux系统)

区别在于数据的安全性。

云计算的概念

1.你们家中所用的水资源、电力资源,煤气资源,从哪来的?

我们百姓都是花钱,从水厂,电厂,煤气厂,按量购买的资源

水厂、电厂等,将所有的水利资源,电力资源,集中到了一起,进行按量贩卖

计算机角度:

阿里,腾讯,华为等公司,购买了大量的实体服务器,组成了一个超大的计算机资源池,然后按量贩卖

在阿里云的后台,50元/月 购买 1G1核 50G磁盘的服务器

对于初创型公司(路飞学城):

8台阿里云

本金比较少,购买云服务器即可,(数据并不安全,你的数据都掌握在别人的手里)

对于中等规模公司,马蜂窝,知乎等:

购买自己的硬件服务器(服务器价格也不低),需要运行在零度、无尘、无湿度的一个环境(防止服务器发热,防止短路,静电)

中等公司会把自己的服务器,托管在一个专业的机房中心(世纪互联,有自己的园区,专门打造服务器运行环境的)外面的公司,就得花钱租赁机器托管的位置

大型公司,BAT,苹果公司,特别有钱

云上贵州,买了一块地,打造了一个数据中心(苹果公司的服务器都在这了)

uptime命令 ,检查服务器运行了多久 ,3700 days

一个公司的技术栈架构

外企,500强的外企

收费版的技术栈:
java +  oralce + jquery +  svn + mencached + redhat(收费版的linux,考rhce rhca资格证书)

省钱的技术栈,开源的技术栈:
java + python + jquery  + git + redis  + centos (免费版的redhat)

服务器环境是 
dell 28台硬件服务器,dell poweredger  R720型号 
通过vmware  esxi虚拟化技术,创建出了260+个数的linux系统 


windows  +  vmware  workstation(个人学习版,性能较弱,N多个虚拟机)

云服务器(阿里云,腾讯云)

自然灾害,云服务器

物理服务器(自己购买一台实体的计算机,安装linux系统)

机房托管

服务器是按照厚度收管理费的,机器厚度 以U为单位

知道什么是服务器之后,就得开始学习什么是Linux了

走进Linux的大门

机器就是一堆冷冰冰的硬件

需要安装操作系统之后,才有灵魂

python操作linux的模块是什么?

os模块

subprocess

shell壳的作用

老王学习python,在cmd里面写入了一段代码 print("隔壁的小孩长得越来越像我...")

交给python翻译官

解释成机器码

机器认识这一段话的作用,开始执行,然后 输出给用户


用户在命令行敲下 ls cd mkdir 这些linux的命令,计算机也是不认识的

shell(linux下的bash脚本语言的解释器,翻译官)

翻译给机器,去执行

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   ./*  #强制性删除当前目录下的所有内容 

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

vm开机没有ip怎么办

埋下伏笔。。。

是需要修改网卡配置文件的(还没学vim 文本编辑器命令)

获取ip的步骤 如下

1.vim编辑网卡配置文件,修改如下参数
[root@s25linux tmp]# cd  /etc/sysconfig/network-scripts/
vim修改此文件,找到如下参数,改为yes
ONBOOT="yes"

2.确保vmware 正确选择了 桥接 或是NAT,且已经连接上了

3. 命令重启网络设置

systemctl stop NetworkManager #关闭无线网络服务
systemctl restart network   	#重启有线网服务 
#这2个命令执行都没有任何提示,表示正确的重启了网络配置

4.此时查看ip地址是否存在了

ip addr show 

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/

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编辑器的用法

  • 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文件夹得存在)

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目录下所有的python相关内容
[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    # -i 忽略大小写

#过滤出此文件非空白行,如何操作?
拆解如下
找出所有的空白行 
[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行的内容,今天的作业练习

scp命令

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

环境准备,准备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 命令用于显示目录活文件的大小

用法
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是支持正则表达式的

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,添加读的权限 user+read
chmod  g-x  file.txt  #给文件的group组权限,去掉可执行 group-x
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
nameserver 223.5.5.5


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 https://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

Linux关于python3开发环境

linux下python3环境搭建

linux安装软件有哪些方式?

  • rpm软件包 手动安装,拒绝此方式,需要手动解决依赖关系
  • yum自动化安装,自动处理依赖关系,非常好用
  • 源代码编译安装,可自定义的功能更多,指定软件安装路径
  • 二进制源代码下载,此软件已经被编译安装过,生成了可执行的文件
    • 下载压缩包后,直接解压缩即可使用
编译安装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 
wget  https://www.python.org/ftp/python/3.9.0/Python-3.9.0.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(request):
      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.出现无法访问的问题,要根据报错去思考,到底是什么问题
 网站直接是白屏,白花花什么都看不见,

照着笔记,完成python3和django环境的搭建,运行出页面 “s25期的靓仔们很强”

linux编译安装软件的步骤

1.获取软件的源代码,去官网下载最新的,或者指定版本
2.解压缩源代码
3.进入源代码目录,开始编译三部曲,指定安装路径,make,make install
4.软件编译安装结束后,配置PATH环境变量,能够便捷的访问命令

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,也就表示退出了

激活虚拟环境的原理图

利用了虚拟环境,可以分别运行多个干净、隔离的python web环境

保证开发环境,生产环境python模块一致性

软件开发的环境

小公司,服务器环境可能没那么严格(本地开发人员+测试环境+线上环境)

大公司,(本地环境+测试环境+预生产环境+线上环境)

Python web开发组

  • 开发环境(windows,macOS,ubuntu,本地开发代码的一个环境),装python3 pip3项目依赖的模块
    • python3环境
    • mysql环境
    • redis环境
    • vue
    • nginx
  • 测试服务器,代码测试bug,以上的环境,还得再搭一遍,测试服务器才能运行项目

  • 线上服务器,还得环境搭建一遍,,,,很难受。。

如何解决环境问题?

  1. 虚拟机的模板克隆,打包好一个基础开发环境,克隆多份,生产多个部署环境
  2. 利用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

3.立即解决crm运行所需的模块依赖
pip3 freeze > requirements.txt  
上传至linux服务器
在venv_crm虚拟环境中,安装此文件即可
pip3 install -i https://pypi.douban.com/simple  -r  requirements.txt 

如果没有此模块依赖文件,那么就手动解决吧,。。。。
此时你要注意
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

WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求)
基于wsgi运行的框架有bottle,DJango,Flask,用于解析动态HTTP请求
支持WSGI的服务器
    wsgiref
        python自带的web服务器
    Gunicorn
        用于linux的 python wsgi Http服务器,常用于各种django,flask结合部署服务器。
    mode_wsgi
        实现了Apache与wsgi应用程序的结合
    uWSGI
        C语言开发,快速,自我修复,开发人员友好的WSGI服务器,用于Python Web应用程序的专业部署和开发。

在部署python程序web应用程序时,可以根据性能的需求,选择合适的wsgi server,不同的wsgi server区别在于并发支持上,有单线程,多进程,多线程,协程的区别,其功能还是近似,无非是请求路由,执行对应的函数,返回处理结果。


Django部署

Django的主要部署平台是 WSGI,这是用于Web服务器和应用程序的Python标准。

Django的 startproject管理命令设置一个简单的默认WSGI配置,可以根据需要为您的项目进行调整,并指示任何符合WSGI的应用程序服务器使用。

application 
使用WSGI部署的关键概念是应用程序服务器用于与代码通信的 application 可调用。它通常在服务器可访问的Python模块中作为名为 application 的对象提供。

startproject 命令创建包含这样的 application 可调用的文件 <project_name>/wsgi.py. ,它被Django的开发服务器和生产WSGI部署使用。
WSGI服务器从其配置中获取 application 可调用的路径。 Django的内置服务器,即 runserver 命令,从 WSGI_APPLICATION 设置读取它。
1 首先nginx 是对外的服务接口,外部浏览器通过url访问nginx,

2nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,

如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

3要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况

1 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。

2负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。

3静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。

让你的django在linux上,支持并发形式启动,支持多进程,多线程,乃至于协程的一个C语言编写的高性能工具

1.安装uwsgi工具
pip3 install -i https://pypi.douban.com/simple  uwsgi

2.编写uwsgi.ini配置文件,以多进程形式启动tf_crm
touch uwsgi.ini  #手动创建此uwsgi的配置文件,写入如下的内容参数,去启动crm
# 写入如下的功能性的参数配置,用于启动项目
# 这些部署的流程,是国外的uwsgi官网,给与的用法,我们照着用即可
# 注意要根据你自己的目录,修改如下的参数

[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/tf_crm/venv_crm
# 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


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 

#检测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信号,包括子进程

supervisord.conf配置文件参数解释

supervisord.conf配置文件参数解释
[program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=tomcat          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为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 {  }  #域名匹配代码块。。

####比喻代码块的含义
def  hello():
	 我是缩进,被hello这个函数 控制
	 我们都是缩进内的代码块。。。
	 

func hello(){
		我们都是在花括号内的代码。。
		我们是各改代码块。。。。
}	 

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 {
	#设定mime类型,类型由mime.type文件定义
    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"';
    #$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
    #$remote_user:用来记录客户端用户名称;
    #$time_local: 用来记录访问时间与时区;
    #$request: 用来记录请求的url与http协议;
    #$status: 用来记录请求状态;成功是200,
    #$body_bytes_sent :记录发送给客户端文件主体内容大小;
    #$http_referer:用来记录从那个页面链接访问过来的;
    #$http_user_agent:记录客户浏览器的相关信息;
    
    
	#全局访问日志路径 (查看用户访问记录)
    access_log  logs/access.log  main;
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设	 为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系uptime。
   
   
    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文件,强制写入域名对应关系,比较麻烦
server {
     listen 80;
     server_name www.abc.com;
     location / {
     root html/abc;
     index index.html index.htm index.php;
     }
}
server {
     listen 80;
     server_name www.cbd.com;
     location / {
     root html/cbd;
     index index.html index.htm;
     }
}
  • 基于端口的多虚拟主机
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:89

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 

实时监测访客日志的信息

⽇志格式

Nginx访问⽇志主要有两个参数控制
1) log_format #⽤来定义记录⽇志的格式(可以定义多种⽇志格式,取不同名字即可)
 
log_format log_name string
2) access_log #⽤来指定⽇⾄⽂件的路径及使⽤的何种⽇志格式记录⽇志
 
access_log logs/access.log main;

Log_format格式变量

log_format格式变量:
 $remote_addr #记录访问⽹站的客户端地址
 $remote_user #远程客户端⽤户名
 $time_local #记录访问时间与时区
 $request #⽤户的http请求起始⾏信息
 $status #http状态码,记录请求返回的状态码,例如:200、301、404等
 $body_bytes_sent #服务器发送给客户端的响应body字节数
 $http_referer #记录此次请求是从哪个连接访问过来的,可以根据该参数进⾏防盗链设置。
 $http_user_agent #记录客户端访问信息,例如:浏览器、⼿机客户端等
 $http_x_forwarded_for #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数⽣效的前提是代理服务器也要进⾏相关的x_forwarded_for设置

⽇志⾃定义

⾃定义⽇志格式为json
# 修改日志输出内容
log_format main_json '{"@timestamp":"$time_local",'
    '"client_ip": "$remote_addr",'
    '"request": "$request",'
    '"status": "$status",'
    '"bytes": "$body_bytes_sent",'
    '"x_forwarded": "$http_x_forwarded_for",'
    '"referer": "$http_referer"'
    '}’;
# 修改日志格式
access_log logs/access_json.log main_json;

防盗链

在请求头里的referer的地址规定为我们允许的地址,否则有可能被盗链

location /images/ {
    alias /data/images/;
    valid_referers none blocked *.ayitula.com;
    if ($invalid_referer) {
        return 403;
        } 
}
# 在url里的以 .png|gif|bmp 结尾的 不满足referer规则的都过滤掉
location ~* \.(png|gif|bmp)$ { 
	valid_referers none blocked *.ayitula.com;
    if ($invalid_referer) {
        return 403;
        } 
}

nginx反向代理

反向代理
反向,代理

代理是什么?你在生活中见过那些代理的事儿?
如下的几种代理情况

海外代购
	我们再国内,想买的东西买不到,,------>  代购 ----->  国外的产品
	我们拿到东西  <-------代理(人肉拿回来,寄回来)<-------国外的产品

租房的中介

你刚来北京,要住房 ,怎么办?

找中介,支付中介费

由于房东一般很难找到,或者说不想和客户直接打交道 

超哥要租房 ------->  找到中介(只是做了一个中间人,租房请求转达给了房东) ------>房东(资源属于房东)
超哥拿到房子的钥匙<------中介(拿到资源后,转发给用户)<-------房东

直接找到房东本人的
用户----> 房东
用户<---房东

买票,黄牛这个代理

超哥想过年回家买票,,直接去12306买不着

用户买票------>找黄牛----->拿到资源
用户拿票<----黄牛<------某资源

---------
在技术领域的反向代理

正向代理,,代理服务器,代理的是客户端
反向代理,,代理服务器,,代理的是服务端

反向代理,实验配置

讲道理,需要准备2台linux服务器
192.168.178.134
192.168.178.140

image-20200219153041363

考虑到咱们同学的笔记本,安装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负载均衡实验的搭建
1.修改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;#这个节点访问比率是大于95的
        server  192.168.178.140:95 weight=1;
        }

django项目部署

对于python web后端而言,linux学习阶段,部署是最锻炼你操作,以及对linux系统的熟悉程度的

crm纯后端部署

supervisor+nginx+uwsgi+django+virtualenv+mariadb

crm部署流程笔记

crm是通过模板语言进行和前端通信的 ,前端代码写在后端中
{% static %}

如何停止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;
        }
        
        location /static {
        	alias /crmstatic;
        }

}

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找到crm的静态文件原理图

posted @ 2022-05-29 22:17  py菜鸟  阅读(141)  评论(0)    收藏  举报