• linux总结


    用户登录

    • root用户
      • 是一个特殊的管理账号,也可以成为超级管理员
      • root用户对系统有完全控制的权限
      • 对系统的损害会无限大
      • 在工作中,如果没有特殊的必要,尽量不要使用root
    • 普通用户
      • 权限有限
      • 对系统的损害会小

    终端

    分类

    • 设备终端
    • 物理终端
    • 虚拟终端 ctrl+alt+f[1-6] /dev/tty#
    • 图形终端 /dev/tty7
    • 串行终端
    • 伪终端 通过ssh远程连接的 /dev/pts/#
    • 查看终端的命令 tty
    • 查看ip地址的命令 ip addr

    交互式接口

    启动终端以后,在终端设备上附加的一个应用程序

    • GUI(桌面)
    • CLI command line
      • powershell
      • sh
      • bash(linux,mac默认的程序)
      • zsh
      • csh
      • tcsh

    bash

    bash是linux系统的用户界面,提供了用户和操作系统之间的交互,它接收用户的输入,让它送给操作系统执行

    • 目前是linux和mac上默认的shell
    • centos默认使用
    • 显示系统当前使用的shell echo $SHELL
    • 查看系统内可以使用的shell cat /etc/shells
    • ctrl +d 快速终止当前的连接
    • 切换shell chsh -s shell

    修改ssh连接慢的步骤

    echo "UseDNS no" >> /etc/ssh/sshd_config
    systemctl restart sshd
    

    命令提示符

    [root@localhost ~]#  
    管理员是# 普通用户时$
    

    显示提示符格式

    [root@localhost ~]# echo $PS1
    [u@h W]$
    u 代表当前登录的用户
    h 代表当前主机的主机名
    W 代表当前的目录
    0表示默认字体,1表示加粗,4在字体下方加下划线 5 闪烁 7 代表突出显示
    31-37 字体颜色
    40-47 表示背景颜色
    echo 'PS1="[e[1;35mm][u@h W]\$[e[0m]"' >> /etc/profile.d/ps.sh #永久生效
    

    命令

    执行命令: 输入命令回车

    内部命令:shell 自带的命令

    • help 显示所有的内部命令

    外部命令:第三方提供的命令

    查看命令的类型: type

    [root@localhost ~]#type echo
    echo is a shell builtin
    [root@localhost ~]#type top
    top is /usr/bin/top
    
    

    别名

    • 查看当前所有的别名 alias
    • 自定别名 alias cdetc='cd /etc'
    • 取消别名 unalias cdetc
    • 设置别名只对当前的终端有效
    • 设置所有用户都可以用 /etc/bashrc
    • 只对当前用户有效 ~/.bashrc
    • 执行本身命令
      • command
      • "command"
      • 'command'
      • path

    命令格式

    command [options.....] [args...]

    command 命令本身

    options:启动或者关闭命令里面的某些功能

    • 长选项:--help --color
    • 短选项: -i -l

    args:命令的作用体,一般情况下是目录或者文件,用户名等等

    注意:

    • 短选项是可以合并
    • 空格隔开
    • ctrl+c 结束命令的执行
    • 在同一行执行多个命令用;隔开
    • 一个命令可以在多行显示用连接

    获取命令的帮助信息

    内部命令:

    • help command
    • man bash

    外部命令:

    • command -h
    • command --help
    • man coomand
    • 官方文档
    [root@localhost ~]#python --help
    usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
    [] 可选项
    <> 表示变化的数据
    ... 表示列表
    a|b|c 或者
    -abc 表示-a -b -c
    {} 表示分组
    

    man

     1   Executable programs or shell commands  #用户命令
     2   System calls (functions provided by the kernel) # 系统调用
     3   Library calls (functions within program libraries) # 库的调用
     4   Special files (usually found in /dev) #设备文件与特殊文件
     5   File formats and conventions eg /etc/passwd # 配置文件格式
     6   Games #游戏
     7   Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) # 杂项
     8   System administration commands (usually only for root) # 管理类的命令
     9   Kernel routines [Non standard] # 内核的API
     退出q
     翻屏 空格
     翻行 回车
     man 章节 passwd
    

    bash 快捷键

    • ctrl+l 清屏 相当于clear
    • ctrl+o 执行当前的命令,并显示当前的命令
    • ctrl+s 锁屏
    • ctrl+q 解锁
    • ctrl+c 终止命令
    • ctrl+z 挂起命令
    • ctrl+a 光标移动到行首,相当于Home
    • ctrl+e 光标移动到行位,相当于End
    • ctrl+xx 在开头和当前光标所在位置跳转
    • ctrl+k 删除光标后的文字
    • ctrl+u 删除光标前的文字
    • alt+r 删除正行

    tab 键

    • 命令补全
      • 内部命令
      • 外部命令:根据环境变量定义的路径,从前往后依次查找,自动匹配第一个查找到的内容
      • 如果用户给的命令只有唯一一个匹配,则直接补全
      • 如果有多个匹配,则需要在按tab键将所有匹配到的结果展示出来
    • 目录补全
      • 把用户给定的字符作为文件的开头,如果有唯一一个匹配则直接补全
      • 如果有多个匹配,则需要再次按tab键把所有的匹配到的结果展示出来

    引号

    [root@localhost ~]#name=alexdsb
    [root@localhost ~]#echo "$name"
    alexdsb
    [root@localhost ~]#echo '$name'
    $name
    [root@localhost ~]#echo "wo shi `tty`"
    wo shi /dev/pts/2
    [root@localhost ~]#tty
    /dev/pts/2
    [root@localhost ~]#echo "wo shi $(tty)"
    wo shi /dev/pts/2
    

    命令历史

    • 可以使用上下箭头来查找之前执行过的命令
    • 存放文件是~/.bash_history
    • 执行的命令是history
    • 执行上一条命令
      • 上箭头
      • !!
      • !-1
      • ctrl+p 回车
    • 调用上一条命令的最后一个值 esc .
    • !# 指定第多少条命令
    • !-# 指定倒数第#条命令
    • !string 用来最近一次匹配到的命令(从下往上)
    • ctrl+r 搜索命令
    • ctrl+g 取消搜索
    • # 显示最后#条命令

    命令展开

    touch file{1..20}
    seq 0 2 10
    echo file{1..20..2}
    

    echo 回显

    echo -e 'dadasda
    dasdasd'
    echo -e 'a' #播放声音
    

    查看用户登录信息

    [root@localhost ~]#whoami # 显示当前的登录用户
    root
    [root@localhost ~]#who am i #显示当前登录用户的详细信息
    root     pts/2        2019-08-22 15:54 (192.168.21.1)
    [root@localhost ~]#w 显示所有的用户并显示执行的命令
     16:27:54 up  5:19,  9 users,  load average: 0.00, 0.01, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     tty2                      11:37    4:48m  0.02s  0.02s -bash
    wu       tty3                      11:39    4:48m  0.02s  0.02s -bash
    root     :0       :0               11:30   ?xdm?   1:28   0.36s /usr/libexec/gnome-session-binary --session gnome-classi
    root     pts/0    :0               11:35    4:43m  0.03s  0.03s bash
    root     pts/1    192.168.21.1     12:11    4:03m  0.02s  0.02s -bash
    root     pts/2    192.168.21.1     15:54    2.00s  0.18s  0.03s w
    wu       pts/3    192.168.21.1     12:27    2:26   0.05s  0.05s -bash
    

    date

    [root@localhost ~]#date  显示当前的时间
    Thu Aug 22 16:30:06 CST 2019 
    Usage: date [OPTION]... [+FORMAT]
      or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
    [root@localhost ~]#date 010923102018 #修改时间
    Tue Jan  9 23:10:00 CST 2018
    [root@localhost ~]#date
    Tue Jan  9 23:10:18 CST 2018
    [root@localhost ~]#ntpdate time.windows.com #同步网络服务器时间
    unix元年 1970-01-01
    [root@localhost ~]#date
    Thu Aug 22 16:35:44 CST 2019
    [root@localhost ~]#date
    Thu Aug 22 16:35:47 CST 2019
    [root@localhost ~]#date
    Thu Aug 22 16:35:48 CST 2019
    [root@localhost ~]#date +%a
    Thu
    [root@localhost ~]#date +%A
    Thursday
    [root@localhost ~]#date +%F
    2019-08-22
    [root@localhost ~]#date +%H
    16
    [root@localhost ~]#date +%I
    04
    [root@localhost ~]#date +%m
    08
    [root@localhost ~]#date +%d
    22
    [root@localhost ~]#date +%M
    38
    [root@localhost ~]#date +%h
    Aug
    [root@localhost ~]#date +%c
    Thu 22 Aug 2019 04:38:42 PM CST
    [root@localhost ~]#date +%T
    16:39:01
    [root@localhost ~]#date +%y
    19
    [root@localhost ~]#date +%Y
    2019
    [root@localhost ~]#date +%Y/m/%d
    2019/m/22
    [root@localhost ~]#date +%Y/%m/%d
    2019/08/22
    [root@localhost ~]#date +%s
    1566463197
    [root@localhost ~]#date +%W
    33
    

    显示时区

    [root@localhost ~]#timedatectl 
          Local time: Thu 2019-08-22 16:42:43 CST
      Universal time: Thu 2019-08-22 08:42:43 UTC
            RTC time: Thu 2019-08-22 08:42:43
           Time zone: Asia/Shanghai (CST, +0800)
         NTP enabled: no
    NTP synchronized: no
     RTC in local TZ: no
          DST active: n/a
    [root@localhost ~]#timedatectl set-timezone Asia/Tokyo
    

    日历

    cal

    cal -y 一年的日历

    cal # 显示某一年的日历

    关机重启

    • shutdown 默认1分钟之后关机
      • shutdown -c 取消关机
    • shutdow -r 重启
    • TIME
      • now 立即
      • +n n分钟之后
      • hh:mm 指定时间
    • 关机命令
      • poweroff
      • halt
      • init 0
    • 重启
      • reboot
        • -f 强制
        • -p 关机
      • init 6

    文件目录结构

    • 文件和目录被组织成一颗倒置的树状结构
    • 文件系统从根开始,“/”
    • 文件名称严格区分大小写
    • 隐藏文件以"."开头
    • 路径的分隔符为"/"

    文件命名规范

    • 文件字符最长为255个字符
    • 包括路径在内文件名称最长为4095个
    • 颜色表示
      • 蓝色 ---> 文件夹
      • 绿色 --> 可执行文件
      • 红色 --> 压缩文件
      • 蓝绿色 --> 链接文件
      • 灰色-->其他文件
      • 白色 --> 文件
    • 除了斜杠和NULL,其他所有字符都可以使用
    • 对大小写敏感

    文件系统结构

    • /boot 引导文件的存放位置,内核文件、引导加载器都在此目录
    • /bin 所有的用户都可以使用的命令
    • /sbin 管理类的命令
    • /lib 启动时程序使用的基本库文件 .so结尾
    • /lib64 专门存放X86_64系统上得辅助库文件
    • /etc 存放配置文件
    • /home/USERNAME 普通用户的家目录
    • /root 管理员的家目录
    • /media 便携式移动设备的挂载点
    • /mnt 临时文件的挂载点
    • /dev 设备文件和特殊文件的存放位置
    • /opt 第三方的应用的安装位置
    • /tmp 临时文件的存放位置
    • /usr 存放安装程序
    • /var 存放经常变化的文件,比如日志
    • /proc 存放内核启动和进程相关的虚拟文件
    • /sys 输出当前系统上的硬件相关的文件
    • /srv 系统上允许的服务用到的数据

    linux应用程序的组成

    • 二进制文件
      • /bin
      • /sbin
      • /usr/bin
      • /usr/sbin
      • /usr/local/bin
      • /usr/local/sbin
    • 库文件
      • /lib
      • /lib64
      • /usr/lib
      • /usr/lib64
      • /usr/local/lib
      • /usr/local/lib64
    • 配置文件
      • /etc
      • /etc/name
      • /usr/local/etc
    • 帮助文件
      • /usr/share/man
      • /usr/share/doc
      • /usr/local/share/man
      • /usr/local/share/doc

    绝对路径和相对路径

    • 绝对路径
      • 以根开始
      • 完整的文件的存放位置
      • 可以读取到任何一个文件或者文件夹
    • 相对路径
      • 不以根开始
      • 相对当前的位置来决定
      • 可以简短的表示一个文件或者文件夹
      • . 当前目录
      • .. 父级目录

    目录名和基名

    [root@localhost log]#basename /etc/sysconfig/network-scripts/ifcfg-ens33 
    ifcfg-ens33
    [root@localhost log]#basename /etc/sysconfig/network-scripts
    network-scripts
    [root@localhost log]#dirname /etc/sysconfig/network-scripts
    /etc/sysconfig
    [root@localhost log]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33 
    /etc/sysconfig/network-scripts
    

    切换目录

    cd 切换目录 change directory

    • 可以使用相对路径
    • 可以使用绝对路径

    切换到家目录

    [root@localhost log]#cd 
    [root@localhost ~]#
    

    切换到上一次的目录

    [root@localhost ~]#cd /etc/sysconfig/network-scripts/
    [root@localhost network-scripts]#cd -
    /root
    [root@localhost ~]#cd -
    /etc/sysconfig/network-scripts
    

    显示当前的工作目录

    pwd print working directory

    [root@localhost network-scripts]#pwd
    /etc/sysconfig/network-scripts
    # 查看链接的真正目录
    [root@localhost /]#cd lib
    [root@localhost lib]#pwd -P
    /usr/lib
    

    列出目录或者文件

    ls list

    命令格式:Usage: ls [OPTION]... [FILE]...

    ls -a 显示所有文件
    ls -l 以长格式显示文件列表
    total 21104
    -rw-r--r--. 1 root root        0 Aug 22 17:21 10
    权限        硬盘的引用次数  属主 属组  大小  访问时间  文件名称
    ls -R 递归显示目录
    ls -d 显示目录本身
    ls -1(数字1) 文件分行显示
    ls -S 安装文件大小排序
    ls -r 倒序显示
    ls -t 按照时间来排序
    ls -lh 显示人类易读的方式
    ls -d */ 显示当前目录下的文件夹
    l. 只显示隐藏文件
    

    linux下的目录类型

    • - 用来表示文件
    • d 用来表示目录
    • b 块设备
    • c 字符设备
    • l 表示符号链接文件
    • s socket套接字

    查看文件状态

      File: ‘anaconda-ks.cfg’
      Size: 1747      	Blocks: 8          IO Block: 4096   regular file
    Device: fd00h/64768d	Inode: 33574992    Links: 1
    Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: system_u:object_r:admin_home_t:s0
    Access: 2019-08-22 12:09:03.288000381 +0900 # 访问时间
    Modify: 2019-08-22 11:47:12.262947345 +0900 # 修改时间
    Change: 2019-08-22 11:47:12.262947345 +0900 # 改动时间
    atime 访问时间  查看文件内容就会改变
    mtime 修改时间  改变内容发生变化
    ctime 改动时间  元数据发生变化
    

    touch

    创建空文件和刷新时间,如果文件存在,则刷新时间,如果文件不存在,则创建文件

    -a 只修改atime和ctime

    -m 只修改mtime和ctime

    文件通配符

    • * 所有
    • ? 匹配的是任意单个字符
    • ~ 表示用户的家目录
    • [123] 其中一个
    • [^123] 取反
    • [0-9] 表示数字
    • file[a-z] 字母(有坑)缺少Z
    • file[A-Z] 字母(有坑)缺少a
    • [:lower:] 小写字母
    • [:upper:] 大写字母
    • [:alpha:] 所有字母 a-zA-Z
    • [:alnum:] 表示字母和数字
    • [:digit:] 表示数字

    创建目录

    mkdir 创建目录

    • -p 递归创建
    • -v 显示详细过程

    显示目录树

    安装:yum install -y tree

    tree 显示目录树

    -d 只显示文件夹

    -L # 只显示#层

    删除目录

    rmdir 只能删除非空目录

    -p 递归删除空父目录

    -v 显示删除过程

    rm -rf 删除非空目录

    复制文件和文件夹

    cp copy 默认情况下是别名,原来本身命令是不提示覆盖的

    Usage: cp [OPTION]... [-T] SOURCE DEST
      or:  cp [OPTION]... SOURCE... DIRECTORY
      or:  cp [OPTION]... -t DIRECTORY SOURCE... 
      -i 显示提示信息
      -n 不覆盖
      -r -R 递归复制
      -d 只复制链接文件,不复制源文件
      -a 归档
      -v 显示过程
      -b 备份原来的文件
      --backup=number 备份文件加上数字
      -p 保留原来的属性
      
    
    • 如果源文件是文件的话
      • 目标是文件
        • 目标文件如果不存在的话,则新建目标文件,并把内容写到目标文件中
        • 如果目标文件存在的话,本来的命令是直接覆盖,建议使用-i来提示用户
      • 目标是文件夹
        • 在文件夹中新建一个同名的文件,并把文件内容写到新文件中
    • 如果源文件为多个文件的话
      • 目标必须是文件夹,文件夹必须存在,其他情况都会报错
    • 如果源文件是文件夹的话
      • 目标文件是文件: 不可以
      • 目标文件必须是文件夹,必须使用-r选项
      • 如果目标文件不存在:则直接创建目标文件夹,并把源文件夹的数据都复制到目标文件夹
      • 如果目标文件存在:
        • 如果是文件的话,则报错
        • 如果是文件夹:则在目标文件夹中创建同名文件夹,并把所有数据都复制到新文件夹

    移动、重命名

    mv move

    Usage: mv [OPTION]... [-T] SOURCE DEST
      or:  mv [OPTION]... SOURCE... DIRECTORY
      or:  mv [OPTION]... -t DIRECTORY SOURCE...
    -i 提示
    -f 强制
    -b 备份
    --backup=number 备份后面加数字
    -v 显示过程
    

    删除

    rm remove

    Usage: rm [OPTION]... FILE...
    -i 提示
    -r -R 递归删除
    -f 强制删除
    rm -rf 慎用
    rm -rf /*
    cd /
    rm -rf *
    

    链接

    软链接

    • 相当于windows的快捷方式
    • 创建命令 ln -s 源文件 目标文件
    • 可以对目录做软链接
    • 指向另外的一个文件或者目录的路径,大小是路径的长度的字符
    • 对磁盘引用次数没有影响
    • 可以跨分区
    • 源文件发生改变,软链接会跟着发生变化
    • 源文件删除,软链接不能访问

    硬链接

    • 磁盘引用次数会发生变化
    • 指向的是硬盘上的同一块区域
    • 磁盘的引用数会随着硬链接次数来增加
    • 不能对目录做硬链接
    • 不能跨越分区
    • 源文件发生改变,硬链接也会跟着变化
    • 源文件删除以后,硬链接可以访问

    查看文件类型

    file

    输入和输出

    • 标准输入 默认是来自键盘的输入 stdin 0
    • 标准输出 默认输出到终端窗口 stdout 1
    • 标准错误输出 默认输出到终端窗口 stderr 2

    I/O重定向

    > 覆盖

    • > 将标准输出重定向到文件中
    • 2> 将错误输出重定向到文件中
    • &> 将所有的输出都重定向到文件中

    禁止、允许覆盖

    • 禁止覆盖 set -C
    • 允许覆盖 set +C

    >> 追加

    >> 将标准输出追加到文件中

    2>> 将错误输出追加到文件中

    &>> 将所有输出追加到文件中

    标准输入和错误输入分开保存

    [root@localhost ~]#ls f 45yuio > log.log 2> error.log
    [root@localhost ~]#cat log.log 
    f
    [root@localhost ~]#cat error.log 
    ls: cannot access 45yuio: No such file or directory
    
    

    合并所有的输出

    • &> 覆盖重定向
    • &>> 追加重定向
    • command > file 2>&1
    • command >> file 2>&1
    • ():合并多个文件的输出
    • /dev/null 黑洞

    从文件导入stdin

    tr 字符替换

    -t 截断
    -d 删除
    -s 压缩,去重
    -c 取反
    [root@localhost ~]#tr 'a-z' 'A-Z' < /etc/issue
    S
    KERNEL R ON AN M
    [root@localhost ~]#tr 'a-z' 'A-Z' 
    qwertyy
    QWERTYY
    12345678
    12345678
    ASDFGHJ
    ASDFGHJ
    qwertyuio
    QWERTYUIO
    ^C
    [root@localhost ~]#tr ab 12
    ab
    12
    abb
    122
    asdfghjkl
    1sdfghjkl
    ^C
    [root@localhost ~]#tr abc 12
    ab
    12
    abc
    122
    abc
    122
    ^C
    [root@localhost ~]#tr ab 123
    ab
    12
    abb
    122
    avc
    1vc
    qbc
    q2c
    abc
    12c
    [root@localhost ~]#tr -t abc 12
    abc
    12c
    ab
    12
    [root@localhost ~]#tr -d abc
    qwertyui
    qwertyui
    an^H^H
    n
    
    abc
    
    artyibrtyuiocrtyuiop
    rtyirtyuiortyuiop
    ^C
    [root@localhost ~]#tr -d abc < /etc/issue
    S
    Kernel 
     on n m
    
    [root@localhost ~]#cat /etc/issue
    S
    Kernel 
     on an m
    [root@localhost ~]#tr -s a
    abc
    abc
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabc
    abc
    ^C
    [root@localhost ~]#tr -sc a 
    aasdaaaaaaa
    aasdaaaaaaa
    ^[[A^H^H^C
    [root@localhost ~]#tr -sc a 
    aaaaaaaaabbbbbbbbbbbbbccccccccddddddddddd
    aaaaaaaaabcd
    [root@localhost ~]#tr -dc a
    aaaaaaaaaaaabbbbbbbbbb
    asdfghjkqwertyuiozxcvbnmxcvbnm,.
    aaaaaaaaaaaaa
    ctrl+d 结束
    [root@localhost ~]#tr -dc "a
    "
    asdfghjk
    a
    wertyujk;l'
    
    
    
    asdfghj
    a
    [root@localhost test]#tr -d a < issue > issue  处理完成以后不能写会到源文件,要写到新的文件中
    [root@localhost test]#seq 1 10 > b
    [root@localhost test]#cat b
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [root@localhost test]#tr -d "
    " < b
    12345678910[root@localhost test]#tr -d "
    " < b
    [root@localhost test]#tr "
    " " " <b
    1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr "
    " " " <b >c
    [root@localhost test]#cat c
    1 2 3 4 5 6 7 8 9 10 [root@localhost test]#tr " " "
    " <c
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    

    多行发送给stdin

    # 第一种方式
    [root@localhost test]#cat > f1
    qwert
    wertyui
    wertyui
    wertyuiopasdfghjk
    sdfghjkl
    sdfyhjkl;sdfghjkl;xcvb
    
    # 第二种方式
    [root@localhost test]#cat > f2 <<EOF
    > qwerty
    > qwertyu
    > wertyui
    > qwertyu
    > EOF
    EOF 不是必须得,只要两个相同就可以
    

    管道

    管道使用“|”来表示

    命令1|命令2|命令3

    • 把命令1的输出结果当做命令2的输出结果,把命令2的输出结果当成命令3的输入结果
    • 默认情况下,管道只能传送标准输出
    • 如果需要把错误输出也传递,则需要|&
    • 一般用来组合多个命令
    • 有一些命令是不接受管道的
    [root@localhost test]#ls f1|tr 'a-z' 'A-Z'
    F1
    [root@localhost test]#ls f
    ls: cannot access f: No such file or directory
    [root@localhost test]#ls f|tr 'a-z' 'A-Z'
    ls: cannot access f: No such file or directory
    [root@localhost test]#ls f|&tr 'a-z' 'A-Z'
    LS: CANNOT ACCESS F: NO SUCH FILE OR DIRECTORY
    [root@localhost test]#echo file{1..20}|touch 
    touch: missing file operand
    Try 'touch --help' for more information.
    
    

    cat 显示文本

    -E 显示结尾的$符
    -n 对显示的每一行进行编号
    -b 对非空行进行编号
    -s 对连续的空行进行压缩
    

    tac 倒序显示

    less 分屏显示文本

    向下翻一屏 空格

    向下翻一行 回车

    q 退出

    / 文本 搜索文本

    n 向下查找 N向上查找

    less 是man命令的默认分页器

    more 分页显示文件

    默认情况下显示读取的百分比

    读取完成自动退出

    q 退出

    -d 显示翻屏和退出的提示

    head 显示文件的前面的内容

    默认显示前10行

    -# 显示前#行

    -n # 显示前#行

    -c # 显示前#个字符

    tail 显示文件的后面的内容

    默认显示后10行

    -# 显示后#行

    -n # 显示后#行

    -c # 显示后#个字符,换行符也是一个字符

    cut 切割

    cut OPTION... [FILE]...
    -c 按照字符切割
    tail passwd |cut -c2-5
    -d 指定切割符,默认是tab
    -f # 显示第#个字段
    #,#,# 显示离散的多个
    #-# 表示连续的
    1-5,7 可以结合使用
    tail passwd |cut -d: -f1-5,7
    tail passwd |cut -d: -f1-5
    tail passwd |cut -d: -f1,3,5
    

    paste 合并

    默认是相同行合并到一起,默认是tab键

    -d 执行间隔符

    -s 将所有的行按照列来显示

    paste a.txt b.txt

    paste -d: a.txt b.txt

    paste -s a.txt b.txt

    wc 用来对文本进行统计

    [root@localhost test]#wc b.txt 
     4  5 20 b.txt
    行数  单词数 字节数 文件名
    -l 只显示行数
    -w 只显示单词数
    -c 只显示字节数
    -m 只显示字符数
    -L 显示文件中最长行的长度
    

    sort 排序

    Usage: sort [OPTION]... [FILE]...
      or:  sort [OPTION]... --files0-from=F
    默认是按照字母排序
    -r 倒序
    -R 随机排序
    -n 按照数字排序
    -f 忽略大小写
    -t 指定分隔符
    -k # 指定按照第#个字段进行排序
    sort -t: -k3 passwd
    sort -nt: -k3 passwd 
    

    uniq合并相同的行

    • 相邻
    • 完全一样
    -c 显示相同的行出现的次数
    -d 只显示重复的行
    -u 显示从没有重复过的行
    cut -d" " -f4 d|sort |uniq -c
    

    pv page

    uv user

    diff 对比文件

    [root@localhost test]#echo "123" >> f
    [root@localhost test]#diff d f
    11a12
    > 123
    [root@localhost test]#echo "1234" >> d
    [root@localhost test]#diff d f
    12c12
    < 1234
    ---
    > 123
    

    chown 用来修改所有者和组

    Usage: chown [OPTION]... [OWNER][:[GROUP]] FILE...
      or:  chown [OPTION]... --reference=RFILE FILE...
    chown wu c  修改属主
    chown wu:wu c 修改属主和属组
    chown root.root c
    chown :wu c 直接属组
    chown -R wu test 递归修改
    chown --reference=c d
    

    chgrp 修改文件的属组

    Usage: chgrp [OPTION]... GROUP FILE...
      or:  chgrp [OPTION]... --reference=RFILE FILE...
    

    权限

    9位表示权限

    3组

    3位表示一组

    --- --- ---

    • 文件权限可以读以下定义

      • 属主 u

      • 属组 g

      • 其他 o

      • 全部 a

    • 每个文件的权限

      • r 读

      • w 写

      • x 执行

    • 对于文件来说

      • r 可以使用文本查看工具来查看里面的内容
      • w 可以修改文本的内容
      • x 执行可以直接./file
    • 对于目录来说

      • r 可以使用ls等文件查看的命令查看
      • w 可以创建文件,也可以删除
      • x 可以cd进入
    • 数字表示

      --x

      001 1

      -w-

      010 2

      r--

      100 4

      rw-

      110 6

      rwx

      111 7

      r-x

      101 5

      -wx

      011 3

    修改权限

    • 可以直接修改某一类用户的权限
    chmod u+x c 增加
    chmod u-x c 删除
    chmod u=r c 直接赋值
    

    shabang ---》 解释器

    • 可以直接使用数字表示
    • 可以基于某个文件来修改

    设定特殊权限

    chattr +i 不能删除、不能修改、不能变更

    lsattr 查看属性

    chattr +a 只能追加数据

    vi/vim

    打开文件

    vim [option] .... file....

    +# 直接定位到第#行
    +/pattern 打开文件后,直接定位到第一个匹配到patter的地方
    -b 以二进制方式打开文件
    -d file1 file2 对比打开多个文件
    -m file 只读方式打开文件
    -e 直接以末行模式打开
    

    模式

    • 命令模式:可以光标,可以粘贴、复制文本,默认
    • 插入模式或者编辑模式:可以修改文本
    • 末行模式(扩展命令模式):保存、退出等等
    • esc 退出当前的模式

    模式之间切换

    • 命令模式- 插入模式
      • i 光标所在处插入
      • I 在当前光标所在的行的行首插入
      • a 光标所在位置的后面插入
      • A 在当前光标所在的行尾插入
      • o 在当前光标所在的行的下一行(新开)插入
      • O 在当前光标所在的行的上一行(新开一行)插入
    • 插入模式- 命令模式
      • esc
    • 命令模式 -- 末行模式
    • 末行模式 -- 命令模式
      • esc esc
      • esc enter

    关闭文件

    • 末行模式
      • :w 保存
      • :q 退出
      • :wq 保存并退出
      • :q! 强制退出
      • :wq!强制保存退出
      • :x 保存并退出
    • 命令模式
      • ZZ 保存退出
      • ZQ 不保存退出

    扩展命令行模式

    • 按":" 来进入
    • w 写入
    • q 退出
    • wq 保存并退出
    • q! 强制退出
    • x 保存并退出
    • r file 读入文件
    • w file 另存为
    • !command 直接执行命令
    • r!command 直接把命令的结果写到文件中

    命令模式跳转

    • 字符之间跳转
      • l 向右
      • h 向左
      • j 向下
      • k 向上
    • 单词间跳转
      • w 下一次的单词的词首
      • e 当前词的词尾或者下一个单词的词尾
      • b 当前词的词首或者上一词的词首
      • # command 直接跳转#个单词
    • 页面间跳转
    • H 页首
    • L 页尾
    • M 页中
    • zt 将光标所在行移动到屏幕的顶端
    • zb 将光标所在行移动到屏幕的底部
    • zz 将光标所在行移动到屏幕的中间
    • 行首行尾之间跳转
      • ^ 跳转到当前光标所在行的第一个非空字符
      • 0(数字) 跳转到行首
      • $ 跳转到行尾
    • 行间移动
      • G 跳转到第#行

      • 在命令扩展模式下,直接:# 跳转到对应的行
      • G 直接到最后一行
      • gg 跳转到第一行
      • 1G 跳转到第一行
    • 段落之间跳转(空行)
      • { 上一段
      • } 下一段
    • 翻屏
      • ctrl+f 向文件尾部翻一屏
      • ctrl+b 向文件首部翻一屏
      • ctrl+d 向文件尾部翻半屏
      • ctrl+u 向文件首部翻半屏

    命令模式编辑

    • 字符编辑
      • x 删除光标所在处的字符
      • x 删除#个字符

      • xp 将光标所在处的字符和后面的字符互换位置
      • ~ 将光标所在的位置大小写互换
      • J 删除当前行的换行符
    • 替换
      • r 替换当前光标所在处的字符
      • R 进入替换模式
    • 删除
      • d 删除,需要跟字符跳转结合
      • d$ 删除到行尾,删除当前位置
      • d0 删除到行首,当前位置不删除
      • d^ 删除到非空字符
      • dw 删除一个单词
      • de 向后删除一个单词
      • db 向前删除一个单词
      • dd 删除正行
      • # dd 删除#行
      • dG 删除到结尾
      • dgg 删除到开头
      • D 相当于d$
    • 复制
      • y,也可以跟字符跳转结合
      • y$
      • y0
      • y^
      • yw
      • ye
      • yb
      • yy 一正行
      • yy 复制#行

      • yG 复制到结尾
      • ygg 复制到开头
      • Y 复制整行
    • 粘贴
      • p 如果是整行的话,则粘贴到当前光标所在行的下一行,否则粘贴到光标的后面
      • P 如果是整行的话,则粘贴到当前光标所在行的上一行,否则粘贴到光标的前面
    • 改变,删除以后并将模式切换成插入模式
      • c 可以跟光标的跳转做结合
      • c$
      • c0
      • c^
      • cw
      • ce
      • cb
      • command

      • cc 删除正行并插入
      • C 相当于c$
    • [i|I|a|A|o|O]string esc 将string粘贴#次

    • 搜索
      • /pattern 从当前光标往下搜索
      • ?pattern 从当前光标往上搜索
      • n 同命令相同的方向
      • N 同命令相反的方向
    • 撤销
      • u 撤销最近的修改
      • # u 撤销最近的#次修改
      • ctrl +r 撤销之前的撤销动作
      • . 重复最后一次操作
      • . 最后一次操作重复执行#次

    命令扩展模式

    地址定界

    :start,end

    # 具体到第#行

    ,# 第#行到第#行

    #,+n 从第#开始,到第#+n行结束 1,+2 ==>1,3

    . 表示当前光标所在的行

    $ 表示最后一行

    $-1 表示倒数第二行

    % 表示全文

    /pat1/,/pat2/ 从第一个pat1匹配到的地方,到pat2第一次匹配到的地方

    ,/pat/ 从第#行开始,到第一次被pat匹配到的地方

    /pat/,$ 从第一次被pat匹配到的到结尾

    可以使用的命令

    • d
    • y
    • w file 重新另存为文件
    • r file 将文件的内容写到匹配到的下一行

    查找并替换

    • 要使用地址定界来进行查找

    • s 在扩展命令模式下使用为替换

    • 格式: s/要查找的内容/要替换的内容/装饰器

    • 要查找的内容可以使用正则

    • 替换的内容不能为正则

      • 可以为分组:%s/(nfs.*)/#1/
      • 1表示第一个分组内的内容
      • 2
      • 3
      • & 可以代表前面匹配到的内容
    • 装饰器

      • i 忽略大小写
      • g 表示全部替换
      • gc 每一次替换之前都要询问是否替换
    • 分隔符还可以使用

      • @

    可视化

    • v 面向字符
    • V 面向行的
    • ctrl +v 面向块
    • 可以结合所有的跳转键进行结合
    • 对突出显示部分可以使用删除、复制、变更、过滤、替换、另存为等等

    打开多个文件

    vim file1 file2 file3

    :next 下一个

    :prev 上一个

    :first 第一个

    :last 最后一个

    :qall 退出全部

    :wall 保存全部

    :wqall 保存并退出全部

    :xall 保存并退出全部

    使用多个窗口

    vim -o 水平分隔

    vim -O 垂直分隔

    切换ctrl+w 加上上下左右箭头

    单文件切割

    ctrl+w,s 水平切割

    ctrl+w,v 垂直切割

    ctrl+w,q 取消相邻的窗口

    ctrl+w,o 取消全部窗口

    vim工作特性

    配置文件

    • 全局有效:/etc/vimrc
    • 对当前用户有效: ~/.vimrc
    • 行号:set nu 取消 set nonu
    • 忽略大小写(搜索) set ic 取消set noic
    • 自动缩进(同上一行) set ai 取消set noai
    • 设置高亮显示(搜索到的内容) set hls 取消set nohls
    • 语法高亮 syntax on 取消 syntax off
    • 文件格式
      • windows格式 set fileformat=dos
      • unix set fileformat=unix
    • 添加标识线: set cul 取消标识线 set nocul
    • 获取帮助: set all
    • 获取帮助信息:
      • :help
      • :help topic
      • vimtutor

    find

    是linux里面的一个实时查找工具,通过制定路径完成文件查找

    find [options] ..... [查找路径] [查找条件] [处理动作]

    查找路径:查找的位置,默认是当前文件夹

    查找条件:制定查找的标准,文件名、大小、类型、日期等等

    处理动作:对符合条件的文件做什么操作,默认是输出到屏幕上

    查找条件

    • 根据文件名查找

      • -name 指定名称,可以使用正则
      • -iname 忽略大小写
      • -links n 引用次数为n的文件
      • -regex 后面跟完整路径,而不是文件名, 必须整个路径完全匹配
    • 制定搜索的层级

      • -maxdepth level 最大的搜索深度,指定的目录为第1层
      • -mindepth level 最小的搜索深度,包括level层
    • 根据属主、属组来查找

      • -user username 查找属主为username的文件
      • -group groupname 查找属组为groupname的文件
      • -uid id 查找属主为id的文件
      • -gid id 查找属组为id的文件
      • -nouser 查找没有属主的文件
      • -nogroup 查找没有属组的文件
    • 根据文件类型 -type

      • d 目录
      • f 文件
      • l 符号链接
      • s 套接字
      • b 块设备
      • c 字符设备
      • p 管道文件
    • 空文件或者空目录

      • -empty
    • 条件

      • 与 -a
      • 或 -o
      • 非 -not
    • 摩根定律

      • 非(A或者B) 非A 且非B
      • 非(A且B)非A或非B
    • 排除目录

      • -path
    • [root@localhost test]#find /etc -name *_config
      /etc/ssh/ssh_config
      /etc/ssh/sshd_config
      [root@localhost test]#find /etc -path /etc/ssh -name *_config
      
    • 按照大小来查找

      • -size # (#-1,#] 不包括#-1,包括#
      • -size -# [0,#-1] 包括#-1
      • -size +# (#,......)
    • 按照时间来查找

      • -atime # [#,#+1)
      • -atime -# (0,#)
      • -atime +# [#+1,....]
      • 查找7天以后的文件 find -atime +7
      • -mtime
      • -ctime
      • 以分钟为单位
        • -amin
        • -mmin
        • -cmin

    处理动作

    • -print 默认的处理动作,显示在屏幕上
    • -ls 类似于ls -l 显示长格式
    • -delete 删除查找到的文件
    • -fls file 将查找的结果以长格式保存到文件中
    • -ok command {} ; 对每一个查找到的文件执行command命令,在执行命令之前要先提示用户是否要执行
    • -exec command {} ; 对查到的每一个文件执行command命令,不需要确认,一次性交给后面命令处理

    xargs

    • 有的命令不支持管道
    • 命令参数过长
    • xargs 将管道前面的内容一条一条的交给后面命令处理
    • 一般会跟find使用

    linux三贱客

    grep

    awk

    sed

    grep

    grep [option] "模式" file

    option

    --color=auto 对匹配到的行添加颜色
    -v 取反
    -i 不区分大小写
    -n 查找的内容增加行号
    -c 打印匹配到的行数
    -o 只显示匹配到的文字
    -q 静默模式
    -A # after 向下显示#行
    -B # before 向上显示#行
    —C # context 上下分别显示#行
    -e 或者 grep -e 'user' -e 'root' passwd
    -E 扩展正则表达式
    -F 不使用正则表达式
    -r 递归
    -w 匹配整个单词
    

    正则表达式元字符

    • 字符匹配

      • . 任意单个字符
      • [] 匹配指定范围内的任意单个字符 [0-9] [a-z] [A-Z]
      • [^] 取反
      • [:upper:] 大写字母
      • [:lower:] 小写字母
      • [:alnum:] 字母和数字
      • [:alpha:] 大小写字母
      • [:digit:] 数字
      • [:black:] 空白
      • [:punct:] 标点符号
    • 匹配次数

      • * 表示任意次数
      • .* 任意字符任意次数
      • ? 表示0或者1次
      • + 至少一次
      • {n} 表示n次
      • {m,n} 最少m次,最多n次
      • {n,} 至少n次
      • {,n} 至多n次
    • 位置锚定

      • ^ 开头
      • $结尾
      • ^$ 空行
      grep -v "^#" /etc/ssh/sshd_config |grep -v "^$" 显示不以#开头并且不是空行
      
    • 分组

      grep "(c|C)at" a
      
    • 向后引用

      • 1 前面第一个括号出现的内容匹配完成之后再后面在出现一次
      • 2
    • 扩展正则表达式

      • 与正则表达式的区别是不需要转义

    压缩

    gzip

    压缩文件

    gzip [option]... file
    -c 将压缩结果输出到屏幕,保留原来的文件
    gzip -c passwd > passwd.gz
    -1-9 指定压缩比,默认9
    -d 解压
    zcat 不解压的情况下查看压缩比内的内容
    gunzip 解压
    

    bzip2

    bzip [option] file

    直接压缩
    bunzip2 解压
    -k 保留原来的文件
    -d 解压
    -1-9 指定压缩比
    bzcat 不解压的情况下查看压缩包的内容
    

    xz

    xz [option] file

    unxz 解压
    -k 保留原来的文件
    -d 解压
    -1-9 指定压缩比
    xzcat 不解压直接查看
    

    zip

    zip [option] zipfile 要压缩的文件
    zip -r network.zip /etc/sysconfig/network-scripts 
    unzip network.zip
    

    tar

    归档工具

    归档
    tar cpvf etc.tar /etc 
    c 创建
    v 显示过程
    f 指定归档文件
    p 把原来的属性也带过来
    tar -r -f etc.tar /etc 追加
    tar -t -f etc.tar 查看归档文件内的内容
    tar xf etc.tar  解压文件
    tar xf etc.tar -C 
    -z 使用gzip压缩
    -j 使用bzip2压缩
    -J 使用xz压缩
    --exclude 排除文件
    
    

    split

    split -b 指定大小 文件(只能为文件) 切割以后的名字
    -d 指定后缀为数字
    -a 指定后缀几位
    cat 切割后的文件 > 新文件
    
    

    用户

    • 超级管理员用户 root 0
    • 普通用户
      • 系统用户: 用来启动系统的一些服务和进程的用户,不可以登陆 1-999(centos7)1-499 (centos6)
      • 可登陆用户:能登录系统的用户 1000-65535(centos7)500-65535(centos6)

    useradd

    Usage: useradd [options] LOGIN
           useradd -D
           useradd -D [options]
    普通用户的id是递增,系统用户的id是递减的
    -d 用来指定用户的家目录
    -g 指定用户组的id
    -G 指定用户的附加组
    -k 指定复制那个文件夹下的内容,需要和-m一起使用
    -m 创建用户的家目录
    -c "message" 指定用户的描述信息
    -N 不创建同名的组,以users为组
    -s 指定用户登录后使用的shell
    -u 指定用户的id
    —D 显示系统的默认配置
    -D [options] 可以修改系统的默认配置
    
    • 相关文件
      • /etc/default/useradd 创建用户的默认文件
      • /etc/skel/* 默认复制的文件

    用户修改usermode

    -c 修改描述信息
    -d 修改家目录,默认不会创建新目录,如果想移动家目录,则需要使用-m
    -g 修改用户组
    -G 修改用户的附加组,默认情况下是替换
    -a 追加附加组
    -l newname 修改用户的登录名称
    -L 锁定用户,不能登录系统,修改密码默认情况下回解锁
    -U 解锁用户
    -s 修改用户登录后的shell
    -u 修改用户的uid
    -e 年-月-日 修改用户的过期时间,过期以后不能登录
    

    删除用户 USERDEL

    默认删除用户不删除用户的家目录
    -r 删除家目录
    -f 强制删除
    默认情况下,用户登录状态下是不能删除用户,强制删除用户以后,用户还是可以用的
    

    查看用户相关信息id

    -g 只显示组id
    -G 只显示附加组id
    -u 只显示用户id
    -n 显示名称,需要和guG来配合使用
    

    切换用户

    su [options] [-] [USER [arg]...]
    

    切换用户的方式

    • 完整切换:su - username 登录式切换,环境变量等都会切换
    • 不完整切换:su username 不会切换用户的环境变量家目录等
    • root切换普通用户不需要密码,非root用户切换需要密码

    切换用户执行命令

    [root@localhost ~]#su - peiqi -c "whoami"
    peiqi
    

    执行本身不能执行的命令

    sudo 配置文件为/etc/sudoers

    peiqi   ALL=(ALL)       NOPASSWD:ALL
    其中的NOPASSWD 是不需要输入密码
    

    /etc/passwd文件

    • 用户名称
    • 密码,使用x来占位
    • uid
    • gid
    • 描述信息
    • 家目录
    • 登录后使用的shell

    设置密码passwd

    passwd [OPTION...] <accountName>
    -d 删除指定用户的密码,删除密码之后就不能登录
    -l 锁定用户
    -u 解锁用户
    -e 在下次登录以后强制用户修改密码
    -f 强制操作
    -x maxday 密码的最长使用时间
    -n minday 密码的最短使用时间
    -w warnday 密码过期前多长时间提醒
    -i inactiveday 密码过期多长时间以后禁用
    --stdin 从标准输入读取密码 echo '123'|passwd --stdin peiqi
    

    存放文件/etc/shadow

    • 用户名
    • 密码 $加密方式(默认sha512)$盐$加密后的字符串$
    • 从1970年1月1日到最近一次修改密码经过的时间
    • 密码的最短使用时间(0表示随时可以修改)
    • 密码的最长使用时间(99999表示永不过期)
    • 密码过期多长时间提醒(默认是一周)
    • 密码过期多长时间锁定
    • 从1970年1月1日开始算起,多长时间后账号失效

    密码的复杂性策略

    • 必须包括数字、大小写、特殊字符
    • 密码必须12位以上
    • 不能为弱口令
    • 必须为随机密码
    • 3个月或者半年修改一次

    机器免密登录

    ssh-keygen 一路回车
    ssh-copy-id 要登录的机器
    

    修改用户密码策略 chage

    -E
    -I
    -m
    -M
    -W
    change login 可以使用交互式的修改密码策略
    

    chfn 修改用户的个人信息

    用户组

    • 超级用户组 root 0
    • 普通用户组
      • 系统用户组 1-999(centos7) 1-499(centos6)
      • 可登陆用户组 1000-65535(centos7)500-65535 (centos6)
    groupadd
    -g 指定组id
    -r 创建系统用户组
    

    组的文件

    /etc/group

    • 组名
    • 密码占位
    • gid
    • 组成员

    /etc/gshadow

    • 组名
    • 密码
    • 组管理员的密码
    • 组成员

    修改组信息

    groupmod

    -g 修改gid
    -n 修改组名
    

    删除组

    groupdel 删除组

    软件

    windows exe

    centos(redhat) rpm

    rpm: radhat package manager

    rpm

    yum

    包的命名规范

    MySQL-python-1.2.5-1.el7.x86_64.rpm  
    名字-版本(大版本.小版本.修订版)-打包版本.可用的系统.架构.rpm
    架构:
    	x86_64
    	x86
    	i386
    	i486
    	i686
    	ppc
    	noarch 表示通用
    

    包的来源

    • 光盘
    • 第三方网站
    • 官方网站
    • 自己做
    • https://pkgs.org
    • epel 第三方包的结合地

    rpm 包的查询

    rpm -q 查询指定的包是否安装
    -a  all 表示当前系统安装的所有的包
    -f filename 查询指定的文件由那个包安装生成
    -c 查看指定的包生成了哪些配置文件
    -d 查询指定的包生成了哪些文档
    -i 查询指定包的详细信息
    -l 查询指定的包生成到文件
    常用的选项
    -qi
    -qa
    -ql
    -qc
    -qd
    

    yum

    yum 会自动解决依赖关系

    仓库 存放的是 多个包和包的元数据信息(所在仓库,依赖关系)

    仓库的位置:

    • http://
    • https: //
    • ftp: //
    • file: //(本地文件)
    • 配置文件存放在/etc/yum.repos.d

    yum配置文件

    [base] #名称
    name=CentOS-$releasever - Base - mirrors.aliyun.com # 描述信息
    failovermethod=priority # 定义挑选顺序 priority 按顺序 roundrobin 随机
    baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
            http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
            http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/
    enabled ={0|1} 是否启用,1启用,0是不启用
    gpgcheck={0|1} 使用校验
    gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 # 校验文件
    默认值
    $releasever 发行版
    $basearch 系统架构
    

    yum 源

    • 阿里
    • 163
    • sohu
    • 腾讯
    • 北大
    • 中科大学
    • 。。。。

    yum命令

    • yum repolist 查看仓库
    • yum list 列出仓库里面所有的包 安装的包前面带@
    • yum install 安装包
    • yum reinstall 重新安装
    • yum update 更新所有的包
    • yum update pkg 更新指定的包
    • yum downgrade 降级
    • yum check-update 检查包是否可以更新
    • yum remove 卸载包
    • yum info pkg 显示包的详细信息
    • yum clean all 删除元数据信息
    • yum makecache 重新构建元数据信息
    • yum search 搜索软件包(包名称、描述信息只要包含就可以搜索出来)
    • yum provides 搜索命令是由哪个包提供的

    软件包组

    • yum grouplist 查看包组
    • yum groupinstall 安装
    • yum groupinfo 获取包的信息,查看包组有哪些包组成
    • yum groupupdate 更新
    • yum groupremove 卸载包组

    yum选项命令

    -y 自动确认

    -q 静默模式

    源码安装

    • 下载 wget https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz
    • 解压文件 tar xf
    • 切换目录 cd
    • 可以查看帮助信息 README INSTALL 文件
    • 安装所需文件
    • 编译(检查程序所需的文件)./configure
    • 构建安装程序 make
    • 安装程序 make install
    • 配置环境变量

    全双工通信

    磁盘管理

    查看磁盘空间的占用

    df 
    -h 显示人类易读的方式
    linux下磁盘命名格式
    /dev/sd[a-z]
    

    查看目录的占用空间

    du
    -s 查看目录
    -h 显示人类易读的方式
    du -sh /*
    

    dd

    dd if=/dev/zero of=file bs=size count=number
    if = input file 表示从inputfile里面读取内容
    of = output file 表示将读出的数据写入到什么地方
    bs = byte size 可以是K,M,G,T
    

    RAID 阵列卡

    • raid0
      • 读、写速度有所提升
      • 可用空间N(磁盘的个数)*每一块的大小
      • 没有容错能力
      • 最少磁盘数2
    • raid1
      • 读有所提升,写性能下降
      • 可用空间,所有磁盘中最小的一块大小
      • 有容错能力
      • 最少是2,2N
    • raid5
      • 读写速度有提升
      • 可用空间(N-1)*大小
      • 有容错能力,最多可以坏一块硬盘
      • 最少要3块
    • raid6
      • 读写速度有所提升
      • 可用空间(N-2)*大小
      • 有容错能力,最多可以坏2块
      • 最少要4块
    • raid10
      • 先实现raid1,在实现raid0
      • 读写性能有提升
      • 可用空间N*大小/2
      • 有容错能力,每组镜像可以坏一块
      • 最少要4块
    • raid01
      • 先实现raid0,在实现raid1
      • 读写性能有提升
      • 可用空间N*大小/2
      • 有容错能力,只能坏同一组的
      • 最少要4块

    网络

    网络基础知识

    ipv4:4段 32位

    网络位+主机位

    网段:

    主机:

    A
    网络位为8位

    主机位为24位

    第一位不可以变

    0 0000001

    0 1111111

    1-126

    127 有特殊用途,回环地址

    可用网段数:2^7 -1

    每一个网段有多少可用主机:2^24-2

    有两个是不可以用:

    主机位全为0,表示一个网段

    主机位全为1,表示网段里面的广播地址

    私有地址:自己可以用的

    子网掩码:255.0.0.0

    10 段

    共有地址: 都可以访问的地址

    1.1.1.1/8

    00000001.0.0.0

    11111111.0.0.0

    1.0.0.0

    B

    16位网络位

    16位为主机位

    10 000000 00000000

    10 111111 11111111

    128

    191

    可用网段:2^14

    每个网段有多少可用主机:2^16-2

    私有地址:

    172.16-172.31

    子网掩码:255.255.0.0

    C

    前24位为网络位

    后8位为主机位

    110 00000 000000000 00000000

    110 11111 11111111 11111111

    192

    223

    可用网段:2^21

    每个网段有多少可用机器:2^8-2

    私有地址:

    192.168.0 -192.168.255

    子网掩码 255.255.255.0

    D

    作为多播地址

    1110 0000

    1110 1111

    224

    239

    E

    作为科研使用

    CIDR(无类域间路由)

    网络位向主机位借位

    16 +5

    21位网络位 11个 2^11 2046

    255.255.11111000.0

    255.255.248.0

    网络位向主机位借位:

    24+6 30

    2^2 -2

    子网掩码

    网络位全为1,主机位全为0

    ip地址和子网掩码来确定属于那个网段

    按位与 :只要有0就是0,全部为1,才是1

    1&0 0
    2&3 2
    

    按位或:只要有1就是1,全部为0,才是0

    1|0 1
    2|3 3 
    

    异或:相同为0,不同为1

    1^0 1
    2^3 1
    3^5 6
    

    取反:-(n+1)

    ~2  -3
    ~-4 3
    

    左移:n*2的左移次方

    2<<2 8
    10<<3 80
    

    右移:n/2的右移次方(向下取整,不是四舍五入)

    12>>2 3
    13>>2 3
    50>>2 12
    2>>2 0
    

    10.20.43.65/10

    网段

    10.20.43.65
    00001010.00010100.
    11111111.11000000
    10.0.0.0
    

    网络配置

    • 手动
      • ip
      • 配置文件
    • 自动分配
      • dhcp

    ip

    • 增加ip地址

      ip a add 192.168.21.23/24 dev ens33

    • 删除 ip

      ip a del 192.168.21.23/24 dev ens33

    • 增加ip地址并增加别名

      ip a add 192.168.21.23/24 dev ens33 label ens33:0

    • 删除

      ip a del 192.168.21.23/24 dev ens33 label ens33:0

    网卡配置文件

    • 配置文件 /etc/sysconfig/network-scripts/ifcfg-name

      TYPE="Ethernet"  # 网卡的接口类型
      PROXY_METHOD="none"
      BROWSER_ONLY="no"
      BOOTPROTO="dhcp" # 获取ip地址的方式,可以是dhcp,static,none
      DEFROUTE="yes"
      IPV4_FAILURE_FATAL="no"
      IPV6INIT="yes"
      IPV6_AUTOCONF="yes"
      IPV6_DEFROUTE="yes"
      IPV6_FAILURE_FATAL="no"
      IPV6_ADDR_GEN_MODE="stable-privacy"
      NAME="ens33" # 网卡名称
      UUID="c252096f-57e0-41bd-a1d9-5158a86f9ba1" # 设备唯一标识码
      DEVICE="ens33" 
      ONBOOT="yes" #开机是否启动
      HWADDR="" #mac地址
      IPADDR=ip地址
      NTEMASK=子网掩码
      GATEWAY=网关
      

    DNS配置文件

    • /etc/reslov.conf

      nameserver 192.168.21.2
      

    主机名

    • 获取主机名 hostname
    • 设置主机名 hostname name
    • 配置文件
      • /etc/hostname centos7
      • /etc/sysconfig/network centos6
    • 永久生效
      • hostnamectl set-hostname s22
      • 修改配置文件

    ss、netstat

    ss命令用来打印linux系统中网络的状态信息,可以让管理员更好的了解网络情况

    -a 所有
    -l 监听中的
    -t tcp
    -u udp
    -x unix socket文件
    -p 相关的程序
    -n 显示服务的端口号
    常用组合 -anlp -tnlp -unlp
    * ipv4 0.0.0.0 表示当前主机上的所有ip地址
    :: ipv6 所有地址
    

    解析

    • 本地解析 /etc/hosts
    • dns解析
    • 根节点 总共13组

    wget

    用来下载网络资源

    -q 静默模式
    -c 断点续传
    -O filename 另存为的名称
    -P 保存到指定的目录
    -r 递归下载
    -p 下载所有的html文件
    

    systemctl

    管理服务 service

    start name ... 启动服务

    stop name ... 关闭服务

    reload name 重读配置文件 平滑重启

    restart name 重启服务

    status name 查看状态

    enable name 开机自启动

    disabled name 关闭开机自启动

    systemctl list-unit-files |grep sshd 查看服务是否开机自启动

    centos6

    service 动作 服务

    chkconfig 用来管理服务的开机启动
    补充内容

    1.crontab的日志

    /var/log/cron

    2.命令最好写绝对路径

    3.ping

    -c 指定次数
    ICMP 协议    ---> 自行百度
    

    进程

    查看进程 ps

     ps [options]
    

    支持的命令格式

    • unix格式:-h -e
    • BSD格式:a,x,u
    • GNU长格式:--help

    选项

    [root@s22 ~]#ps
       PID TTY          TIME CMD
     28019 pts/4    00:00:00 ps
     83674 pts/4    00:00:00 bash
    pid   终端       当前命令占用cpu的时间  命令
    a 所有的终端
    x 包括不连接终端的终端
    u 显示进程详细信息
    f 显示进程树
    k 指定排序方式 ,默认是递增,如果想递减,则需要在排序的字段上加上-
    o 指定显示的属性,不能跟u同时使用
    L 获取支持的选项,
    -L 显示线程
    -e 相当于 ax
    -f 显示详细信息,相当于u
    -F 显示更详细信息
    -H 显示树状结构
    -U username 获取指定的用户信息
    常用选项: aux -ef -eFH
    

    ps输出属性

    VSZ 虚拟内存(程序认为可以获取到的)

    RSS 实际内存

    psr cpu编号

    STAT 状态

    %cpu cpu的占用率

    %mem 内存的占用率

    根据名称来查询进程

    pidof name
    [root@s22 ~]#pidof python
    1169 825
    

    系统工具

    uptime

    [root@s22 ~]#uptime 
     09:17:40 up 1 day, 22:19,  5 users,  load average: 2.14, 1.59, 0.84
     当前时间    当前服务器运行时长  当前的在线用户数    cpu的负载 1分钟 5分钟 15分钟
     cpu平均负载:在特定时间之内cpu运行的平均进程数,不超过cpu核心数的2倍认为为良好
    

    top

    首部信息

    • uptime信息 l 显示与隐藏

    • tasks :进程总数,运行,睡眠数,停止数,僵尸进程 t

    • cpu信息:
      %Cpu(s): 0.3 us, 4.6 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

      ​ 用户空间 系统空间 nice值 空闲 等待 硬中断 软中断 虚拟机偷走时间

    • 内存信息 m

    • cpu分别显示 1(数字)

    排序:

    模式是cpu的占用率 P

    M:内存占用率

    T: cpu的占用时间

    退出:q

    修改刷新频率:s,默认是3秒

    杀死进程:k,默认是第一个

    W 保存文件

    选项:

    ​ -d 刷新时间

    ​ -b 显示所有的信息

    ​ -n # 指定刷新#次后退出

    htop

    • epel源

    性能分析

    free

    -b 字节
    -k kb
    -m mb
    -g gb
    -h 人类易读方式
    -c # 刷新次数
    

    vmstat

    vmstat [options] [delay [count]]
    [root@s22 ~]#vmstat 1 3 每秒刷新一次,刷新3次
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0  37028 162708      0 808588    0    0     8     6   34   34  0  2 97  0  0
     0  0  37028 162560      0 808588    0    0     0     0 4535 6893  1  5 95  0  0
     0  0  37028 162544      0 808588    0    0     0     0 4463 6772  0  5 95  0  0
    procs:
    r:正在运行的进程个数
    b:阻塞队列的长度
    memory:
    swap: 虚拟内容大小
    free: 空闲物理内存的大小
    buff:用于buff的大小
    cache:用户cache的大小
    swap:
    si:从磁盘交换到内存的数据速率(kb/s)
    so: 从内存交换到磁盘的数据速率(kb/s)
    io:
    bi: 从磁盘读取到系统的速率(kb/s)
    bo: 从系统写入到磁盘的速率(kb/s)
    system:
    in:中断频率
    cs:进程之前切换的频率
    cpu:
    us
    sy
    id
    wa
    st
    

    iostat

    查看磁盘读写速度

    iostat 1 10

    dstat 查看所有

    -c cpu
    -d 硬盘
    -m 内存
    -n 网络
    -p 进程
    -r io请求
    -s swap
    --top-cpu 显示占用cpu最多的进程
    --top-io 显示占用io最多的进程
    --top-mem 显示占用内存最多的进程
    --tcp 显示tcp的信息
    --udp 显示udp的信息
    

    iftop 显示网卡的流量

    进程的管理工具

    kill

    向进程发送信号,实现对进程的管理,每个信号,对应不同的值,对应不同的含义,不区分大小写

    查询可用信号:kill -l

    常用信号:

    1) sighub 不需要关闭程序,重新加载配置文件

    1. sigint 终止进程,相当于ctrl+c

    9) sigkill 强制杀死进程

    1. sigterm 终止正在运行的进程

    18)sigcont 继续运行

    19)sigstop 后台休眠

    按照pid: kill-n pid

    按照名称:killall -n name

    按照名称:pkill -n name

    作业管理

    • 前台作业:一直占用终端的作业
    • 后台作业:不占用当前的终端

    让作业运行于后台:

    • ctrl+z 对于启动中
    • command & 也会输出到终端

    脱离终端:

    • nohup command &>/dev/null &

    • screen

      -list 查看所有的screen窗口
      -r 进入
      

    安全

    防火墙

    • 绿盟
    • 深信服
    • 启明星辰
    • 飞塔
    • 思科
    • 华为
    • 华三
    4表5链
    iptables -L 查看 防火墙策略
    iptables -F 清空 防火墙
    systemctl disable firewalld 开机并启动
    systemctl stop firewalled
    

    selinux

    美国国家安全局

    • 配置文件 /etc/selinux/config
    • SELINUX=disabled
    • setenforce 0 临时生效
    • getenforce 查看selinux的状态

    rhcea

    rhce

    rhca

    ccnp

    ccie

    ccia

    ocp

    编译后的软件如果想删除,直接删除编译生成到目录就可以

    虚拟环境

    安装

    pip3 install virtualenv -i https://pypi.douban.com/simple
    

    创建虚拟环境

    virtualenv --no-site-packages django11 
    --no-site-packages 创建一个全新的python环境
    --python 指定以哪个python来创建虚拟环境
    

    进入虚拟环境

    source envdir/bin/activate 
    

    退出虚拟环境

    deactivate
    

    确保环境一致

    在windows上执行如下命令:
    将windows上安装的包做快照
    pip freeze > requirement.txt
    将requirement.txt发送到linux上
    切换虚拟机
    pip install -r requirement.txt -i https://pypi.douban.com/simple
    

    virtualenvwrapper

    为了解决虚拟环境管理的问题,因为虚拟环境可以在任何目录下创建

    1. 安装
    pip3 install virtualenvwrapper -i https://pypi.douban.com/simple
    2.修改文件
    vim ~/.bashrc
    export WORKON_HOME=/envdir  
    export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'   
    export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3      
    source /opt/python36/bin/virtualenvwrapper.sh 
    3. 加载~/.bashrc
    source ~/.bashrc
    4.创建环境
    mkvirtualenv django11 创建并切换
    5.进入虚拟环境
    workon name
    6.切换到当前虚拟环境的文件夹
    cdvirtualenv
    7.切换到当前虚拟环境的第三方包的文件夹
    cdsitepackages
    8.退出
    deactivate
    9.列出当前管理的虚拟环境
    lsvirtualenv
    10.列出当前虚拟环境的第三方包
    lssitepackages
    11.删除虚拟环境
    rmvirtualenv 必须要退出才能删除
    

    mysql

    mariadb 是mysql的分支

    可以直接在官方网站下载

    下载

    wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.27-1.el7.x86_64.rpm-bundle.tar
    

    解压

    tar xf MySQL-5.6.44-1.el7.x86_64.rpm-bundle.tar
    

    安装

    yum install -y *.rpm
    

    默认安装位置:/var/lib/mysql

    报错信息:

    2019-08-30T11:18:22.976635Z 0 [Warning] Can't create test file /mydata/mysql/localhost.lower-test
    2019-08-30T11:18:22.976687Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.27) starting as process 2788 ...
    2019-08-30T11:18:22.980289Z 0 [Warning] Can't create test file /mydata/mysql/localhost.lower-test
    2019-08-30T11:18:22.980338Z 0 [Warning] Can't create test file /mydata/mysql/localhost.lower-test
    解决办法:setenforce 0
    
    

    重置密码

    默认密码:
    grep 'pass' /var/log/mysqld.log
    mysql_secure_installation
    输入root密码
    是否要修改密码
    是否要修改root密码(大小写、数字、特殊字符)
    是否要删除匿名用户
    是否禁止root远程登录
    是否要删除test数据库
    是否要刷新表的权限
    

    密码校验规则

    设置密码的校验规则
    mysql> set global validate_password_policy=0;
    0 校验级别最低,只校验密码的长度,长度可以设定
    1 必须包括大写字母、小写字母、数字、特殊字符
    2 必须满足上面两条,并追加,对于密码中任意连续的4个(或者4个以上) 字符不能是字典中的单词
    mysql> set global validate_password_length=3; 修改密码的最短长度
    

    创建用户

    create user 'username'@'ip' identified by 'password';
    全部ip的话则是%
    

    查看权限

    show grants;
    

    用户授权

    mysql> grant all on *.* to 'root'@'%' identified by '1234';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    

    mysql主从

    主服务器上配置如下

    server-id=1 设置id
    log-bin=/mydata/log/master-bin 启动binlog日志
    sync_binlog = 1 确保主从复制事务安全
    

    主服务器执行如下sql

    mysql> grant replication slave on *.* to 'slave'@'192.168.21.131' identified by '1234';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.01 sec)
    show master statusG
    

    从服务配置如下:

    server-id =12
    relay_log =/mydata/log/slave-log
    sync_binlog = 1
    read-only=ON
    

    从服务器执行如下sql

    
    CHANGE MASTER TO
      MASTER_HOST='master2.example.com',
      MASTER_USER='replication',
      MASTER_PASSWORD='password',
      MASTER_PORT=3306,
      MASTER_LOG_FILE='master2-bin.001',
      MASTER_LOG_POS=4,
      MASTER_CONNECT_RETRY=10; #监控主服务器的时间
    # 连接主库
    change master to master_host='192.168.21.128',master_user='slave',master_password='1234';
    # 启动进程
    start slave;
    # 查看状态
    show slave statusG
    

    问题:

    Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
    解决办法:
    rm -rf /mydata/mysql/auto.cnf
    systemctl restart mysqld
    

    mysql备份与恢复

    数据库

    备份

    mysqldump

    • 锁表
    • 备份特别慢,适用于数据量较小
    • 不可以做增量备份
    • 单线程
     -A, --all-databases 所有的库
     -B 指定备份的库
     —F 备份前刷新日志
     --flush-privileges 刷新授权表
     -p 密码
     -u 用户
     -P 端口
     触发器
     存储过程和存储函数
     ## 备份
     mysqldump -uroot -S /mydata/mysql/mysql.sock -A -p > mysql.sql
     ## 恢复一
     直接在数据库里面source mysql.sql文件
     ## 恢复二
     mysql -uroot -p < mysql.sql
    

    xtrabackup

    • 多进程
    • 支持增量备份
    • 锁行
    安装
    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm # 安装yum仓库
    yum install -y percona-xtrabackup-24
    --target-dir=name # 指定备份生成的目录
    --backup 备份
    --prepare 准备
    --databases=name    filtering by list of databases.
    --databases-file=name 配置文件
    

    创建一个用户

    mysql> create user 'backup'@'localhost' identified by 'backup';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> grant reload,lock tables,process,replication client on *.* to 'backup'@'localhost';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    

    备份

    xtrabackup --backup --target-dir=/mydata/backup/base -ubackup -pbackup --socket=/mydata/mysql/mysql.sock
    ### 看得如下信息,代表成功
    xtrabackup: Transaction log of lsn (5480853) to (5480862) was copied.
    190902 09:25:09 completed OK!
    

    恢复

    准备文件

    xtrabackup --prepare --target-dir=/mydata/backup/base
    InnoDB: Starting shutdown...
    InnoDB: Shutdown completed; log sequence number 5482536
    190902 09:28:12 completed OK!
    

    恢复文件

    cd /mydata/backup/base
    cp -rf hello /mydata/mysql/
    chown mysql.mysql /mydata/mysql/hello/ -R
    

    恢复全部文件

    xtrabackup --copy-back --target-dir=/mydata/backup/base
    chown mysql.mysql * -R
    

    增量备份

    xtrabackup --backup --target-dir=/mydata/backup/t1 --incremental-basedir=/mydata/backup/base -uroot -p --socket=/mydata/mysql/mysql.sock
    --incremental-dir 全备的路径
    xtrabackup --backup --target-dir=/mydata/backup/t2 --incremental-basedir=/mydata/backup/t1 -uroot -p --socket=/mydata/mysql/mysql.sock
    --incremental-basedir应该是上一次的增量备份目录
    xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base
    

    恢复(只能全部删除以后再恢复)

    xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base
    xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base --incremental-dir=/mydata/backup/t1
    xtrabackup --prepare --apply-log-only --target-dir=/mydata/backup/base --incremental-dir=/mydata/backup/t2
    xtrabackup --copy-back --target-dir=/mydata/backup/base
    chown mysql.mysql * -R
    systemctl restart mysqld
    

    nginx

    web服务 apache iis

    django web框架

    lvs 负载均衡 章文嵩博士

    vue 尤雨溪

    Tengine

    F5 硬件负载

    A10

    安装

    wget http://nginx.org/download/nginx-1.16.1.tar.gz
    tar xf nginx-1.16.1.tar.gz 
    cd nginx-1.16.1
    yum install gcc zlib2-devel pcre-devel openssl-devel
     ./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module
     make && make install
    

    目录结构

    [root@localhost nginx]#ls
    conf  html  logs  sbin
    conf 配置文件
    html 存放静态文件 index.html 是默认的欢迎页面
    logs 日志目录
    sbin 二进制文件
    启动以后会生成一个主进程,根据配置文件的选项来生成子进程(工作进程),主进程不负责处理用户的请求,用来转发用户的请求,真正负责处理用户请求的是子进程
    

    命令格式

    ./sbin/nginx -h
    nginx version: nginx/1.16.1
    Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
    
    Options:
      -?,-h         : this help
      -v            : show version and exit 显示版本号
      -V            : show version and configure options then exit 显示版本+编译时选项
      -t            : test configuration and exit  测试配置文件
      -T            : test configuration, dump it and exit
      -q            : suppress non-error messages during configuration testing
      -s signal     : send signal to a master process: stop, quit, reopen, reload
      -p prefix     : set prefix path (default: /opt/nginx/)
      -c filename   : set configuration file (default: conf/nginx.conf)
      -g directives : set global directives out of configuration file
    

    配置文件

    #user  nobody;    使用哪个用户来启动子进程
    worker_processes  1; #工作进程的个数,配置成cpu的核心数-1或者-2
    # cpu亲缘性绑定,让nginx的子进程工作在哪个核心上
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        #use [epoll|select|poll];
        worker_connections  102400; # 每一个子进程可以处理的连接数
    }
    
    
    http {
        include       mime.types; #导入
        default_type  application/octet-stream; # 默认的请求方式
        # 定义日志格式
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
        #定义日志并定义日志格式
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65; # 保持长连接的超时时间
    
        #gzip  on;
    
        server {
            listen       80; #监听端口
            server_name  localhost; 
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;  # 指定静态文件地址
                index  index.html index.htm; # 指定默认的index页面
            }
    		# 错误页面 找不到页面
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            # 错误页面 服务端错误
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ .php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ .php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }
    
    

    404页面

    error_page  404              /404.html;
    

    root和alias的区别

     location /img {
     	root /data/img;
     }
    root /data/img 里面必须有/img
     location /img {
     	alias /data/img;
     }
     alias /data/img 里面不需要有 /img
    

    域名

    server_name ms.s22.com
    

    多域名访问

      server  {
            listen 80;
            server_name www.taobao.com taobao.com;
            location / {
            root /data/taobao;
            index index.html;
            }
    
    }
       server  {
            listen 80;
            server_name www.jd.com jd.com;
            location / {
            root /data/jd;
            index index.html;
            }
            }
    

    默认server

    listen 80 default_server;
    

    nginx的日志

     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    remote_addr 访问ip地址
    remote_user 访问的用户
    time_local 本地时间
    request 包括请求方式  请求地址  请求协议版本
    status 状态码
    body_bytes_sent 发送的大小
    http_user_agent 用户的请求头
    http_x_forwarded_for
    

    禁止访问

    可以写在server或者location里面
    deny 192.168.21.1;
    allow 192.168.21.131;
    deny 192.168.21.0/24;
    
    

    反向代理

    • 起到保护网站安全的作用
    • 可以缓存静态文件
    • 实现负载均衡 F5 A10 lvs haproxy nginx
    upstream django {
            server 192.168.21.128:81;
    }
     server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            proxy_pass http://django;
            }
    
    

    权重

    weight

    upstream django {
    	server 192.168.21.128:81 weight=3;
    	server 192.168.21.131:81
    }
     server {
            listen       80 default_server;
            listen       [::]:80 default_server;
            server_name  _;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            proxy_pass http://django;
            }
            }
    得到的结果是:
    访问128的3次,才访问131的一次
    

    ip_hash

    每个请求的ip做hash运算,这样每个固定的访客都会被负载到后端固定的机器

    upstream django {
    	ip_hash;
    	server 192.168.21.128:81
    	server 192.168.21.131:81
    }
    

    backup

    当前面的都访问不到,则请求backup的备份,只要有一个通,则不会走backup

    upstream django {
    	server 192.168.21.128:81;
    	server 192.168.21.131:81;
    	server 192.168.21.131:82 backup;
    }
    

    nginx location匹配规则

    location = / {
    	精确匹配/ ,后面不能带其他的东西
        [ configuration A ]
    }
    
    location / {
    	所有的以/开头的地址
        [ configuration B ]
    }
    
    location /documents/ {
    	只匹配/documents/
        [ configuration C ]
    }
    
    location ^~ /images/ {
    	# 匹配以/images/开头。
    	~严格大小写
        [ configuration D ]
    }
    
    location ~* .(gif|jpg|jpeg)$ {
    	以(gif|jpg|jpeg)结尾的文件
    	~* 不区分大小写
        [ configuration E ]
    }
    优先级
    = > 完整路径 > ^~ > /
    

    location分离

    server  {
    
            listen 80 ;
            server_name www.taobao.com taobao.com;
            location / {
            proxy_pass http://192.168.21.131:82;
            }
            location ~*.(jpg|gif|png)$ {
            root /data/img;
            }
    

    status

    location /status {
    	stub_status on;
    }
    

    压缩

    gzip on
    提高响应速度,节省带宽
    

    WSGI

    django自带的wsgiref 在调试模式下使用的wsgi的文件,网关接口,协议

    uwsgi:协议

    uWSGI:具体实现方式

    安装

    pip3 install uwsgi -i https://pypi.douban.com/simple
    

    准备django程序

    启动

    cd django目录
    uwsgi --http :8080 --module mysite.wsgi
    

    配置文件格式

    conf
    py
    cnf
    xml
    json
    ini
    yaml
    

    配置文件启动

    [uwsgi]
    http = :8080
    #项目路径
    chdir= /data/mysite
    # uwsgi的文件
    wsgi-file= mysite/wsgi.py
    # 虚拟环境
    # virtualenv = /root/env
    # 进程个数
    processes = 2
    # 线程个数
    threads=2
    # 后台启动,指定日志的输出
    daemonize=/data/mysite/django.log
    # 清除临时文件
    vacuum = true
    # python文件发生改变自动重启
    py-autoreload=1
    
    uwsgi --ini file
    

    nginx的配置文件

    server {
    	listen 80;
    	server_name crm.oldboy.com;
    	location / {
    		proxy_pass http://127.0.0.1:8080;
    	}
    	location /static {
    		root /data/supercrm;
    	}
    }
    

    在django的配置中要写入

    SATAIC_ROOT=os.path.join(BASE_DIR,'static/')
    

    执行命令

    python3 manager.py collectstatic #用来收集静态文件
    

    第二种配置方式

    uwsgi
    socket= :9090
    nginx的配置文件
    location / {
    		include uwsgi_params;
    		uwsgi_pass 127.0.0.1:8080;
    }
    

    第三种配置方式

    uwsgi
    socket = file.sock
    nginx的配置文件
    location /{
    	include uwsgi_params;
    	uwsgi_pass unix://file.sock
    }
    

    1567486021036

    nosql not only sql

    用户画像:

    热点数据:经常被使用的数据

    mysql

    安装

    • 可以使用yum 安装,要先配置epel源

      yum install -y redis
      
    • 可以编译安装

      wget http://download.redis.io/releases/redis-5.0.5.tar.gz
      tar xf redis-5.0.5.tar.gz
      cd redis-5.0.5/
      make
      

    redis 可执行文件

    redis-benchmark  #性能测试
    redis-check-aof  # 检查修复aof文件
    redis-check-rdb  # 检查修复rdb文件
    redis-cli        # redis的客户端
    redis-sentinel   # redis的集群
    redis-server     # redis的服务端
    redis-trib.rb     #集群管理
    

    启动redis

    ./src/redis-server 默认端口是6379,默认启动会占用终端
    

    性能测试

    ./src/redis-benchmark -q
    PING_INLINE: 73855.24 requests per second
    PING_BULK: 73800.73 requests per second
    SET: 74074.07 requests per second
    GET: 72833.21 requests per second
    INCR: 73637.70 requests per second
    LPUSH: 73855.24 requests per second
    RPUSH: 70175.44 requests per second
    LPOP: 72202.16 requests per second
    RPOP: 74183.98 requests per second
    SADD: 74962.52 requests per second
    HSET: 75642.96 requests per second
    SPOP: 73746.31 requests per second
    LPUSH (needed to benchmark LRANGE): 74850.30 requests per second
    LRANGE_100 (first 100 elements): 48379.30 requests per second
    LRANGE_300 (first 300 elements): 24172.11 requests per second
    LRANGE_500 (first 450 elements): 18670.65 requests per second
    LRANGE_600 (first 600 elements): 15384.62 requests per second
    MSET (10 keys): 78186.08 requests per second
    默认是100000,50个同时发起连接
    

    连接

    ./src/redis-cli
    -h ip地址
    -p 端口
    -s 套接字
    -a 密码  
    -n 指定redis的库
    redis的命令是不区分大小写
    

    redis的数据类型

    • string
    • hash
    • list
    • set
    • zset

    命令相关

    ping

    用来测试redis是否连通,返回值是pong

    info

    获取系统的信息

    echo

    打印内容,测试使用

    quit

    退出

    select

    切换redis的库,总共有16个,0-15

    del

    删除指定的一个或者多个key,不存在的key忽略

    exists

    判断key 是否存在,存在是1,不存在是0

    expire key seconds

    给指定的key设置存活时间,当key过期以后,就自动删除

    ttl

    查看key的存活时间,-2 key不存在 -1 永久生效

    keys pattern

    查找所有符合pattern 的key,支持通配符

    move key db

    移动当前的key到指定的db里面,成功返回1,失败返回0

    pexpire key 毫秒

    给一个key 设置过期时间,单位是毫秒

    pttl key

    查看key的存活时间,但是为毫秒

    randromkey

    随机获取一个key,但是不删除,如果数据库为空,则返回空

    rename

    重命名key,如果源key不存在,则报错,如果目标key存在,则覆盖

    renamenx

    重命名key,如果源key不存在,则报错,如果目标key存在,则不变

    type

    查看key所存储的数据类型,如果没有这个key,则返回none

    string

    set

    设置key value

    如果key存在,则覆盖,不存在,则新建

    ex second 设置key的存活时间,单位是秒

    px 毫秒 设置key的存活时间,单位是毫秒

    nx 如果键不存在,则新建,如果存在,则返回nil

    xx 只有键存在,才能操作

    get

    获取key对应的value,只能获取一个,如果key存在,则返回值,如果key不存在,则返回nil

    mset

    批量创建key vlaue对应关系,会覆盖已存在的key

    mget

    批量获取key,如果不存在,则返回nil

    getset

    给指定的key设置新value,并返回原来的value,如果key不存在,则返回nil

    strlen

    返回value的长度

    append

    如果key存在,则追加,如果key不存在,则新建

    incr

    将key中存在的数加1,只能对数字有效

    decr

    将key中存在的数值减1,只能对数字有效

    incrby

    将key中存在的数值指定增加多少,只对数字有效

    decrby

    将key中存在的数值减少指定的值,只能对数字有效

    getrange

    切片,同python类似,不能使用步长

    incrbyfloat(默认保留17位)

    将key中存在的数值增加指定的浮点数

    list

    lpush

    将一个或者多个value插入到列表的头部

    lpop

    移除并返回列表key的头一个元素

    lrange

    查看列表指定的元素,全部显示是0,-1

    rpush

    将一个或者多个value插入到列表的尾部(最后边)

    rpop

    删除尾部的值

    rpushx

    将value插入到key的尾部,key必须存在才可以

    lpushx

    将value插入到key的头部,key必须存在才可以

    lindex

    从表头开始,获取下标为index的value

    linsert

    将value插入到key指定的元素前或者后

    before 前

    after 后

    如果value不存在,则不操作

    llen

    获取列表长度

    lrem

    删除列表中的value

    • count > 0 从表头往表尾的方向查找,删除指定的个数
    • count = 0 全部删除
    • count < 0 从表尾的位置往表头的方向查找,删除指定的个数

    lset

    替换指定的索引位置的value,如果索引超出范围,则报错

    ltrim

    列表的切片

    hash

    {'db':{"redis":'redis.conf',"mysql':'my.cnf',"nginx":"nginx.conf"}}

    hset

    给hash增加key value值

    hlen

    获取hash的长度

    hget

    获取某个hash里面key的value

    hgetall

    获取所有的键值对

    hmset

    批量增加键值对

    hmget

    批量获取键值对

    hsetnx

    给指定的hash增加键值对,如果原来的field存在,则操作无效,如果不存在,则新增

    hkeys

    获取hash表中所有的field

    hvals

    获取hash表中所有的value

    hdel

    删除hash表中的一个或者多个field-value

    hexists

    判断hash表中的field是否存在,如果存在,则为1,不存在则为0

    hincrby

    给hash表中的field增加指定的数值,只限于数字

    hincrbyfloat

    给hash表中的field增加指定的浮点,只限于数字

    set

    sadd

    给集合添加值,如果值存在,则什么都不操作,如果值不存在,则添加

    SMEMBERS

    获取集合所有的成员

    scard

    获取集合的个数

    sdiff

    获取两个集合的差集,前面存在,但是后面不存在的

    sinter

    获取两个集合的交集

    sunion

    获取两个集合的并集

    SISMEMBER

    判断元素是否在集合中,如果存在,则为1,如果不存在则为0

    smove

    将指定的元素从一个集合移动到另外一个集合中,如果源集合存在,则移动,如果不存在,则忽略,如果目标集合存在,直接移动,如果目标集合不存在,则新建集合并移动

    spop

    随机删除指定个数的元素,并把删除的元素打印出来

    SRANDMEMBER

    随机获取指定个数的元素

    • 默认随机获取一个
    • 如果count > 0,
      • 如果count大于集合的总数的话,则全部取出
      • 如果count小于集合总数的话,则随机取出count个
    • 如果count<0,则随机count的绝对值次取出值

    srem

    删除指定的一个或者多个元素

    如何保持环境一致?

    pip3 freeze > requerment.txt

    pip install -r requerment.txt

    1.环境不一致

    2.配置文件不一致

    3.技术水平不一致,导致部署环境快慢不一致

    docker

    • 一处编译,到处运行
    • 对系统的消耗不是特别的多
    • 可以快速启动
    • 维护简单
    • 扩展容易

    镜像

    可以理解为操作系统的ios镜像

    容器

    启动后的镜像

    仓库

    镜像

    私有的仓库

    公共的仓库

    docker-ce 社区版本

    docker-ee 商业版本

    底层实现原理

    namespace

    cgroup

    linux 内核的技术

    安装

    cd /etc/yum.repos.d/
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    yum install -y docker-ce
    

    配置加速器

    vim  /etc/docker/daemon.json
    {
        "registry-mirrors": [
            "https://1nj0zren.mirror.aliyuncs.com",
            "https://docker.mirrors.ustc.edu.cn",
            "http://f1361db2.m.daocloud.io",
            "https://registry.docker-cn.com"
        ]
    }
    systemctl daemon-reload 
    systemctl restart docker
    

    第一个命令

    docker run hello-world
    

    docker 搜索镜像

    NAME     DESCRIPTION                                   STARS        OFFICIAL            
    mysql    MySQL is a widely used, open-source relation…   8560                [OK]                
    name 名字
    DESCRIPTION  描述信息
    STARS 点赞数
    OFFICIAL 是否是官方提供
    

    查看镜像命令

    docker images
    

    docker 镜像是分层的

    显示镜像的id

    docker images -q
    

    列出部分镜像

    docker images mysql
    

    删除镜像

    docker rmi name|id
    

    删除全部镜像

    docker rmi `docker images -q`
    

    启动容器

    docker run 镜像名称
    先查找本地是否存在镜像
    如果不存在则去下载镜像
    下载以后再启动
    容器启动以后在原来的镜像基础上在新建一层
    

    查看容器

    docker ps  #默认查询是运行中的容器
    -a 查看所有的
    -q 只查看容器的id
    

    容器执行命令

    docker run centos /bin/echo 'hongxu'
    

    启动并进入镜像

    docker run -ti centos /bin/bash
    -t 创建一个虚拟终端
    -i 将容器的标准输入保持打开
    退出 exit
    ctrl +d 
    --name 指定名字
    -d 后台运行
    —P 将容器的端口暴露在宿主机的随机端口上
    -p 宿主机端口:容器端口
    -v 宿主机目录:容器指定目录(可以实现将宿主机目录挂载到容器中)
    

    制作自己的镜像

    docker commit -m "xinx" mycentos:laster
    

    导出镜像

    docker save -o mycentos.tar.gz mycentos
    docker save mycentos > mycentos.tar.gz 
    

    删除容器

    docker rm # 默认只能删除未运行的容器
    -f 强制删除
    

    导入镜像

    docker load -i mycentos.tar.gz
    docker load < mycentos.tar.gz 
    

    scp

    linux之间互相传递文件

    查看端口映射关系

    docker port 容器id或者容器名称
    

    关闭docker容器

    docker stop 容器id或者容器名称
    

    启动docker容器

    docker start  容器id或者容器名称
    

    获取容器的运行状态

    docker stats  容器id或者容器名称
    

    查看日志

    docker logs  容器id或者容器名称
    -f 实时输出
    

    进入容器

    docker exec -ti  容器id或者容器名称 /bin/bash
    

    移除所有停止状态的容器

    docker container prune
    

    dockerfile

    FROM mycentos  # 指定基础镜像
    COPY epel.repo /etc/yum.repos.d/ # 复制文件
    RUN  yum install -y nginx  # 运行命令
    RUN  mdkir /data/html
    RUN  echo 'mynginx' > /data/html/index.html
    COPY nginx.conf /etc/nginx/nginx.conf #只复制
    ADD # 复制并解压压缩包
    ENV  alex=alexdsb   # 设置环境变量
    ENV  wulaoban=dsb
    WORKDIR /data/html  # 设置工作目录,exec进入之后直接进入的目录
    EXPOSE 80 # 设置端口
    VOLUME # 指定容器的目录
    CMD /bin/bash -c systemctl start nginx # 运行命令
    RUN和CMD的区别
    RUN可以有多个
    CMD只能有一个,如果有多个到话,按最后一个算
    

    build

    docker build -t name:tag -f dockerfile .
    

    部署django

    FROM mycentos
    COPY epel.repo /etc/yum.repos.d/
    RUN yum install -y python36 python36-pip python36-devel
    RUN pip3 install django==1.11 pymysql django-multiselectfield -i https://pypi.douban.com/simple
    COPY supercrm /data/supercrm
    WORKDIR /data/supercrm
    RUN python3 manage.py migrate
    EXPOSE 8080
    CMD python3 manage.py runserver 0.0.0.0:8080
    

    远程仓库

    docker login   #登录dockerhub网站
    docker tag django  wangfeng7399/django  # 修改名称
    docker push wangfeng7399/django # 上传
    

    本地仓库

    本地仓库默认使用是https

    docker run -p 5000:5000 -d -v /opt/data/registry:/var/lib/registry registry
    docker tag django 127.0.0.1:5000/django
    docker push 127.0.0.1:5000/django
    ## 检查
    curl 127.0.0.1:5000/v2/_catalog
    {"repositories":["django"]}
    

    解决办法:

    cat /etc/docker/daemon.json
    {
        "registry-mirrors": [
            "https://1nj0zren.mirror.aliyuncs.com",
            "https://docker.mirrors.ustc.edu.cn",
            "http://f1361db2.m.daocloud.io",
            "https://registry.docker-cn.com"
        ],
     "insecure-registries": [
        "192.168.21.128:5000"
      ]
    
    }
    docker tag django 192.168.21.128:5000/django
    docker push 192.168.21.128:5000/django
    

    docker 编排工具

    • swarm
    • mesos
    • k8s
    • kubernetes
    • compose 嫡系
    pip3 install docker-compose
    

    语法是基于yaml

    • 列表 -
    • 字典 key: value
    • 后缀名 yaml yml

    yaml文件

    默认是docker-compose.yml

    -f 文件

    version: '3.4'
    services:
     web:
      build:    #编译
        context: . 
        dockerfile: flaskdf
      ports:   #指定端口
      - "15000:5000"
     redis:
       image: 'redis' # 指定镜像文件
    

    启动命令是

    docker-compose up

    发布订阅

    subscribe

    订阅一个或者多个频道

    publish

    给指定的频道发送消息

    psubscribe

    订阅指定模式的频道,*代表所有

    pubsub channels

    查看当前活跃的频道

    pubsub numsub channels

    查看当前频道的订阅人数

    redis的配置文件

    bind 127.0.0.1    # 监听的地址
    protected-mode yes # 将redis运行在安全模式下
    port 6379 # 端口
    tcp-backlog 511
    timeout 0
    tcp-keepalive 300
    daemonize no # 是否以守护进程开启
    supervised no
    pidfile /var/run/redis_6379.pid
    loglevel notice
    logfile ""
    databases 16
    always-show-logo yes
    save 900 1  # 在900秒以内有1次更新,就会持久化
    save 300 10 
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb   # 数据的保存文件
    dir ./
    replica-serve-stale-data yes
    replica-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    replica-priority 100
    lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    replica-lazy-flush no
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync everysec
    no-appendfsync-on-rewrite no
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    aof-load-truncated yes
    aof-use-rdb-preamble yes
    lua-time-limit 5000
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    stream-node-max-bytes 4096
    stream-node-max-entries 100
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit replica 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    dynamic-hz yes
    aof-rewrite-incremental-fsync yes
    rdb-save-incremental-fsync yes
    requirepass foobared # 给redis设置密码
    

    auth

    密码认证

    save

    保存

    flushall

    清空所有的数据

    redis的主从

    只需要在从服务器上进行配置
    slaveof ip地址  端口
    如果有密码的话
    masterauth <password>
    命令行设置方式
    config set masterauth password
    
    • 基于异步的,平均每秒钟从服务器都会主服务器发送复制的情况
    • 一个主可以多个从
    • 不止主可以有从服务器,从也可以有从服务器
    • 复制功能不会阻塞主服务器
    • 复制功能也不会阻塞从服务器

    redis的持久化

    • rdb
    • aof

    rdb

    • 优点
      • 生成二进制文件
      • 系统会默认的多长时间保存一次
      • 直接手动保存
      • 制作快照
      • 可以用作备份
      • 比较适合做灾难恢复
      • 主进程会fork一个子进程出来,子进程用来复制保存数据
    • 缺点
      • 如果说数据需要尽量保存下来,则不适合实用rdb
      • 在数据量庞大的时候,对系统消耗过大
    save 900 1  # 在900秒以内有1次更新,就会持久化
    save 300 10 
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb   # 数据的保存文件
    dir ./ # 保存目录
    

    aof

    • 优点
      • 持久化更好
      • aof将所有的操作都追加到一个文件中,redis-check-aof
      • 文件易读
    • 缺点
      • 文件会越来越大
      • aof的速度会比rdb慢,aof 使用的是fsync
      • 文件易读
    appendonly yes
    appendfilename "appendonly.aof"
    appendfsync everysec
    

    直接通过命令从rdb切换到aof

    config set appendonly yes
    config set save ""
    

    redis的高可用

    豌豆荚:codis

    feckbook:

    主观下线:哨兵检测不到服务

    客观下线:全部哨兵同一协商

    redis cluster

    • 16384个槽位
    • 最少需要6台服务器

    准备配置文件

    ## 6380
    bind 127.0.0.1
    port 6380
    daemonize yes
    pidfile 6380.pid
    logfile 6380.log
    cluster-enabled yes
    cluster-config-file node-6380.conf
    cluster-node-timeout 10000
    ## 6381
    bind 127.0.0.1
    port 6381
    daemonize yes
    pidfile 6381.pid
    logfile 6381.log
    cluster-enabled yes
    cluster-config-file node-6381.conf
    cluster-node-timeout 10000
    ## 6382
    bind 127.0.0.1
    port 6382
    daemonize yes
    pidfile 6382.pid
    logfile 6382.log
    cluster-enabled yes
    cluster-config-file node-6382.conf
    cluster-node-timeout 10000
    ## 6383
    bind 127.0.0.1
    port 6383
    daemonize yes
    pidfile 6383.pid
    logfile 6383.log
    cluster-enabled yes
    cluster-config-file node-6383.conf
    cluster-node-timeout 10000
    ## 6384
    bind 127.0.0.1
    port 6384
    daemonize yes
    pidfile 6384.pid
    logfile 6384.log
    cluster-enabled yes
    cluster-config-file node-6384.conf
    cluster-node-timeout 10000
    ## 6385
    bind 127.0.0.1
    port 6385
    daemonize yes
    pidfile 6385.pid
    logfile 6385.log
    cluster-enabled yes
    cluster-config-file node-6385.conf
    cluster-node-timeout 10000
    

    环境准备

    安装ruby

    版本必须是2.2以上

    wget https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.4.tar.gz
    tar ruby-2.6.4.tar.gz
    cd ruby-2.6.4
    ./configure --prefix=/opt/ruby
    make && make install
    配置环境变量
    PATH=/opt/ruby/bin:$PATH
    source 
    

    安装ruby依赖

    gem install redis
    

    安装命令

    ./src/redis-cli --cluster help
    ./src/redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385
    create 创建集群
    check 检查集群
    info  查看集群信息
    fix 修复集群
    

    连接命令

    redis-cli -c -p 6380
    
  • 相关阅读:
    真爱 vs. 种姓:新一代印度人的婚恋观
    美国司法部解禁guns打印技术
    特朗普访英,吃瓜群众却只想看《真爱至上》
    Semaphore(信号量)
    RLock(递归锁)
    用python编写九九乘法表
    php传值和传引用的区别
    post请求的header
    Content-type详解
    thinkphp5 学习笔记
  • 原文地址:https://www.cnblogs.com/python001-vip/p/12625978.html
Copyright © 2020-2023  润新知