浅析Linux及如何在Centos中配置django文件和需要工具

linux

13.1什么是linux

和window差不多的操作系统 :大部分开源免费

13.1.1 linux发行版本

  • Redhat工具 + GNU工具 + 文件 + Linux内核 + 库文件 = 完整的操作系统 Redhat
    CentOS 基于红帽演变
    Ubuntu 开发 / 服务器

  • Centos

  • Ubuntu 有可视化界面

13.1.2 安装

  • 使用Vmware虚拟机
    • 快照技术: 在出现问题之后,能快速修复 ( 会丢失部分数据 )
    • 克隆: 快速复刻一台虚拟机出来. ( 1.修改主机名称 2.修改IP地址 )

13.2 Bash Shell

13.2.1 Bash Shell 定义

 shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。
     shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。
登录提示符
[root@oldboy-pythonedu ~]#
		
		root: 表示当前登录Bash Shell窗口的用户是..
		oldboy-python: 当前系统的主机名称
		~: 当前用户所处的路径   ~ 表示的是当前用户的家目录
		#:  提示符  # 表示超级管理员
					$ 表示普通用户
基本语法
命令  选项  参数
ls    -l   /tmp    
Bash Shell 特性
  • tab 补全命令或路径
  • history 执行命令历史
  • alias: 别名
    • 临时操作 alias cat_network='cat /etc/sysconfig/network-scripts/ifcfg-ens32
    • 永久生效 echo “alias cat_network=‘cat /etc/sysconfig/network-scripts/ifcfg-ens32’” >> /etc/bashrc
  • unalias 临时取消别名
快捷键
ctrl + a : 命令光标跳到行首
ctrl + e : 命令光标跳到行尾
ctrl + l : 清屏
ctrl + c :中断bash窗口 前台正在运行的程序
ctrl + u : 删除光标之前的
ctrl + k : 删除光标之后的
ctrl + w : 按照单词跳转光标
ctrl + <--> : 按照单词跳转光标
文件管理
  • 目录结构:

    • window:多根 c: d: e:
    • linux : 单个 /
  • linux根目录下的文件作用

    • boot 启动时需要加载的grub菜单,内核文件
    • etc 配置文件的目录 (网卡配置,系统配置,服务配置…)
      • etc/hostname 主机名称
      • etc/sysconfig/network-scripts/ 网卡配置信息
    • dev 设备文件(光盘,硬盘…)
      • dev/random 产生随机数
      • dev/null 黑洞
    • user #C:\
      • user/local #c:\Progeam Files
      • user/bin: 普通用户执行的命令
      • user/sbin 管理管理员执行的命令
    • bin 连接关系
    • sbin 同上
    • tmp 临时目录 任何用户都可以写
    • var 日志记录 会随时间的推移发生变化
    • root 超级管理员的家目录
    • home 普通用户的家目录
    • proc 实时返回当前系统的状态,命令获取状态
    • lib 存放库文件
    • lib64 存放64位库文件
  • 创建文件 touch

    #在家目录创建一个hello.py文件
    touch /home/hello.py
    
  • 复制文件或目录 cp

    • cp -v 显示拷贝结果
    • cp -r 递归拷贝
    • -i 于cp作用相同
    #在/home下创建一个hello.py文件
    cp /home/hello.py /tmp/  #直接拷贝
    cp /home/hello.py /tmp/test.py		#拷贝后修改名称
    
  • 删除文件 rm

    • rm - f 强制删除,不提示
    • rm - r 递归删除(删除目录)
  • 查看文件内容 cat

    • cat -A 查看是否有特殊符号
    • cat -n 查看文件行号
    • head 10 文件路径 查看文件前十行
    • tail 10 文件路径 查看文件最后十行
  • 创建目录 mkdir

    • mkdir -p 递归创建
    • mkdir -v 显示创建的过程
  • 移动文件或目录

    • mv 文件路径 目标路径
  • 查照一个命令的绝对路径

    • which cat #/usr/bin/cat
    • whereis -b head head: /usr/bin/head
  • 文件的下载和上传 *(yum install wget -y)

    • rz 从本地电脑上传文件到server
    • sz 下载上传内容带服务器
    • wget 获取互联网的资源到本地
  • 文件的压缩和解压

    • 压缩是一个特殊的文件,将多个文件或目录整合在一个文件中
      • 优点:便于传输,压缩后的体积会变小
    • 压缩和打包工具:
      • window : zip tar
      • linux: zip tar.gz
    • gzip:仅针对文件
      • [root@oldboy-pythonedu ~]# gzip /etc/yum.repos.d/CentOS-Base.repo #压缩 ( 源文件不见了 )
        [root@oldboy-pythonedu ~]# zcat /etc/yum.repos.d/CentOS-Base.repo.gz #查看
        [root@oldboy-pythonedu ~]# gzip -d /etc/yum.repos.d/CentOS-Base.repo.gz
    • zip:针对文件或目录
      • [root@oldboy-pythonedu ~]# yum install zip unzip -y
        [root@oldboy-pythonedu ~]# zip -r yum_local.zip /etc/yum.repos.d/ /tmp/
        [root@oldboy-pythonedu ~]# unzip yum_local.zip -d /opt/
    • tar.gz:
      • c:创建
      • z:压缩类型
      • f:指定文件名称
      • x:自动识别文件类型
        • 创建 [root@oldboy-pythonedu ~]# tar czf etc.tar.gz /etc/ /home/
        • 解压: [root@oldboy-pythonedu ~]# tar xf etc.tar.gz
        • 指定解压路径: [root@oldboy-pythonedu ~]# tar xf etc.tar.gz -C /mnt/
用户管理
  • 能正常登录操作系统的的账号就是用户

    • 进程需要一个特定的用户的身份才可以正常的运行
    • 服务器可能会有多个用户,root的权限太大
  • 用户的分类

    • 超级管理员 root
    • 系统用户 1-999
    • 普通用户 1000+
    • 进程能够以什么样的方式去访问一个文件或目录, 取决于进程运行的 “用户身份” 对该文件或目录是否拥有对应的权限
  • 用户的查询

    • id root : [root@oldboy-pythonedu ~]# id root
      uid=0(root) gid=0(root) 组=0(root)
  • 创建用户

    • useradd oldboy
  • 创建用户的存储信息地址查询

    • cat /etc/passwd

      root​ ❌0:0:root:/root:/bin/bash
      oldboy❌1001:1001::/home/oldboy:/bin/bash

    #以冒号分割七列
    第一列:	用户名称
    第二列: 密码占位符,密码存储在  /etc/shadow 文件中
    第三列: 用户的UID
    第四列: 用户的GID
    第五列: 描述信息  commit 
    第六列: 用户的家目录
    第七列: 用户登录的Bash类型
    
  • 用户存储密码的文件

    • /etc/shadow
      root: 6 6 6QyNI5YH5XihOfDKY:18533:0:99999:7:::
  • 创建用户的参数

    • -u :指定用户UID
    • -g: 指定用户的基本组(默认用户名同组)
    • -G:指定附加组
    • -c:指定注释信息
    • -s:指定登录的bash类型,默认是 /bin/bash
    • -r:指定系统用户
    • -M:不创建用户的家目录
    #1.创建oldboyedu用户,UID5001,基本组students,附加组sa 注释信息:2020 new student,登陆shell:/bin/bash
    [root@oldboy-pythonedu ~]# groupadd students
    [root@oldboy-pythonedu ~]# groupadd sa
    [root@oldboy-pythonedu ~]# useradd oldboyedu -u 5001 -g students -G sa -c "2020 new student" -s /bin/bash
    #2.创建mysql系统用户,-M不建立用户家目录 -s指定nologin使其用户无法登陆系统
    [root@oldboy-pythonedu ~]# useradd mysql -r  -M -s /sbin/nologin 
    #3.删除用户
    userdel -r username   删除用户,并删除用户的家目录,不建议加-r: 因为很多情况下开发使用的用户家目录下有很多软件和配置文件
    
用户密码
  • 仅root可以设定所有人的密码, 普通仅能设定自己的密码,并且密码的强度有要求.

    • 交互式: passwd [username]

    • 非交互式: echo “12” | passwd --stdin root 固定密码

      ​ echo $RANDOM | md5sum | cut -c 2-10 | tee 1.txt |passwd --stdin root #随机密码

  • 用户组:

    • 所属组:当创建一个用户时,如果不指定主组,会默认创建一个同名的组.

    • 附加组:创建用户时可以指定我想加入的附加组,此时用户就可以具备附加的组的权限

      • 创建组:

        • -g: 指定gid,默认不指定,则从1000+开始
        [root@oldboy-pythonedu ~]# groupadd -g 5001 devops
        
      • 删除组:

        [root@oldboy-pythonedu ~]# groupdel devops
        [root@oldboy-pythonedu ~]# groupdel students
        groupdel:不能移除用户“oldboyedu”的主组
        [root@oldboy-pythonedu ~]# userdel -r oldboyedu [root@oldboy-pythonedu ~]# groupdel students
        
用户提权
  • su切换身份

    • su - 用户名 需要知道用户密码
  • sudo 提权

    • 快速给用户分配一个sudo的权限:

      [root@oldboy-pythonedu ~]# useradd -G wheel oldxu
      [root@oldboy-pythonedu ~]# echo "123" | passwd --stdin oldxu
      
    • 验证权限:

      [oldxu@oldboy-pythonedu ~]$ yum install wget -y
      			已加载插件:fastestmirror
      			您需要 root 权限执行此命令。
      [oldxu@oldboy-pythonedu ~]$ sudo yum install wget -y
      		我们信任您已经从系统管理员那里了解了日常注意事项。
      		总结起来无外乎这三点:
      
      			#1) 尊重别人的隐私。
      			#2) 输入前要先考虑(后果和风险)。
      			#3) 权力越大,责任越大。
      [sudo] oldxu 的密码:			# 普通自己的密码,不是root的密码
      
vim /etc/sudoers
visudo -c  检查语法
1.定义组名称  ( sudo里面的虚拟的 )
User_Alias DEV = kaifa1,kaifa2
User_Alias OPS = ops1,ops2

2.定义权限
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

## Installation and management of software
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services
 Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable
## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage
Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

## Processes
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
2.将用户组与权限进行绑定   
root    ALL=(ALL)       NOPASSWD:ALL				#可以执行所有的命令,并且无需输入密码
DEV     ALL=(ALL)       NETWORKING,SOFTWARE,SERVICES
OPS     ALL=(ALL)       NETWORKING,SOFTWARE,SERVICES,PROCESSES,STORAGE

3.创建对应的用户,并设定密码
[root@oldboy-pythonedu ~]# useradd kaifa1
[root@oldboy-pythonedu ~]# useradd kaifa2
[root@oldboy-pythonedu ~]# useradd ops1
[root@oldboy-pythonedu ~]# useradd ops2
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin kaifa1
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin kaifa2
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin ops1
[root@oldboy-pythonedu ~]# echo "1" | passwd --stdin ops2

4.使用 sudo -l 验证开发的权限和运维的权限是否不一致
用户 kaifa1 可以在 oldboy-pythonedu 上运行以下命令:
    (ALL) /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
        /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/rpm,
        /usr/bin/up2date, /usr/bin/yum, /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start,
        /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart,
        /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable

用户 ops1 可以在 oldboy-pythonedu 上运行以下命令:
    (ALL) /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
        /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool, /bin/rpm,
        /usr/bin/up2date, /usr/bin/yum, /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start,
        /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart,
        /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable,
        /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall, /sbin/fdisk, /sbin/sfdisk,
        /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

  • 提取ip地址

    1.提取IP地址  grep \ sed \ awk
    [root@oldboy-pythonedu ~]# ifconfig  ens32 | grep "inet " | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | head -1 
    10.0.0.200
    [root@oldboy-pythonedu ~]# ifconfig  ens32 | sed -n '2p' | sed -r 's#(^.*inet) (.*) (net.*$)#\2#g'
    10.0.0.200
    [root@oldboy-pythonedu ~]# ifconfig  ens32  | awk 'NR==2 {print $2}'
    10.0.0.200
    2.提取/etc/passwd 用户名称, uid ,登录bash
    [root@oldboy-pythonedu ~]# #awk -F ":" '{print $1,$3,$7}' /etc/passwd
    
    3.统计分析访问中来源做多前10的IP地址		sort  uniq  awk 
    	1.来源的IP地址在第几列
    	2.对数据进行排序
    	3.对数据进行去重,统计
    	4.取出前top10的IP地址
    	
    [root@oldboy-pythonedu ~]# awk '{print $1}' access.log  | sort | uniq -c | sort -nr | head -10 > access_top10.txt 
      31577 116.211.216.152
      25142 222.186.49.194
      20841 120.27.74.166
       9304 39.105.242.163
       8277 61.147.73.164
       7805 222.186.49.165
       7559 123.156.198.164
       7233 61.160.206.107
       6596 220.170.48.75
       6200 61.147.73.171
    
    [root@oldboy-pythonedu ~]# time awk '{ ip[$1]++ } END { for ( i in ip ) print ip[i],i}' access.log  | sort -nr | head -10
    {
    	ip[$1]++
    }
    END{
    	for ( i in ip) {
    		print i,ip[i]
    	}
    
    }
    
    • 权限管理:主要用来约束用户能对系统所作的操作

      • 目的:为了保护每个登录用户的隐私和工作环境
    • 权限与用户的关系

      • 系统位每个文件定义了三种身份: 属主 属组 其他
      • 每一种身份分别对应三种权限,r读权限,w写权限,x执行权限
      [root@oldboy-pythonedu ~]# ll useradd_2.sh 
      -rw-r-----. 1 adm root 618 9月  28 11:27 useradd_2.sh
      字母		含义		对应权限
      		r(read)		读取权限	4
      		w(write)	写入权限	2
      		x(execute)	执行权限	1
      		-(没有权限)	没有权限	0
      
    • 修改权限(进程运行需要一个用户, 而进程在完成上传的操作时, 需要调用对应的用户来执行, 能不能执行成功, 取决于该用户对该文件是否有权限)

      #方法一
      [root@oldboy-pythonedu ~]# chmod 640 useradd_2.sh
      		# 属主: rwx		读写执行   7
      		# 属组: r-x		读和执行   5
      		# 其他: r-x		读和执行   5
      [root@oldboy-pythonedu ~]# chmod 755 useradd_2.sh 		[root@oldboy-pythonedu ~]# ll useradd_2.sh 
      -rwxr-xr-x. 1 adm root 618 9月  28 11:27 useradd_2.sh
      #变更一个文件属主和属组
      [root@oldboy-pythonedu ~]# chown -R www.www web-demo/
      
      #方法二变更写入目录的属主和属组   ( 不要修改为 777 )
      3.1) 检查进程运行的用户身份是什么:  apache
      [root@oldboy-pythonedu ~]# ps -ef |grep httpd | head -2
      root      24130      1  0 10:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND		#Master进程
      apache    24132  24130  0 10:13 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND		#Worker进程
      3.2) 检查进程要写入的目录是什么权限:
      [root@oldboy-pythonedu ~]# ll -d /var/www/html/
      drwxr-xr-x. 2 root root 77 9月  29 10:21 /var/www/html/
      总结:  写不进去的原因:
      进程会调用apache用户往 /var/www/html目录写, 而apache用户对/var/www/html目录仅拥有 读和执行,所以会失败.
      .3) 调整/var/www/html 属主和属组
      [root@oldboy-pythonedu ~]# chown apache.apache /var/www/html/
      [root@oldboy-pythonedu ~]# ll -d /var/www/html/
      drwxr-xr-x. 2 apache apache 77 9月  29 10:21 /var/www/html/
      3.4) 最后验证程序是否能正常上传文件至/var/www/html/中
      [root@oldboy-pythonedu ~]# ll /var/www/html/2020-09-29/ -d
      drwxr-xr-x. 2 apache apache 25 9月  29 10:27 /var/www/html/2020-09-29/
      			
      [root@oldboy-pythonedu ~]# ll /var/www/html/2020-09-29/
      -rw-r--r--. 1 apache apache 438 9月  29 10:27 2_oldxu.txt
      
      

软件包管理

  • rpm:redhat package mananger 红帽管理工具,xxx.rpm 主要用来安装软件包 可以通过rpm 和yum工具管理 使用二进制包解压

  • rpm工具安装会牵扯到依赖关系:
    A包 -> B包 -> C包

  • 安装

    [root@oldboy-pythonedu ~]# rpm -ivh https://mirrors.aliyun.com/centos/7/os/x86_64/Packages/vsftpd-3.0.2-27.el7.x86_64.rpm
    
  • 卸载

    [root@oldboy-pythonedu ~]# rpm -e vsftpd
    
  • 更新

[root@oldboy-pythonedu ~]# rpm -ivh https://mirrors.aliyun.com/mongodb/yum/redhat/7/mongodb-org/3.0/x86_64/RPMS/mongodb-org-shell-3.0.0-1.el7.x86_64.rpm
  • 查询结果

    [root@oldboy-pythonedu ~]# rpm -qa  | grep mongodb
    mongodb-org-shell-3.0.0-1.el7.x86_64
    
  • 查询命令

    [root@oldboy-pythonedu ~]# rpm -q httpd	#查询安装或者没有安装
    [root@oldboy-pythonedu ~]# rpm -qa  #显示系统中所有已安装的软件包
    [root@oldboy-pythonedu ~]# rpm -qa | grep httpd		#查询所有系统已安装的软件包,过滤指定的包名
    [root@oldboy-pythonedu ~]# rpm -qc httpd		#仅查看httpd这个包的配置在哪里
    [root@oldboy-pythonedu ~]# rpm -ql httpd		#查看httpd这个包所有的文件存储的路径
    
  • yum工具(联网) rpm包管理工具,主要用安装软件, 通过互联网安装软件. 并能解决依赖间关系.

    • 源和仓库

      • 源: 存储在服务器中的一个repo文件,文件中的存储的是仓库的地址
      • 仓库:一堆软件包的集合,源如果指向这个仓库,那么服务器就可以直接获取该仓库中的软件包
    • 配置源|仓库

      wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
      
    • 使用

      #安装
      [root@oldboy-pythonedu ~]# yum install samba -y 
      #更新
      [root@oldboy-pythonedu ~]# yum update samba -y 
      #卸载
      [root@oldboy-pythonedu ~]# yum remove samba -y 
      #查询 知道命令,但是不知道安装哪个软件包, 
      [root@oldboy-pythonedu ~]# yum provides ifconfig
      [root@oldboy-pythonedu ~]# yum provides /etc/my.cnf
      #清理缓存
      [root@oldboy-pythonedu ~]# yum clean all     # 清理所有的
      [root@oldboy-pythonedu ~]# yum makecache		#生成缓存
      [root@oldboy-pythonedu ~]# yum repolist			#查看仓库中的软件包
      

13.3 linux编辑工具 vi\vim

13.3.1vim

  • 文本的编辑工具,和windows的notepad++一样
  • Linux一切皆为文件,需要修改配置文件,让软件按照我们的期望值运行,所以需要使用编辑工具.
  • vi和vim没什么区别,vim有高亮显示

13.3.2 vi/vim

  • 命令模式

    • 复制: yy

    • 粘贴: p

    • 撤销: u

    • 删除: dd | D 删除光标后的所有内容

    • 剪切: 删除 + 粘贴

    • 光标操作

      • 文件行首: gg |
      • 文件行尾: G = shift + g
      • 翻页: ctrl + f 向下翻页 ctrl + b 向上翻页
        • 行首 ^ | 0
        • 收尾 $
    • 编辑模式:

      • I:直接进入编辑模式

      • o: 插入新的行,并且进入编辑模式

      • A:光标移动到行尾,并进入编辑模式

      • a:光标向后移动一位,并进入编辑模式

      • 快速切换到你想要的行

        • vim file.py + Number

          200gg , :200

    • 末行模式

      • 保存: w

      • 退出: q

      • 不知道修改在哪不保存退出: !q

      • 保存&退出:wq

      • 收索: /search n 向下查照 N 向上查找

      • 替换

        • :%s#over#OOVER#g 替换整个文件中over为 OOVER

        • 1,5s#over##OOVER#g

        • #号 可以是其他的特殊符号s@@@g
    • 视图模式

      • shift +v :行模式
        • 复制: y
        • 删除: d
      • ctrl +v : 块模式
        • 加注释: shift +i 输出#号注释符 按esc
        • 删注释: 选中后按下x删除一个字符
    • 其他操作

      • 开启行号 :Number
      • 搜索忽视大小写: :set ic
      • 取消高亮

13.3.3 linux文件类型

​ linux一切皆为文件:

​ 后缀:便于快速区分文件类型:

  • -: 文件
  • d: 目录
  • s: socket
  • c: 字符设备
  • b: 块设备 磁盘

file:命令判断文件具体的文件类型

13.3.4 文件属性

ll -h 人性化显示文件的大小

-rw-r–r--. 1 root root 32 9月 27 11:46 test.py

-rw-r--r--.	 # ①: 第一个标识文件类型, 后面九个标识文件的权限
1			# ②: 硬链接的次数
root		# ③: 文件属于哪个用户
root		# ④: 文件属于哪个组
32			# ⑤: 大小
9月  27 11:46	# ⑥: 文件最后的修改时间   			[ 创建时间,访问时间,修改时间 ]  stat test.txt
test.py		# ⑦: 文件名称

13.4 nginx基础知识

1.概念

nginx 是一个web服务器(静态资源)代理服务器

2.应用场景

  • web服务器
  • 反向代理
    • 负载均衡
    • 缓存
  • 安全服务https

3.构成

  • 二进制文件 基本框架,实现基本的请求和响应功能
  • nginx配置文件 控制Nginx的行为
  • access_log日志: 记录行动轨迹
  • error_log日志 黑匣子,分析故障,和定位故障

4.安装部署

  • 配置官方yum源(epel源获取,使用过程中就会出现权限不足的问题,建议采用阿里源)
  • 执行命令安装
[root@oldboy-pythonedu ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #换源
[root@oldboy-pythonedu ~]# yum install nginx -y 
[root@oldboy-pythonedu ~]# rpm -q nginx #查看安装版本
nginx-1.16.1-1.el7.x86_64

5.目录结构

[root@oldboy-pythonedu ~]# rpm -ql nginx
/etc/logrotate.d/nginx			# 日志轮转 ( 日志切割 )
/etc/nginx/						# nginx配置文件目录
/etc/nginx/nginx.conf			# nginx主配置文件
/var/log/nginx					# 日志目录 

6.配置文件

[root@oldboy-pythonedu ~]# systemctl stop httpd  # 终止http进程
[root@oldboy-pythonedu ~]# systemctl disable httpd #防止http自己启动
[root@oldboy-pythonedu ~]# systemctl start nginx #重置nginx
[root@oldboy-pythonedu ~]# netstat -lntp | grep 80 #配置nginx端口 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      26551/nginx: master
[root@oldboy-pythonedu ~]# cat /etc/nginx/nginx.conf
user nginx;						# 运行nginx的用户身份
worker_processes auto;				# worker进程运行多少个, auto自动与cpu核心保持一致
error_log /var/log/nginx/error.log;		# 错误日志
pid /run/nginx.pid;									# 进程运行后,在该目录下存放一个pid文件,文件中记录的是该进程的ID编号
include /usr/share/nginx/modules/*.conf;			# 包含所有的模块配置文件
events {
    worker_connections 1024; # worker的最大连接数   [  worker_connections *  worker_processes ]
}
http {			# 负责http的请求与响应
	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  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
 include             /etc/nginx/mime.types;			# 存放的都是nginx能支持的文件类型
  default_type        application/octet-stream;		# 当 nginx 不支持该类型时,默认以下载的方式回传给用户
   include /etc/nginx/conf.d/*.conf;					# 包含conf.d/*.conf结尾的文件
  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
  • 清除nginx.conf中所有的注释,以及server整个段的内容
  • 新建站点
#创建文件 mkdir /etc/nginx/conf.d/test.oldboyedu.com.conf
#写入内容 
server {
	listen 80;
	server_name test.oldboyedu.com;

	location / {
		root /code/html;
		index index.html;
	}
}
  • 根据配置文件定义的路径,创建路径,并写入代码
[root@oldboy-pythonedu ~]# mkdir /code/html -p 
[root@oldboy-pythonedu ~]# echo "test-oldboyedu.com....." > /code/html/index.html
  • 检查文件是否有错误的地方
[root@oldboy-pythonedu ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

  • 重启服务
[root@oldboy-pythonedu ~]# systemctl restart nginx	
  • 配置Hosts解析(假域名)

    • windows: C:\Windows\System32\drivers\etc\hosts 10.0.0.200 test.oldboyedu.com
    • MacOS: /etc/hosts 10.0.0.200 test.oldboyedu.com
  • nginx.conf 主要配置文件 ( 一般不动 )

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
}
6.2在服务器在新增一个游戏的站点
#第一步: 编辑 nginx 配置文件
[root@oldboy-pythonedu ~]# cat /etc/nginx/conf.d/game.oldboyedu.com.conf
server {
	listen 80;
	server_name game.oldboyedu.com;

	location / {
		root /code/game;
		index index.html;
	}
}
#第二步: 根据配置,创建目录,上传代码
[root@oldboy-pythonedu ~]# mkdir /code/game -p
[root@oldboy-pythonedu ~]# cd /code/game/
[root@oldboy-pythonedu game]# rz
[root@oldboy-pythonedu game]# unzip html5_\(1\).zip 
#第三步:  检查nginx配置文件语法, 然后重载服务
[root@oldboy-pythonedu game]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@oldboy-pythonedu game]# systemctl restart nginx
#第四步: 配置Hosts解析  ( 假的 )
	Windows电脑没有Hosts文件,  新建出来.
	
		Windows:  C:\Windows\System32\drivers\etc\Hosts
					10.0.0.200 test.oldboyedu.com
					10.0.0.200 game.oldboyedu.com
# vim /etc/nginx/conf.d/game.oldboyedu.com.conf			# 定义的第一个网站
server {
	listen 80;							# 监听的端口
	server_name game.oldboyedu.com;		# 申明域名
	
	location / {						# 匹配用户请求的uri路径
		root /code/html;				# 告诉 nginx 站点的代码在哪里目录下
		index index.html index.htm;		# 定义 默认返回的主页面
	}
}
#Nginx整个请求流程
url路径:  		http://game.oldboyedu.com  /game/zuqiu/index.html
真实服务器地址:	/code/game/game/zuqiu/index.html
1.用户通过浏览器请求game.oldboyedu.com  
2.浏览器会添加一些协议头信息,携带上默认的请求uri,  http://game.oldboyedu.com/
3.浏览器会发起DNS解析,解析game.oldboyedu.com  对应的真实IP地址 
4.浏览器获取到真实的IP地址后,  通过  IP+Prot的方式请求应用程序Nginx
5.Nginx接受到请求后,会进行事件的处理, 将用户请求的 Request 信息中 包含的 Host 字段, 与 Server_name 字段进行匹配
			5.1) 如果匹配不成功,则会随机返回一个站点的页面给用户.
			5.2) 可以通过 在 listen 80 default_server; 方式来定义具体默认返回哪个站点给用户.
			5.3) 如果碰到非法的域名,可以拒绝,也可以做跳转.
					拒绝:
						return 500;
					跳转:
						return 302 https://www.jd.com;
6.如果匹配成功, 接下来进行location uri地址匹配, 获取要返回的文件所在的路径 + 默认返回的页面
7.Nginx获取磁盘上的文件, 然后构建响应报文,回传给浏览器,浏览器加载并且渲染最终的结果呈现给用户.

7.基础模块

  • 目标索引 auto_index :能实现阿里云mirrors.aliyun.com 一样的效果.
[root@oldboy-pythonedu ~]# cat /etc/nginx/conf.d/mirror.oldboyedu.com.conf
server {
	listen 80;
	server_name mirror.oldboyedu.com;
	charset utf8;

	location / {
		root /code/mirror;
		autoindex on;					# 开启目录索引功能
		autoindex_exact_size off;		# 显示文件具体大小
		autoindex_localtime on;			# 显示本地服务器时间 
	}
}
[root@oldboy-pythonedu ~]# nginx -t
[root@oldboy-pythonedu ~]# systemctl restart nginx

[root@oldboy-pythonedu ~]# mkdir -p /code/mirror
[root@oldboy-pythonedu ~]# cd /code/mirror 
[root@oldboy-pythonedu ~]# rz
  • 访问限制
基于来源IP限制	
1) 仅允许 10.0.0.1 访问,其他访问全部拒绝

server {
...
allow 10.0.0.1/32;
deny all;
...
}

2) 拒绝10.0.0.1 访问, 其他全部允许

server {
...
deny 10.0.0.1/32;
allow all;
...
}
			
		
测试的curl命令:
[root@oldboy-pythonedu mirror]# curl -HHost:mirror.oldboyedu.com http://10.0.0.200/
		
基于用户与密码	auth_basic_module
[root@oldboy-pythonedu ~]# yum install httpd-tools -y
[root@oldboy-pythonedu nginx]# htpasswd -c -b password_file oldboy 123
[root@oldboy-pythonedu nginx]# cat password_file 
oldboy:$apr1$7dYbXvco$LSJaBM3HqlK3k1kkRt2Ya.
nginx配置文件:
server {
listen 80;
server_name mirror.oldboyedu.com;
charset utf8;

auth_basic "hello,nginx";				# 描述信息
auth_basic_user_file password_file;		# 定义密码文件名称

location / {
root /code/mirror;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
展示:   /work 需要密码  /public 无需密码
[root@oldboy-pythonedu ~]# mkdir /basic/{work,public} -p
[root@oldboy-pythonedu mirror]# cat /etc/nginx/conf.d/basic.oldboyedu.com.conf 
server {
    listen 80;
    server_name basic.oldboyedu.com;
    root /basic;
    autoindex on;

    location / {
    }

    location /work {
    auth_basic "test_work";
    auth_basic_user_file password_file;
    }
}

[root@oldboy-pythonedu mirror]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@oldboy-pythonedu mirror]# systemctl restart nginx
  • limit_conn 场景:下载
[root@oldboy-pythonedu mirror]# vim  /etc/nginx/conf.d/mirror.oldboyedu.com.conf
limit_conn_zone $binary_remote_addr zone=addr:10m;			# 定义限制的key, 分配区域大小
server {
		listen 80;
		server_name mirror.oldboyedu.com;
		charset utf8;
		limit_conn addr 1;			# 调用区域限制,限制key只可以出现1次, 相当于限制来源客户端IP的连接数为1
		limit_conn_status 500;		# 限制成功后,会返回500的错误状态码,默认返回503
		
		limit_rate_after 200m;		# 全速下载200m资源
		limit_rate       300k;		# 达到200m以后,限制300k的速度

		error_page 500 = @testerror;	# 如果 出现500错误,则让其跳转到内部的 @testerror 
		
		location @testerror {			# 定义 @testerror, 返回具体的动作 
			default_type text/html;
			return 200 '$remote_addr 你超过了最大连接限制, 请充值VIP解封!';
		}
		location / {
			root /code/mirror;
			autoindex on;
			autoindex_exact_size off;
			autoindex_localtime on;
		}
	}
  • 状态监控 stub_status [ 七种状态]
location = /status{
	stub_status;
}

Active connections: 2 				
server accepts handled requests
 74 74 104 
Reading: 0 Writing: 1 Waiting: 1 


Active connections: # 活跃的连接数
accepts: 			# 接受的总TCP连接数
handled: 			# 总处理的TCP连接数
requests: 			# 总的 http 请求数
  • location
#作用:控制用户请求uri的具体路径
#用法:location [= | ~ | ~* ] uri {...}
1.location优先级:
# 匹配符   匹配规则           优先级
   =       精准匹配             1
   ^~      以某个字符串开头     2
   ~       区分大小写的正则匹配  3
   ~*      不区分大小写的正则    4
   /       通用匹配,任何请求都会匹配 5
2.Location具体如何使用:
server {
    listen 80;
    server_name location2.oldxu.com;

    # 通用匹配,任何请求都会匹配到
    location / {
        root html;
        index index.html;
    }

    # 精准匹配,必须请求的uri是/nginx_status
    location = /nginx_status {
        stub_status;
    }

    # 严格区分大小写,匹配以.php结尾的都走这个location    
    location ~ \.php$ {
        default_type text/html;
        return 200 'php访问成功';
    }

    # 严格区分大小写,匹配以.jsp结尾的都走这个location 
    location ~ \.jsp$ {
        default_type text/html;
        return 200 'jsp访问成功';
    }

    # 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
    location ~* \.(jpg|gif|png|js|css)$ {
        return 403;
    }

    # 不区分大小写匹配
    location ~* \.(sql|bak|tgz|tar.gz|.git)$ {
        deny all;
    }
}

8.LNMP架构

1.lnmp架构

  • L : linux
  • N: Nginx
  • M:Mysql | Mariadb
  • P : PHP | Python

2.lnmp架构安装

nginx:
		
		php:
		[root@oldboy-pythonedu ~]# rpm -e $(rpm -qa |grep php)   #卸载php5版本
		[root@oldboy-pythonedu ~]# wget http://cdn.xuliangwei.com/php.zip
		[root@oldboy-pythonedu ~]# unzip php.zip 
		[root@oldboy-pythonedu ~]# yum localinstall php/*.rpm -y
		
		# 修改进程运行的身份
		[root@oldboy-pythonedu ~]# sed -i 's#user = apache#user = nginx#g' /etc/php-fpm.d/www.conf 
		[root@oldboy-pythonedu ~]# sed -i 's#group = apache#group = nginx#g' /etc/php-fpm.d/www.conf 
		
		# 启动php-fpm
		[root@oldboy-pythonedu ~]# systemctl enable php-fpm
		[root@oldboy-pythonedu ~]# systemctl start php-fpm

		nginx+ php 检查: 
		[root@oldboy-pythonedu ~]# cat /etc/nginx/conf.d/php.oldboyedu.com.conf 
		server {
			listen 80;
			server_name php.oldboyedu.com;
			root /code;

			location / {
				index index.php;
			}

			location ~ \.php$ {
				fastcgi_pass 127.0.0.1:9000;
				fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
				include fastcgi_params;
			}
		}

		# 代码:
		[root@oldboy-pythonedu ~]# cat /code/index.php 
		<?php
			phpinfo();
		?>

		mysql:
		[root@oldboy-pythonedu ~]# yum install mariadb mariadb-server -y
		[root@oldboy-pythonedu ~]# systemctl enable mariadb
		[root@oldboy-pythonedu ~]# systemctl start mariadb
		[root@oldboy-pythonedu ~]# mysqladmin password 'Oldxu.com123'
		[root@oldboy-pythonedu ~]# mysql -uroot -pOldxu.com123
		MariaDB [(none)]> 
		MariaDB [(none)]> create database wordpress charset utf8;

	
		测试php+mysql是否成功:
		[root@oldboy-pythonedu ~]# cat /code/mysql.php 
		   <?php
			$servername = "localhost";
			$username = "root";
			$password = "Oldxu.com123";

			// 创建连接
			$conn = mysqli_connect($servername, $username, $password);

			// 检测连接
			if (!$conn) {
				die("Connection failed: " . mysqli_connect_error());
			}
			echo "php连接MySQL数据库成功";
			?>

		
		[root@oldboy-pythonedu ~]# php /code/mysql.php 
        php连接MySQL数据库成功
  • 部署Wordpress
#第一步: 下载代码,存储至指定位置,变更权限
[root@oldboy-pythonedu ~]# cd /code/
[root@oldboy-pythonedu code]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@oldboy-pythonedu code]# tar xf latest-zh_CN.tar.gz 
[root@oldboy-pythonedu code]# chown -R nginx.nginx wordpress/
#第二步: 编写Nginx配置文件
		[root@oldboy-pythonedu code]# cat /etc/nginx/conf.d/blog.oldboyedu.com.conf 
		server {
			listen 80;
			server_name blog.oldboyedu.com;
			root /code/wordpress;

			location / {
				index index.php;
			}

			location ~ \.php$ {
				fastcgi_pass 127.0.0.1:9000;
				fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
				include fastcgi_params;
			}
		}

[root@oldboy-pythonedu code]# nginx -t
[root@oldboy-pythonedu code]# systemctl reload nginx
# 第三步: 配置域名解析.访问浏览器.安装该产品
  • 安装EduSoho
mkdir /code
cd /code
rz #上传文件
tar xf edusoho-8.2.17.tar.gz

#注意:我们的进程能够以什么方式去访问一个文件或目录,取决于进程所运行的用户身份对该文件有什么权限
chown -R nginx.nginx /code/edusoho
  • 增加EduSoho nginx配置
vi /etc/nginx/conf.d/edusoho.oldboyedu.conf
server {
    listen 80;
    server_name edu.oldboyedu.com;
    root /code/edusoho/web;
    client_max_body_size 1024m;		#允许上传视频大小限制
    client_body_buffer_size 100m;	#缓冲区大小(太小会提示a client request body is buffered to a temporary)

    location / {
        index app.php;
        try_files $uri @rewriteapp;
    }

    location @rewriteapp {
        rewrite ^(.*)$ /app.php/$1 last;
    }

    location ~ ^/udisk {
        internal;
        root /code/edusoho/app/data/;
    }

    location ~ ^/(app|app_dev)\.php(/|$) {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS              off;
        fastcgi_param HTTP_X-Sendfile-Type X-Accel-Redirect;
        fastcgi_param HTTP_X-Accel-Mapping /udisk=/code/edusoho/app/data/udisk;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 8 128k;
    }

    location ~* \.(jpg|jpeg|gif|png|ico|swf)$ {
        expires 3y;
        access_log off;
        gzip off;
    }

    location ~* \.(css|js)$ {
        access_log off;
        expires 3y;
    }

    location ~ ^/files/.*\.(php|php5)$ {
        deny all;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  HTTPS              off;
        include        fastcgi_params;
    }
}
  • 重启nginx服务
nginx -t
systemctl restart nginx
  • 修改php.ini 配置文件,调整解析器支持的最大上传限制
vim /etc/php.ini
upload_max_filesize = 1024M
post_max_size = 1024M

systemctl restart php-fpm
  • 上传视频

    • 课程->创建课程
      课程->管理课程–>
      课程文件–>添加视频
      计划任务–>添加章节–>添加视频–>发布
  • 修改图片

    • 运营->编辑区管理->首页顶部.轮播图
      系统->站点设置->网站Logo
      系统->站点设置->主题->管理
      ->组件调整
      ->配色方案
1.kodcloud  + oss 对象存储 ( 花钱 )			200
   1) Nginx + PHP 环境
   2) kodcloud代码
   	[root@oldboy-pythonedu ~]# cd /code
   	[root@oldboy-pythonedu code]# wget http://static.kodcloud.com/update/download/kodbox.1.13.zip
   	[root@oldboy-pythonedu code]# mkdir kodcloud
   	[root@oldboy-pythonedu code]# unzip kodbox.1.13.zip -d kodcloud/
   	[root@oldboy-pythonedu code]# chown -R nginx.nginx /code/kodcloud/

   3) Nginx配置文件
   	[root@oldboy-pythonedu code]# cat /etc/nginx/conf.d/kod.oldboyedu.com.conf
   	server {
   		listen 80;
   		server_name kod.oldboyedu.com;
   		root /code/kodcloud;

   		location / {
   			index index.php;
   		}

   		location ~ \.php$ {
   			fastcgi_pass 127.0.0.1:9000;
   			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   			include fastcgi_params;
   		}
   	}
   	[root@oldboy-pythonedu code]# nginx -t
   	[root@oldboy-pythonedu code]# systemctl reload nginx
   
   4) 域名解析


2.扩展一台应用节点	
   1) 克隆一台全新的Linux主机,需要修改IP地址
   	sed -i 's#old#new#g' /etc/sysconfig/network-script/ifcfg-ens
   	
   		# old: 旧的IP尾号
   		# new: 新的IP尾号
   	
   	[root@oldboy-pythonedu ~]# hostnamectl set-hostname node2
   	
   	
   	
   2) 安装Nginx PHP环境
   [root@node2 ~]# yum install vim net-tools unzip wget lrzsz -y			# 基础工具
   [root@node2 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
   [root@node2 ~]# wget http://cdn.xuliangwei.com/php.zip
   
   
   # 安装Nginx
   [root@node2 ~]# yum install nginx -y
   
   # 安装PHP
   [root@node2 ~]# unzip php.zip
   [root@node2 ~]# yum localinstall php/*.rpm -y
   
   
   3) 拷贝Nginx配置 PHP配置   scp
   [root@node2 ~]# scp [email protected]:/etc/nginx/nginx.conf /etc/nginx/nginx.conf
   [root@node2 ~]# scp -r [email protected]:/etc/nginx/conf.d/*.conf /etc/nginx/conf.d/
   
   # php
   [root@node2 ~]# scp [email protected]:/etc/php.ini /etc/php.ini   
   [root@node2 ~]# scp [email protected]:/etc/php-fpm.d/www.conf  /etc/php-fpm.d/www.conf 
   
   
   4) 拷贝代码, 关闭防火墙
   [root@node2 ~]# systemctl disable firewalld
   [root@node2 ~]# systemctl stop firewalld
   [root@node2 ~]# setenforce 0
   [root@node2 ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config


   # 拷贝所有代码
   [root@node2 ~]# scp -rp [email protected]:/code /
   [root@node2 ~]# chown -R nginx.nginx /code/
   
   5) 启动服务
   [root@node2 ~]# systemctl enable nginx php-fpm
   [root@node2 ~]# systemctl start nginx php-fpm
   

   									201
3.拆分数据库至独立服务器  ( 应用节点可以共享使用, 数据库还可以组集群架构. )		202

   1) 准备基础环境, 修改IP地址,修改主机名称,关闭防火墙
   
   	sed -i 's#201#202#g' /etc/sysconfig/network-scripts/ifcfg-ens32 
   	systemctl restart network
   	hostnamectl set-hostname node-mysql
   	systemctl stop firewalld
   	systemctl disable firewalld
   	setenforce 0
   	sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

   	yum install vim net-tools unzip wget lrzsz -y
   	wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo


   2) 安装Mariadb
   [root@oldboy-pythonedu ~]# yum install mariadb mariadb-server -y
   [root@oldboy-pythonedu ~]# systemctl enable mariadb
   [root@oldboy-pythonedu ~]# systemctl start mariadb
   [root@oldboy-pythonedu ~]# mysql
   MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'Oldxu.com123';
   MariaDB [(none)]>

   3) 在原有数据上,将库备份下来,然后恢复至 10.0.0.202 主机的MySQL上
   [root@oldboy-pythonedu ~]# mysqldump -uroot -pOldxu.com123 -B wordpress edusoho > bak.sql
   [root@oldboy-pythonedu ~]# scp bak.sql [email protected]:~
   
   4) 在新的数据库服务上恢复数据
   [root@node-mysql ~]# mysql < bak.sql


   5) 修改应用服务连接数据库的地址:  ( 所有应用节点都需要操作 )
   	
   	Wordpress:
   		[root@node2 ~]# vim /code/wordpress/wp-config.php
   		define( 'DB_NAME', 'wordpress' );

   		/** MySQL数据库用户名 */
   		define( 'DB_USER', 'all' );

   		/** MySQL数据库密码 */
   		define( 'DB_PASSWORD', 'Oldxu.com123' );

   		/** MySQL主机 */
   		define( 'DB_HOST', '10.0.0.202' );
   
   	#edusohu:
   		[root@node2 ~]# vim /code/edusoho/app/config/parameters.yml
   		parameters:
   			database_driver: pdo_mysql
   			database_host: 10.0.0.202
   			database_port: 3306
   			database_name: edusoho
   			database_user: all
   			database_password: 'Oldxu.com123'

   	edusoho存在缓存:
   	[root@node2 ~]# rm -rf /code/edusoho/app/cache/*

9.nginx代理

  • 正向代理 ( 科学上网 \ 共享上网 )
  • 反象代理 ( 企业 )
http			用户请求  响应		JAVA
smtp
websocket		用户可以请求,  服务端响应   服务端可以推送数据
uwsgi			Python
fastcgi			PHP
https
#1) web节点的配置  10.0.0.201
[root@node2 conf.d]# cat proxy.oldboyedu.com.conf 
server {
	listen 80;
	server_name proxy.oldboyedu.com;
	root /code/proxy;

	location / {
		index index.html;
	}
}
[root@node2 conf.d]# mkdir /code/proxy -p
[root@node2 conf.d]# echo "node2...." >> /code/proxy/index.html

[root@node2 conf.d]# nginx -t
[root@node2 conf.d]# systemctl reload nginx


#2) 代理节点的配置		10.0.0.100

[root@proxy ~]# systemctl disable firewalld
[root@proxy ~]# systemctl stop firewalld
[root@proxy ~]# setenforce 0


	#安装epel\nginx
[root@proxy ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@proxy ~]# yum install vim wget unzip nginx -y

	# 清理nginx.conf 无用的配置
	
	# 将nginx加入开机自启\ 启动nginx
[root@proxy ~]# systemctl start nginx
[root@proxy ~]# systemctl enable nginx


	# 编写proxy配置文件
[root@proxy ~]# vim /etc/nginx/conf.d/proxy_proxy.oldboyedu.com.conf
server {
	listen 80;
	server_name proxy.oldboyedu.com;

	location / {
		proxy_pass http://10.0.0.201;					# 后端是什么端口根本不重要
		proxy_set_header Host $http_host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_http_version 1.1;
	}
}

	# 检查语法,重载服务
[root@proxy ~]# nginx -t
[root@proxy ~]# systemctl restart nginx

#3) 用户请求代理
	抓包分析: 提炼了几个参数:
	proxy_set_header Host $http_host;								# 将用户请求的域名携带到后端
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	# 将用户的真实IP地址,携带到后端,后端有对应的变量解析结果
	proxy_http_version 1.1;		

10.nginx负载均衡

  • nginx负载均衡调度多web节点
#1.多个应用服务器节点: 
	node1: 10.0.0.200
	node2: 10.0.0.201
	域名: proxy.oldboyedu.com
node1 nginx配置:
[root@node1 conf.d]# cat /etc/nginx/conf.d/proxy.oldboyedu.com.conf
server {
	listen 80;
	server_name proxy.oldboyedu.com;
	root /code/proxy;

	location / {
		index index.html;
	}
}

[root@oldboy-pythonedu ~]# mkdir /code/proxy -p
[root@oldboy-pythonedu ~]# echo "node1...." > /code/proxy/index.html
[root@oldboy-pythonedu ~]# systemctl reload nginx

#2. node2 nginx配置:
[root@node1 conf.d]# cat /etc/nginx/conf.d/proxy.oldboyedu.com.conf
server {
	listen 80;
	server_name proxy.oldboyedu.com;
	root /code/proxy;

	location / {
		index index.html;
	}
}
[root@oldboy-pythonedu ~]# mkdir /code/proxy -p
[root@oldboy-pythonedu ~]# echo "node2...." > /code/proxy/index.html
[root@oldboy-pythonedu ~]# systemctl reload nginx
#3.通过nginx负载均衡进行轮询调度:
	proxy: 10.0.0.100
	域名: proxy.oldboyedu.com

	
[root@proxy ~]# cat  /etc/nginx/conf.d/proxy_proxy.oldboyedu.com.conf 
upstream node {
	server 10.0.0.200:80;
	server 10.0.0.201:80;
}

server {
	listen 80;
	server_name proxy.oldboyedu.com;

	location / {
		proxy_pass http://node;
		proxy_set_header Host $http_host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_http_version 1.1;
	}
}

[root@proxy ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@proxy ~]# systemctl reload nginx

  • 负载均衡的调度用法
# 轮询         默认
# 加权轮询:
	upstream node{
        server 10.0.0.200:80 weight=5;
        server 10.0.0.201:80 weight=1;
    }
#ip_hash:固定调度至某一个节点.(session会话保存)
upstream node {
			ip_hash;
			server 10.0.0.200:80;
			server 10.0.0.201:80;
		}
#优点解决会话问题
#缺陷:如果来源是一个ip,会导致某个节点非常繁忙,而其他的节   点没有流量,造成负载不均衡的现象
  • 为edu和blog配置负载均衡(在代理虚拟中配置)
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_blog.oldboyedu.com.conf 
upstream blog {
	server 10.0.0.200:80;
	server 10.0.0.201:80;
}


server {
	listen 80;
	server_name blog.oldboyedu.com;
	
	location / {
		proxy_pass http://blog;
		proxy_set_header Host $http_host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	
	}
}

# edu配置
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_edu.oldboyedu.com.conf 
upstream edu {
	server 10.0.0.200:80;
	server 10.0.0.201:80;
}

server {
	listen 80;
	server_name edu.oldboyedu.com;
	
	location / {
		proxy_pass http://edu;
		proxy_set_header Host $http_host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	
	}
}
  • nginx_proxy + web应用节点(多台) + Redis会话保持 phpmyadmin
#1.搭建好应用节点   ( 所有节点保持一致 )
[root@oldboy-pythonedu ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.0.3/phpMyAdmin-5.0.3-all-languages.zip

#2.准备phpmyadmin的Nginx配置文件
server {
		listen 80;
		server_name phpmyadmin.oldboyedu.com;
		root /code/phpmyadmin;

		location / {
			index index.php;
		}

		location ~ \.php$ {
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
			include fastcgi_params;
		}
	}
[root@oldboy-pythonedu ~]# unzip phpMyAdmin-5.0.3-all-languages.zip
[root@oldboy-pythonedu ~]# mv phpMyAdmin-5.0.3-all-languages /code/phpmyadmin

#3.配置phpmyadmin连接数据库地址
[root@oldboy-pythonedu ~]# cp /code/phpmyadmin/config.sample.inc.php /code/phpmyadmin/config.inc.php
[root@oldboy-pythonedu ~]# vim /code/phpmyadmin/config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '10.0.0.202'; #配置端口
#4.授权session存储本地目录为进程的用户身份
[root@oldboy-pythonedu ~]# chown -R nginx.nginx /var/lib/php/session

#5.部署node2节点的phpmyadmin, 需要将代码和nginx配置拷贝一份
[root@node2 code]# scp -rp [email protected]:/code/phpmyadmin /code/
[root@node2 code]# chown -R nginx.nginx /code/phpmyadmin/
[root@node2 code]# scp [email protected]:/etc/nginx/conf.d/phpadmin.oldboyedu.com.conf /etc/nginx/conf.d/
[root@node2 code]# chown -R nginx.nginx /var/lib/php/session/
[root@node2 code]# nginx -t
[root@node2 code]# systemctl reload nginx

#6.为应用节点,接入负载均衡
[root@proxy ~]# cat /etc/nginx/conf.d/proxy_phpadmin.oldboyedu.com.conf
upstream php {
		server 10.0.0.200:80;
		server 10.0.0.201:80;
	}
	
	server {
		listen 80;
		server_name phpmyadmin.oldboyedu.com;
		
		location / {
			proxy_pass http://php;
			proxy_set_header Host $http_host;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	
		}
	}
#7.检查轮询是否会造成无法登陆情况, 配置IP_hash测试是否能正常登陆
轮询一定会造成无法登陆成功.
		
		可以采用ip_hash的方式解决.
		upstream php {
			ip_hash;
			server 10.0.0.200:80;
			server 10.0.0.201:80;
		}
#8.采用Redis共享的方式来解决会话无法登陆的问题,  需要先将负载均衡恢复至轮询模式,然后在继续
#1) 安装Redis		10.0.0.202
[root@node-mysql ~]# yum install redis -y
[root@node-mysql ~]# vim /etc/redis.conf# 添加本机的内网IP地址 ( 不要写错了 ) bind 127.0.0.1 10.0.0.202
[root@node-mysql ~]# systemctl enable redis
[root@node-mysql ~]# systemctl start redis
[root@node-mysql ~]# netstat -lntp | grep redis
tcp        0      0 10.0.0.202:6379         0.0.0.0:*               LISTEN      10699/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      10699/redis-server
#2) 通过其他的节点测试是否能正常访问Redis
[root@node2 ~]# yum install redis -y
[root@node2 ~]# redis-cli -h 10.0.0.202
#3) 配置应用节点接入Redis,  [ 应用程序php必须有redis的模块,否则无法正常连接 ]   两个节点配置一样,都需要操作
# 将应用程序解析器连接至 Redis 
[root@oldboy-pythonedu ~]# vim /etc/php.ini
[Session]
;session.save_handler = files		#注释掉
session.save_handler = redis
session.save_path = "tcp://10.0.0.202:6379?weight=1&timeout=2.5"

# 注释如下两行内容
[root@oldboy-pythonedu ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session
#重启php-fpm
[root@oldboy-pythonedu ~]# systemctl restart php-fpm

#9.测试是否能正常登陆,然后检查浏览器中的session是否与redis中存储的session一致.
[root@node-mysql ~]# redis-cli
127.0.0.1:6379> keys *
1) "python_key"
2) "PHPREDIS_SESSION:f0ad1e364f79a85bd93b46883403f6ec"
		

11.配置wsgi

步骤一、安装 python3 的环境
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel \
sqlite-devel gcc gcc-c++  openssl-devel zlib zlib-devel python3 python3-devel -y

步骤二、安装 Django 框架、uwsgi
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ django==2.1.8
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ uwsgi
步骤三、配置Django工程
[root@oldboy-pythonedu demosite]# cd /opt/
[root@oldboy-pythonedu opt]# django-admin.py startproject demosite
[root@oldboy-pythonedu opt]# cd demosite/
[root@oldboy-pythonedu demosite]# python3 manage.py runserver 0.0.0.0:9999		# 启动测试
步骤四、配置uWSGI、配置Nginx
[root@oldboy-pythonedu opt]# cat /opt/demosite/uwsgi.ini
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:9999
#uwsgi启动进程数
workers = 2
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi.log
[root@oldboy-pythonedu demosite]# uwsgi --ini /opt/demosite/uwsgi.ini
[root@oldboy-pythonedu demosite]# netstat -lntp | grep 9999
tcp        0      0 127.0.0.1:9999          0.0.0.0:*               LISTEN      9827/uwsgi  
# 配置Nginx,将用户发送的http请求, 通过uwsgi_pass 传递给  Uwsgi 服务端
[root@oldboy-pythonedu opt]# cat /etc/nginx/conf.d/uwsgi.oldboyedu.com.conf 
server {
    listen 80;
    server_name uwsgi.oldboyedu.com;
    client_max_body_size 100M;
    index index.html;           #默认返回页面

    location / {
        uwsgi_pass 127.0.0.1:9999;
        uwsgi_param UWSGI_CHDIR /opt/demosite;  #工程所在的路径
        uwsgi_param UWSGI_SCRIPT demosite.wsgi; #demosite/wsgi接口文件
        include uwsgi_params;
    }
}

11.配置程序

1.安装模块
pip3 install -i https://pypi.doubanio.com/simple/ -r XXX.txt
2.配置数据库连接
vim blog_progect/settings.py #创建数据库要指定utf8
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog',
        'USER': 'all',
        'PASSWORD': 'Oldxu.com123',
        'HOST': '10.0.0.202',
        'PORT': '3306',
        'OPTIONS': {
            "init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
        }
    }
}
3.初始化数据库
python3 manage.py migrate
vim /code/blog_sever/blog_uwsgi.ini 
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:8989
chdir = /code/blog_sever
wsgi-file = blog_progect/wsgi.py
#uwsgi启动进程数
processes = 4
threads = 10
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi-blog.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi-blog.log

4.启动uwsgi
uwsgi --ini /code/blog_sever/blog_uwsgi.ini 
netstat -lntp   #查看启动端口
(发生错误时 停止:
kill $(ps -ef |grep bbs_uwsgi | grep -v grep  | awk '{print $2}' | xargs )
5.配置nginx
vim /etc/nginx/conf.d/pyblog.oldboyedu.com.conf 
server {
    listen 80;
    server_name pyblog.oldboyedu.com;
    client_max_body_size 100M;
    

	location /static {
		alias /code/blog_sever/static;
	}


    location / {
        uwsgi_pass 127.0.0.1:8989;
        include uwsgi_params;
    }
}

nginx -t
systemctl reload nginx

11.配置程序

1.安装模块
pip3 install -i https://pypi.doubanio.com/simple/ -r XXX.txt
2.配置数据库连接
vim blog_progect/settings.py #创建数据库要指定utf8
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog',
        'USER': 'all',
        'PASSWORD': 'Oldxu.com123',
        'HOST': '10.0.0.202',
        'PORT': '3306',
        'OPTIONS': {
            "init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
        }
    }
}
3.初始化数据库
python3 manage.py migrate
vim /code/blog_sever/blog_uwsgi.ini 
[uwsgi]
#uwsgi监听的端口
socket = 127.0.0.1:8989
chdir = /code/blog_sever
wsgi-file = blog_progect/wsgi.py
#uwsgi启动进程数
processes = 4
threads = 10
#最大接收的请求数
max-requests = 1000
#buffer缓冲区大小
buffer-size = 30000
#进程pid存放路径
pidfile = /run/uwsgi-blog.pid
#uwsgi日志存储路径
daemonize = /var/log/uwsgi-blog.log

4.启动uwsgi
uwsgi --ini /code/blog_sever/blog_uwsgi.ini 
netstat -lntp   #查看启动端口
(发生错误时 停止:
kill $(ps -ef |grep bbs_uwsgi | grep -v grep  | awk '{print $2}' | xargs )
5.配置nginx
vim /etc/nginx/conf.d/pyblog.oldboyedu.com.conf 
server {
    listen 80;
    server_name pyblog.oldboyedu.com;
    client_max_body_size 100M;
    

	location /static {
		alias /code/blog_sever/static;
	}


    location / {
        uwsgi_pass 127.0.0.1:8989;
        include uwsgi_params;
    }
}

nginx -t
systemctl reload nginx

你可能感兴趣的:(vim,python,django,linux,nginx)