• 哔哩哔哩尚硅谷面试题总结


    ISO/OSI的七层网络模型阿

    ISO国际标准化组织

    OSI开放系统互连

    0udUdP.md.png

    1.应用层
    	给用户提供一个操作界面
    	
    2.表示层
    	表示数据(0101)
    	加密(MD5sum)
    	压缩(tar、zip)
    	
    3.会话层
    	判断数据是否进行网络传递
    	
    4.传输层
    	对报文进行分组(发送时)、组装(接收时)
    	选择传输协议:
    		TCP(传输控制协议):可靠的,面向连接的传输协议(可靠准确,慢),相当于打电话
    		UDP(用户数据包协议):不可靠的、面向无连接的传输协议(不可靠,快),相当于发短信
    	端口封装(访问server的那个端口,TCP或者UDP)
    	差错校验(数据包的发送有可能会出错)
    	
    5.网络层
    	ip地址编址(查找)
    	路由选择
    		静态路由,不需要路由器做任何运算,指定路由路径,但是配置负责
    		动态路由,路由器自动选择路由路径(自动选择路由节点最少的路径),但是会消耗CPU
    	
    6.数据链路层
    	MAC地址编址
    	MAC地址寻址
    	差错校验
    
    7.物理层
    	数据实际传输
    	硬件
    
    #数据包
    ipv4协议中,数据包的大小不能超过2*16字节,一条数据在传输层对以上层的数据进行拆包,同理,server端接收的时候对数据包进行组装
    #ip是全球唯一的
    
    #ip地址与MAC地址
    ip地址是用来不用网段的数据传输
    MAC地址是用来相同网段的数据传输
    	在同一个广播域中,通过MAC地址通讯
    	不同网段的主机通讯,ip、MAC、端口号缺一不可(端口是用来区分不同的服务的)
    	
    #TCP与UDP
    数据的传输基本使用的是TCP协议,一般考虑实时性的话才会选择UDP
    

    TCP/IP四层模型

    0udNZt.md.png

    TCP/IP协议族

    0udYqI.md.png

    TCP包头内容

    数据包的组成

    0udaIf.md.png

    1.断开
    	源端口随机生成
    	目的端口指定
    2.要发送的序列号
    3.要接收的确认号
    4.标志信号
    5.标志校验
    6.可选
    

    TCP三次握手

    2**16 = 65535

    #序号
    	seq序号,占32位二进制数,用来表示从TCP端向目的端发送的字节流,发起方发送数据时对此进行标记
    #确认号
    	ACK序号 ,占32位二进制数,只有ACK标记为1时,确认序号才有效(ACK=seq+1)
    #标志位
    	一共6个,即URG、ACK、ACK、PSH、RST、SYN、FIN等
    	URD:紧急指针有效
    	ACK:确认序号有效	#
    	PSH:接收方应该尽快将这个报文交给应用层
    	RST:重置连接
    	SYN:发起一个新连接	#
    	FIN:释放一个连接(断开连接)	#
    

    0udJsA.md.png

    最后,通讯双方都进入established状态

    TCP四次挥手

    0udwi8.md.png

    #可以针对 TIME_WAIT进行洪水攻击
    

    网段、IP、广播地址

    1.ip
    	确定网络位、主机位的ip才有意义
    	
    2.子网掩码
    	标准的表达方式,8、16、24 (表示二进制中子网掩码中1的个数)
    	网段表示,255.255.255.192
    	二进制表示方法,11111111.11111111.11111111.11000000
    
    

    子网掩码的作用

    1.ip和子网同时表示才有意义,单独的ip和子网没有任何意义(标准的子网表达方式可以省略(8/16/24))
    2.子网掩码是用来给ip地址划分网络地址与主机地址的
    3.和子网掩码1对应的ip地址,代表网络位,和子网掩码0对应的ip地址,代表主机位(二进制表示子网掩码)
    4.子网中只要1是连续的,就是合理子网掩码
    

    ABC三类ip地址的组成

    0ud0JS.md.png

    #
    10.0.0.0 - 10.0.0.255 一共256个ip地址,0代表网络本身,不能使用,255是广播地址,不能使用
    

    根据子网掩码判断ip属于哪一类地址

    0ud5z4.md.png

    1.子网掩码中,1必须是连续的,否则无意义
    

    0udTy9.md.png

    网络地址

    ip		172.22.141.231		10101100.00010110.10001101.11100111
    子网掩码  255.255.255.192     11111111.11111111.11111111.11000000
    
    逻辑与运算                    10101100.00010110.10001101.11000000
    网络地址  172.22.141.192
    

    广播地址

    ip		172.22.141.231		10101100.00010110.10001101.11100111
    子网掩码  255.255.255.192     11111111.11111111.11111111.11000000
    
    #有效子网掩码,也就是0和1抢的那一段
    公式运算                      10101100.00010110.10001101.11111111
    广播地址  172.22.141.255
    

    画图理解计算公式

    0ud4WF.md.png

    子网个数	2**2
    主机个数	2**6 -2=62
    

    进制转换

    0udhJU.png

    0ud7LR.md.png

    0udqdx.md.png](htt

    私有ip免费使用

    linux权限划分

    文件基本权限

    -rw-r--r-- 1 root root       247 Jun 30 03:48 xiugaizhuji.sh
    
    #文件身份
    
    #文件权限
    
    #目录权限
    
    #权限分配
    	1.给文件或目录分配权限,先考虑属主和属组
    	2.遵循最小权限规则
    	3.注意递归授权目录,一般递归属主和属组
    
    #特殊权限(SUID、SGID、SBIT)
    	1.特殊权限是为了让特定命令可以拥有足够的权限运行
    	2.SUID只针对可执行文件,SGID只针对可执行文件和目录,SBIT只针对可执行目录
    	
    #ACL权限
    	作用于系统权限分配不足的时候
    	
    #sudo权限
    	
    #系统文件锁
    	lsattr
    	chattr
    	
    #企业权限的使用
    	1.linux系统权限、数据库权限不要掌握在同一个部门
    	2.满足使用,权限最小
    	3.尽量不要使用root用户,使用 普通用户 + sodu提权
    	4.使用Chattr锁定重要的系统权限
    	5.使用脚本检测系统中新增的SUID、SGID文件
    	6.使用秘钥登录,修改SSH服务端口
    	
    

    备份方案

    ---------------------------- 备份对象
    1.备份系统重要文件
    
    2.备份数据库
    	全备+增备
    
    3.备份Apache服务
    
    4.备份其他服务
    	日志备份
    		使用日志切割工具logrotate
    		日志轮替(轮替删除)
    		使用Apache服务配置文件自带日志切割功能,但是需要使用脚本进行轮替
    
    ---------------------------- 备份方式
    #全量备份
    	cp、tar、dump、xfsdump
    	
    #增量备份,基于上一次备份,然后进行的备份
    	C6:dump工具
    	C7:xfsdump工具
    	
    #差异备份,基于上一次全备,然后进行的备份
    	C6:dump工具
    	C7:xfsdump工具
    	
    ---------------------------- 备份频率
    1.实时备份
    	mysql的主从同步
    	
    2.定时备份
    	脚本 + 定时任务,如每天、每周备份
    	
    ---------------------------- 备份的存储位置
    1.本地备份
    2.异地备份
    
    

    磁盘阵列

    raid 0

    1.必须使用两块或两块以上的硬盘组成
    2.每块硬盘的大小必须一致
    3.raid0 是所有动态磁盘中,数据读写最快的
    4.损坏几率相对最高
    5.没有磁盘容错功能
    
    #数据分开存储,CPU对数据的读取最快(同时读取)
    #磁盘的损坏率是单块盘的多倍
    #没有磁盘的冗余功能(一块磁盘坏了的话,那么数据就丢了)
    

    raid 1

    1.由2块或2的倍数硬盘组成
    2.每块硬盘大小必须一致
    3.磁盘利用率只有50%,写入速度最慢
    4.拥有磁盘容错功能
    
    #磁盘另外50%使用率做了备份,同一条数据写2遍,所以速度慢
    #优点是磁盘容错
    

    raid 5

    1.由三块或三块以上的硬盘组成
    2.每块硬盘大小必须一致
    3.磁盘利用率是n-1块盘
    4.利用奇偶校验,拥有磁盘容错功能
    
    #磁盘个数越多,利用率越高
    #注意只支持一块硬盘同时损坏
    

    0uw0Tx.md.png

    raid 6

    1.raid6是raid5的增强版
    2.由4块或以上硬盘组成
    3.每块硬盘大小必须一致
    4.磁盘利用率是n-2块盘
    5.支持磁盘容错,可以支持2块硬盘损坏
    
    #支持同时坏2块盘损坏
    

    raid 10

    1.必须由4块等大小的硬盘组成
    2.两两硬盘先组成raid1,再组成raid0
    3.兼顾raid0 和raid1 的特点,中和两种raid的缺点
    

    软raid与硬raid的区别

    #软raid
    	是由操作系统模拟的raid,一旦硬盘损坏,操作系统就会损坏,raid就会丧失作用
    #硬raid
    	是由独立于硬盘之外的,硬件raid卡组成,就算硬盘损坏,也不会导致raid卡损坏,磁盘容错才能起作用
    
    1.软raid的作用就是模拟read,用来学习
    2.硬件read有独立的操作系统,进而可以修复磁盘损坏
    

    linux资源查看

    CPU

    0uw6pD.png

    网络

    0uwrtK.png

    磁盘

    0uwDk6.png

    内存

    0uwsfO.png

    综合监控工具

    0uw2Xd.md.png

    0uwc1e.png

    0uwg6H.md.png

    0uwWnA.md.png

    0uwf0I.md.png

    启动流程

    C6

    1.服务器加电自检(滴滴滴),加载BIOS信息,BIOS进行系统检测
    2.加载grub菜单(进行多系统选择)
    3.系统内核
    4.加载硬件驱动
    5.由内核启动系统第一个进程 /sbin/init
    6.由/etc/init/rcS.conf调用 /etc/inittab,确定系统的默认运行级别
    7.调用/etc/init/rc.conf配置文件
    8.运行相应的运行级别目录 /etc/rc[0-6].d/中的脚本
    9.执行 /etc/rc.d/rc.local中的程序(进程串行启动)
    10.登录界面
    

    0uwh7t.md.png

    C7

    1.服务器加电自检(滴滴滴),加载BIOS信息,BIOS进行系统检测
    2.加载grub2菜单
    3.grub2加载系统内核
    4.grub2加载inintamfs虚拟文件系统
    5.内核初始化,加载硬件的驱动
    6.内核启动系统的第一个进程systemd
    7.进程并行启动
    8.systemd进程调用default.target
    

    0u0Buj.md.png

    0u0wvQ.md.png

    linux系统优化

    1.禁用不需要的服务、端口
    	linux使用ntsysv命令
    2.避免直接使用root用户,普通用户通过sudo授权操作
    3.通过Chattr锁定重要系统文件	
    	/etc/passwd
    4.配置国内yum源,加快下载速度
    5.配置系统同时打开的最大文件数
    	ulimit -SHn 65535
    6.同步时间服务器
    	ntpdate time1.aliyun.com
    	定时任务 + ntpdate
    7.更改ssh服务的默认端口,配置ssh密匙对登录
    8.配置合理的iptables/firewalld 规则
    9.配置selinux
    10.监控文件、带宽、端口
    11.定时备份系统重要的文件
    	本地 + 异地
    

    文本截取

    1. cut -d '/' -f 3
    2. sort -t '/' -k 3 -n -r
    3. uniq -c  显示重复次数
    4. awk
    5. sed
    6.监控连接的状态
    	netstat -an| grep ESTABLISHED| awk '{print $5}' |cut -d ':' -f 1 |sort -n |uniq -c |sort -nr
    
    

    随机字符串

    面试题

    0u0UC8.md.png

    工具

    0u0a8S.md.png

    tr

    0u0dgg.md.png

    [root@jenkins01 ~]# echo " aa...,+1 b2c /* $dd 3 ls 4" |tr -dc '0-9 
    '
     1 2   3  4
    
    #!/bin/bash
    if [ ! -d /syy ];then
            mkdir /syy
    fi
    cd /syy
    for ((i=1;i<=10;i++));do
            filename=$(tr -dc 'A-Za-z0-9' < /dev/urandom| head -c 6)
            touch "$filename"_gg.txt
            #rm -rf /syy/*
    done
    

    生成随机数

    # $RANDOM	这个系统变量可以默认随机生成 0-32767的数字(包括0,不包括32767)
    
    [root@jenkins01 syy]# echo $RANDOM
    12844
    [root@jenkins01 syy]# echo $(($RANDOM%1000))	#生成1000内的随机数
    890
    ![image-20200921193953453.png](https://i.loli.net/2020/09/30/LXzxt8s1Qd3n29R.png)
    ![image-20200922211351170.png](https://i.loli.net/2020/09/30/TKhVx427qIzcsbP.png)
    
    ![image-20200922205045015.png](https://i.loli.net/2020/09/30/K3dnf52Yol6PFZH.png)
    ![image-20200921213257550.png](https://i.loli.net/2020/09/30/CX4eWmjadZO96Hc.png)
    ![image-20200921200805063.png](https://i.loli.net/2020/09/30/FVZ4sTQ8BqLPbfI.png)
    

    网站监测

    image-20200921193953453.png

    1.ping	监测目标主机是否宕机
    2.curl  监测网站是否正常
    
    #curl命令
    	开源的用于数据传输的命令行工具,可以用与http访问,用于上传和下载、用户认证、代理访问等
    	选项:
    		-o :将命令输出保存在指定文件
    		-s :静默输出
    		-w :按指定格式输出内容,例如:-w %{http_code} #输出http状态码
    		--connect-timeout	:指定超时时间
    

    0uBBRO.md.png

    #!bin/bash
    web = {
    	www.qq.com
    	10.0.0.90
    	10.0.0.91
    }
    
    for i in ${web[*]};do
    	code = $(curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' $i |grep -E '200|302')
    	if [ "$code" != "" ];then
    		echo "$i is ok" >> /root/ok.log
    	else
    		sleep 10
    		code = $(curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' $i |grep -E '200|302')
    		if [ "$code" != "" ];then
    			echo "$i is ok" >> /root/ok.log
    		else
    			echo "$i is error" >> /root/error.log
    		fi
    	fi
    done
    

    提升ssh服务远程管理的安全等级

    1.ssh服务的登录验证方式(口令、密钥对)
    2.ssh服务的登录端口的监听(监听ip、端口)
    3.ssh服务的登录用户个数限制
    4.ssh服务的登录超时设置
    5.ssh服务的登录失败次数限制(防止损耗CPU)
    
    
    
    [![0uBTyQ.md.png](https://s1.ax1x.com/2020/09/30/0uBTyQ.md.png)](https://imgchr.com/i/0uBTyQ)
    
    
    
    
    
    
    
    
    
    [![0uDpy4.md.png](https://s1.ax1x.com/2020/09/30/0uDpy4.md.png)](https://imgchr.com/i/0uDpy4)
    
    
    
    

    密钥对

    0uB7Lj.md.png

    端口设置

    0uB4W8.md.png

    配置文件

    [root@jenkins02 ~]# ll /etc/ssh/ssh*
    -rw-r--r--. 1 root root     2276 Apr 11  2018 /etc/ssh/ssh_config	#客户端
    -rw-------  1 root root     3905 Jun 30 03:30 /etc/ssh/sshd_config	#服务端
    

    FTP

    FTP服务器主动模式

    0uBbes.png

    1.FTP服务端21号端口一致保持连接
    2.FTP服务端22端口只有在数据传输的时候才会开启
    3.FTP服务器只会使用22号端口提供服务
    

    FTP服务器被动模式

    0uBqwn.png

    1.FTP服务器提供服务的端口是随机的,所以此时不会因为端口问题导致FTP服务停止运行
    

    时间同步

    手动同步

    ntpdate 实际服务器IP地址
    

    自动同步

    crontab -e
    

    通过DHCP服务获取IP地址的过程

    DHCP协议又叫动态主机分配协议
    	作用是分配ip资源
    类型:
    	DHCP租约
    	DHCP续租
    资源池:
    	ip资源池
    

    0uBoQg.md.png

    0uBISS.md.png

    #租约
    discover、offer、request、ACK数据的传输为广播
    ACK/NAK	是/否
    
    #续租
    数据的传输使用ip地址,直接传输数据包
    
    #取消VMVARE网卡的DHCP功能
    
    #下载
    [root@jenkins01 syy]# yum install -y dhcp
    #配置
    [root@jenkins01 syy]# vim /etc/dhcp/dhcpd.conf
    subnet 10.0.0.0 netmask 255.255.255.0 {
        range 10.0.0.100 10.0.0.254;
        option domain name-servers 114.114.114.114;
        option routers 10.0.0.2;
        default-lease-time 600;
        max-lease-time 7200;
    }
    

    DNS (域名解析服务)

    0uBLoq.png

    域名:	表示一个网站或一组服务器的专有的一个字符串,为了人去记忆ip地址
    ip:	 为每一个网络设备来设置一个ip地址,为了资源定位
    
    

    DNS服务器原理及解析流程

    0uBXF0.md.png

    本地DNS

    # local DNS
    [root@hass-11 ku]# vim /etc/hosts
    	#IPV4本地回环地址	别名 别名
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    	#IPV6本地回环地址
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    #缺点
    	维护压力大
    	
    #local DNS 递归服务器
    

    DNS服务器(递归查询)

    0uBjYV.png

    #GATEWAY
    	数据传输必须要有网关
    #DNS1
    	首选DNS
    #DNS2
    	备选DNS
    	
    #本地解析的优先级大于DNS服务器解析
    

    迭代查询

    image-20200922213125925

    #ROOT DNS(根域服务器)
    	只负责接收local DNS的请求
    #TLD DNS
    	只负责接收根域传来的顶级域
    	
    #ROOOT DNS、TLD DNS、Domain Auth-DNS迭代服务器,根域、顶级域、二级域服务器
    #二级DNS又叫权威DNS
    #local DNS帮助PC第一次解析,还可以记录迭代查询的结果
    

    文字解析

    0uDSlF.md.png

    权威DNS 和递归DNS的定义

    0uBzSU.md.png

    智能DNS

    0uDpy4.md.png

    Apache虚拟主机

    参考网站

    1.基于IP的虚拟主机
    	~]# ifconfig eth0:0 10.0.0.3/24		#设置网卡子接口,临时生效
    2.基于IP+端口的虚拟主机
    3.基于域名的虚拟主机
    

    基于域名的 多虚拟主机

    #编辑多虚拟主机
    ~]# vim /etc/httpd/conf.d/test.conf
    <VirtualHost 10.0.0.3:80>
        DocumentRoot /var/www/html/a.com
        ServerName www.a.com
        #管理员信息
        #ServerAdmin xinxi
        #日志
        #Errorlog log_dir
    </VirtualHost>
    <VirtualHost 10.0.0.4:80>
        DocumentRoot /var/www/html/b.com
        ServerName www.b.com
    </VirtualHost>
    
    #添加虚拟网卡
    ~]# ifconfig eth0:0 10.0.0.3/24
    ~]# ifconfig eth0:1 10.0.0.4/24
    
    #本地解析
    ~]# vim /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.3 www.a.com
    10.0.0.4 www.b.com
    
    ~]# mkdir /var/www/html/{a,b}.com
    ~]# echo "www.a.com..." >> /var/www/html/a.com/index.html
    ~]# echo "www.b.com..." >> /var/www/html/b.com/index.html
    
    #重启httpd
    ~]# service httpd restart
    

    基于ip和端口的 多虚拟主机

    #配置域名解析
    ~]# vim /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.3 www.a.com
    10.0.0.3 www.b.com
    
    #关闭多余的网卡
    ~]# ifconfig eth0:1 10.0.0.4 down
    ~]# ip a|grep 10.0.0.3
        inet 10.0.0.3/24 brd 10.0.0.255 scope global secondary eth0:0
    
    #配置httpd 多虚拟主机
    ~]# vim /etc/httpd/conf.d/test.conf 
    
    <VirtualHost 10.0.0.3:80>
        DocumentRoot /var/www/html/a.com
        ServerName www.a.com
    </VirtualHost>
    <VirtualHost 10.0.0.3:8080>
        DocumentRoot /var/www/html/b.com
        ServerName www.b.com
    </VirtualHost>
    
    #使httpd监听多个端口
    ~]# vim /etc/httpd/conf/httpd.conf
    Listen 80
    Listen 8888
    
    #curl
    [root@jenkins01 ~]# curl www.a.com:80
    www.a.com...
    [root@jenkins01 ~]# curl www.b.com:80
    www.a.com...
    
    [root@jenkins01 ~]# curl www.a.com:8888
    www.b.com...
    [root@jenkins01 ~]# curl www.b.com:8888
    www.b.com...
    

    域名跳转

    #本地解析
    ~]# vim /etc/hosts
    10.0.0.3 www.a.com
    10.0.0.4 www.b.com
    
    #配置子网卡
    ~]# ifconfig eth0:0 10.0.0.3/24
     ~]# ifconfig eth0:1 10.0.0.4/24
    
    #
    ~]# vim /etc/httpd/conf.d/test.conf 
    <VirtualHost 10.0.0.3:80>
        DocumentRoot /var/www/html/a.com
        ServerName www.a.com
    </VirtualHost>
    <VirtualHost 10.0.0.4:80>
        DocumentRoot /var/www/html/b.com
        ServerName www.b.com
        <IfModule mod_rewrite.c>
            RewriteEngine on
            #开启rewrite功能
            RewriteCond %{HTTP_HOST} ^www.b.com
            #把以www.a.com开头的内容复制给HTTP_HOST变量
            RewriteRule ^(.*)$ http://www.a.com/$1 [R=301,L]
            #^(.*)$指客户端要访问的资源
            #$1 把 .* 所指的内容赋值给$1
            #R=permanent 永久重定向 = 301
            #L 指生效的最后一条规则,以后的不再生效
        </IfModule>
    </VirtualHost>
    
    #curl
    ~]# curl www.a.com:80
    www.a.com...
    ~]# !c
    curl www.b.com:80
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>301 Moved Permanently</title>
    </head><body>
    <h1>Moved Permanently</h1>
    <p>The document has moved <a href="http://www.a.com//">here</a>.</p>
    </body></html>
    

    Apache的三种工作模式

    prefork模式

    0uD9OJ.md.png

    #该模式下,Apache会开启多个子进程,在处理请求之前
    #一个子进程下面有一个线程,一个线程只处理一个请求
    
    #优点
    	稳定
    #缺点
    	进程独占资源,不适合高并发
    

    worker模式

    0uDPm9.md.png

    #一个子进程下面有多个线程,一个线程只处理一个请求
    
    #优点
    	资源利用率高,适合高并发
    #缺点
    	一个线程不能工作,会导致该子进程下的所有线程够不公作(线程安全)
    

    event模式

    0uDiwR.md.png

    #同一个用户在同一个网站进行多次访问,为了防止系统重复的进行TCP/IP连接和断开,存在一个连接超时时间T,在时间T范围内,该用户可以直接访问该网站,不需要再进行TCP/IP连接
    #event模式新增了'分配管理线程'
    #该线程的作用就是查找所有进程中处于等待时间T的进程,停止该进程的等待,让其处理别的请求
    
    #优点
    	该模式下,要比worker模式更擅长处理高并发
    
    #查看Apache的工作模式
    ~]# httpd -V |grep -i 'server mpm'
    Server MPM:     prefork
    
    #指定Apache的工作模式
    	在编译时,在选项中指定 --with-mpm=xxx
    

    Apache优化

    #apache服务器的安全
    
    #apache服务器的效率
    
    

    日志优化

    #查看Apache日志路径
    ~]# cat /etc/httpd/conf/httpd.conf |grep CustomLog
        CustomLog "logs/access_log" combined
        
    ~]# ll /var/log/httpd/
    total 12
    -rw-r--r-- 1 root root 1021 Sep 23 20:18 access_log	#其他日志
    -rw-r--r-- 1 root root 7842 Sep 23 20:13 error_log	#报错日志
    
    #查看日志切割工具
    [root@jenkins01 ~]# rpm -q logrotate 
    logrotate-3.8.6-17.el7.x86_64
    [root@jenkins01 ~]# rpm -ql logrotate |grep bin
    /usr/sbin/logrotate
    [root@jenkins01 ~]# rpm -ql logrotate |grep sbin 	#logrotate安装包含的命令
    /usr/sbin/logrotate
    
    [root@jenkins01 ~]# which rotatelogs 
    /usr/sbin/rotatelogs
    [root@jenkins01 ~]# rpm -qf /usr/sbin/rotatelogs 	#查看命令属于哪个包
    httpd-2.4.6-93.el7.centos.x86_64
    [root@jenkins01 ~]# rpm -qf /usr/bin/cd
    bash-4.2.46-31.el7.x86_64
    
    #配置Apache日志(在配置文件使用httpd自带的日志切割工具,指定日志切割)
    ~]# /etc/httpd/conf/httpd.conf
    CustomLog "|/usr/sbin/rotatelogs -l /tmp/httpd_access_%Y%m%d.log 86400" combined
    
    #检测
    ~]# tailf /tmp/systemd-private-61d9106934ca4074a160dbe4ac63987a-httpd.service-5txtFo/tmp/httpd_access_20200923.log
    10.0.0.91 - - [23/Sep/2020:21:19:51 +0800] "GET / HTTP/1.1" 200 13 "-" "curl/7.29.0"
    

    错误页面的美化

    #可以将 404 500等错误信息页面重定向到网站首页或其他页面,提升用户体验
    
    #编辑虚拟主机
    ~]# vim /etc/httpd/conf.d/test.conf 
    <VirtualHost 10.0.0.3:80>
        DocumentRoot /var/www/html/a.com
        ServerName www.a.com
        ErrorDocument 404 httpd://www.b.com
    </VirtualHost>
    <VirtualHost 10.0.0.4:80>
        DocumentRoot /var/www/html/b.com
        ServerName www.b.com
    </VirtualHost>
    
    #编辑美化页面
    ~]# echo '我是美化页面' > /var/www/html/b.com/index.html
    

    屏蔽Apache版本等敏感信息

    #子文件调用
    ~]# vim /etc/httpd/conf/httpd.conf
    Include conf/extra/httpd-default.conf
    
    #修改配置文件中默认显示的信息
    ~]# vim /etc/httpd/conf.d/httpd-default.conf
    ServerTokens Prod
    ServerTokens Major
    ServerTokens Minor
    ServerTokens Min
    ServerTokens OS
    ServerTokens Full
    

    配置Apache缓存

    0uyp6S.md.png

    #缓存对象
    	.gif、jpeg、png、css等文件,不能缓存视频等较大的文件
    #该模块一定要在网站的标签里面声明
    	<VirtualHost IdModule 10.0.0.x mod_expires.c>
    	<IdModule></IdModule>
    
    

    禁止PHP解析代码

    ~]# vim /etc/httpd/conf.d/httpd-default.conf
    <Directory "/www.a.com/uploads">
    	Options FollowSymLinks
    	AllowOverride None
    	Order allow,deny
    	Allow from all
    	php_flag engine off
    </Directory>
    

    优化总结

    0usvfP.md.png

    #对故障进行预测,解决对应问题的策略/方案都叫优化
    

    提高网站的安全和效率

    1. 杀毒软件可以提高网站的安全
    2. CDN

    0uszSf.png

    #CDN又叫内容分发网络
    #CDN的作用就是减轻网站服务器的压力,还有保护服务器的真实身份
    	就是web通过CDN把变化频率较低的文件(图片文件、文本文件),分发到各个城市的CDN服务器上
    	这样各个城市的用户要访问资源,通过智能DNS会直接把域名解析成'离当前位置最近'的DNS的ip
    #这时的CDN相当于一个缓存服务器
    

    Apache的优缺点

    优点

    1.Apache的rewrite功能比nginx的要强大 (域名、关键词)
    2.Apache模块非常多,基本想要的功能都能找到模块 (模块化)
    3.存在时间较长,相关文档多,bug相对较少
    4.静态解析很稳定(html)
    5.动态解析也很稳定(解析需要连接数据库的文件,比如 .php文件)
    

    缺点

    1.由于工作模式是'同步阻塞型',导致资源的消耗较高,并发能力较差
    

    nginx的优缺点

    优点

    1.轻量级服务,比Apache占用更少的内存及资源
    2.并发能力强,nginx处理请求是异步非阻塞型的,而Apache则是同步阻塞型,在高并发下nginx能保持'低资源、低消耗、高性能'
    3.高度模块化的设计,编写模块相对简单
    4.社区活跃,各种高性能模块产出迅速
    

    缺点

    1.动态处理上需要使用fastcgi连接PHP的fpm服务,相比apace不占优势
    

    nginx的动态解析解析

    0usXFI.md.png

    Apache和nginx的选择

    1.nginx 适合做静态处理,简单,效率高,并发高
    2.Apache 适合做动态处理(连接PHP更方便),稳定,功能强
    3.并发较高的情况下优先选择nginx,并发要求不高的情况下,两者都可以。
    4.可以使用nginx作为反向代理,然后将动态请求负载均衡到后端Apache上
    

    nginx反向代理、负载均衡、动静分离

    0usjYt.md.png

    #企业常用
    

    nginx处理请求的原理

    0uy69P.md.png

    同步
    	关键在于等,效率低,但是可以保持数据的一致性
    异步
      	效率高,数据有偏差
      	
     #同步或者异步是相对于数据来说的
    

    0uysht.md.png

    阻塞
    	线程的使用效率低
    非阻塞
    	线程的使用效率高
    
    #阻塞非阻塞是相对于进程来说的
    

    nginx以异步非阻塞的方式进行工作的

    0uyc1f.md.png

    nginx常用模块

    http_ssl_module模块

    0uyDAA.md.png

    1.http_ssl_module模块在nginx编译安装的时候需要指定
    2.http 使用80端口,HTTPS使用443端口
    3.使用rewrite或return,可以实现nginx的请求转发
    

    http_image_filter_module模块

    0uyrtI.md.png

    1.直接在配置文件中图片的宽和高
    

    http_rewrite_module模块

    0uy2jS.md.png

    
    

    http_proxy_module模块

    0uygc8.md.png

    
    

    http_upstream_module模块

    0u6a80.md.png

    #负载均衡的算法
    	RR轮询
    

    lnmp、lamp、lnmTJ总结

    0uyfBQ.md.png

    静态资源直接访问静态资源服务器,CDN
    
    lnmp
    	nginx通过fast_cgi模块,代理PHP-FPM,访问数据库,并发量高
    	
    lamp
    	Apache直接连接PHP,访问数据库
    	
    lnmTJ
    	nginx通过fast_cgi模块,反向代理后端的Tomcat服务器,Tomcat服务器使用JDK,访问数据库
    

    nginx调用PHP的过程

    0uyh7j.md.png

    nginx调用Tomcat的过程

    0uy5As.md.png

    http状态码

    1** :信息,服务器收到请求,需要请求者继续执行操作(客户端看不到)
    2**	:成功,操作被成功接收并处理(客户端看不到)
    3** :重定向,需要进一步的操作以完成请求(客户端看不到)
    4** :客户端错误,请求包含语法错误或无法完成请求
    5** :服务端错误,服务端在处理请求的过程中发生了错误
    
    #五个类别的响应代码的第一个数字是'唯一代表'
    

    成功响应

    0u6W26.md.png

    重定向

    0u6fxK.md.png

    客户端错误

    0u6R8x.md.png

    服务器错误(生成中应该避免)

    0u62P1.md.png

    SQL语句

    0u6ORP.md.png

    select count(*) from student.report where Nmae like '李%';
    
    select Result from student.report order by result desc limit 2;
    
    #函数count(*),显示匹配的数据的数量
    #order by 升序排列
    #order by desc 降序排列
    #limit 步长
    

    创建用户
    	create user user_name@'%' identified by '123';
    创建数据库
    	create database db_name;
    创建数据表
    	create table tb_name(id int,name char(30),age int);
    插入数据
    	insert tb_name(id,name,age) values(1,'zhangsan',21);
    	
    #数据库用户登录方式有2种
    	1.本地,使用localhost授权
    	2.远程,使用 %授权
    

    删除用户
    	drop user user_name@'%';
    删除数据库
    	drop database db_name;
    删除数据表
    	drop table tb_name;
    删除数据
    	delete from sj1 where id=5;
    	delete from sj1 where age between 23 and 25;
    

    修改表中的数据
    	update tb_name set age=21 where id=30;
    修改数据表的名称
    	alter table tb_name1 rename tb_name2;
    修改数据表的字段类型
    	describe tb_name;
    	alter table tb_name modify name char(50);
    	describe tb_name;
    修改数据表的字段类型
    	alter table tb_name change name username char(50) not null default '';
    添加删除字段
    	alter table tb_name add time datetime;
    	alter table tb_name drop time;
    	
    #change 既可以修改表名(rename),又可以修改字段类型(modify)
    

    查看所有数据库
    	show databases;
    查看指定库内所有的数据表
    	show tables;
    查看指定数据表的字段
    	desc tb_name;
    查看所有mysql用户密码和登录方式
    	select User,Password,Host from mysql.user;
    数据数量
    	select count(*) from db_name.tb_name;
    

    授权

    授权用户全部权限(除了grant)
    	grant all on *.* to username@'%';
    创建用户,并授权,或者给已存在的用户授权
    	grant all on *.* to username@'%' identified by '123';
    回收权限
    	revoke drop,delete on *.* from username@'%';
    
    

    数据库的启动、关闭

    启动
    	service mysqld start
    	/etc/init.d/mysqld start
    	mysqld_safe &
    
    关闭
    	service mysqld stop
    	/etc/init.d/mysqld stop
    	mysqladmin -uroot -p123 shutdown
    

    心灵鸡汤

    	数据库这方面的知识对我们运维工程师来说是非常重要的技能
    	但是作为运维来说,我们学习数据库主要学习数据库架构的搭建,以及中间件的部署等
    	我们运维不用过多的去关注数据库数据的结构、语法结构,因为,数据库里面的所有的库、表、数据结构都是需要开发工程师切合他们的开发项目的
    	我们运维要做的就是为他们提供一个安全稳定的运行环境、数据库环境
    

    数据库集群

    image-20200926122814911

    
    

    mysql主从复制,一主二从

    0u6Iqe.png

    #主库
    	接收用户的写入
    	接收用户的查询
    #从库
    	从服务器的作用只是用来备份主服务器上的数据的
    	
    #主从复制原理
    	bin-log日志(二进制日志),要先开启主服务器上的bin-log日志记录功能,将主服务器的bin-log日志传到从服务器,从服务器根据日志内容将数据换源到本地
    	
    #bin-log日志是一种特殊的日志,二进制日志,记录用户对数据库的操作,但是bin-log日志只会记录对数据进行修改的操作 (增删改 授权)
    #主从复制就是对master的一种备份,而且比普通的备份效率高得多,消耗的资源更少一些
    #主从复制中,主库宕机,从库将会来不及同步主库上的数据,少量的数据丢失是在所难免的
    #mysql的master-slave读写分离,是为了分摊主库的读压力
    #mysql的master-master,是为了分摊主库的写压力
    #mysql的master-master-slave,即一台主机作为两个master的从库,原理是虚拟主机
    

    MHA(自动故障恢复)

    	主从复制中,主库宕机,然后登陆所有的从库查看POST信息,使用最大POST的从库作为新的主库,然后将它提升为新的主库,登陆从库(新的主库)执行 stop slave
    	新的主库修改my.cnf配置文件,开启bin-log并重新启动数据库服务,登陆数据库执行reset master
    	登陆其它从库,执行change master to操作
    

    解决单台mysql的性能瓶颈

    #纵向扩展
    	提升单台服务器的性能,增加CPU、内存、硬盘
    	小心短板效应
    
    #横向扩展(mysql集群)
    	
    

    数据库代理工具:Amoeba

    	Amoeba是致力于mysql的分布式数据库前端代理层(代理服务器),
    	它主要在应用层(web服务器)访问mysql的时候充当'SQL路由功能',专注于分布式数据库代理层开发,
    	具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关的'请求'到'目标数据库'、可并发请求多台数据库、合并结果。通过Amoeba,
    	你能够完成多数据源的高可用、负载均衡、数据切片的功能
    	
    #Amoeba 就是mysql集群中反向代理的中间件工具
    #生产中,可以使用2台Amoeba做成高可用
    

    0u6TVH.png

    数据库索引

    #索引也算是对数据库的一种优化
    
    1.什么是索引
    	索引本质是一种排好序的可以快速查找数据的结构,可以提高查找的效率
    	可以理解为数据的分身
    	数据库这种满足特定查找算法的数据结构,再次基础上实现高级的查找算法
    	
    2.索引的分类	
    	主键索引,创建主键的时候自动为该字段创建主键索引
    	单值索引(单列索引),如果某个字段经常用来检索,就可以为该列创建单只索引
    	复合索引,一个索引包含多个列,如电话簿上 姓+名,注意复合索引最好不要超过5个字段
    	唯一键索引,注意该列所有的值必须唯一,允许有空值
    	辅助索引,普通索引和唯一键索引可以称为辅助索引
    
    3.优点
    	使数据的查询效率更高
    	避免了查询数据的时候对数据进行的排序操作
    	使随机的IO查询变成有顺序的IO查询
    	
    3.缺点
    	索引实际上也是一张表,该表保存了主键与索引字段,并指向实体表的数据,索引需要占用额外的磁盘空间
    	索引虽然大大的提高了数据的查询速度,但是会降低更新表的速度(insert、update、delete)
    		因为mysql不仅要保存数据,还要保存以下索引文件
    		每次更新添加了索引列的字段,都会调整因为更新所带来的键值对变化后的索引信息
    	
    4.什么时候需要创建索引
    	频繁作为查询条件的字段应该创建索引
    	查询中与其它表关联的字段,外键关系的列建立索引
    	数据本身就有顺序,通过索引将大大提高排序速度
    	统计或分组字段
    	
    5.什么时候不需要创建索引
    	频繁更新的字段不适合创建索引,因为没猜错更新不单单是更新了数据,还会更新索引
    	where里用不到的字段不创建索引
    	对单列数据,不要创建多种索引(减少资源消耗)
    	表数据太少不需要创建索引,一个表中的数据在三百万左右才需要创建索引
    	性别,国籍字段
    
    #创建索引的时候,系统自动创建了2个空间,索引空间,数据空间
    

    数据库备份

    0u67ad.md.png

    1.查看binlog日志,记录drop之前的位置点m
    2.查看全备,找到mysql数据库的数据备份到了哪个位置点n
    3.通过binlog日志,使用mysqldump命令,导出n到m的binlog信息,a.txt
    4.拷贝全备文件和a.txt 到新库所在主机
    5.使用mysqldump命令导入binlog日志,数据恢复
    6.根据数据库数据量的大小,选择
    	切换前端web对数据库的指向
    	将新恢复的数据库的数据导出、拷贝到旧库所在主机、导入
    	
    #数据库binlog需要手动开启
    #binlog记录了用户,对数据库所有的增删改操作
    

    redis

    #redis是一种非关系型数据库
    #redis中的数据是保存在内存中的,将redis中的数据实时保存到磁盘,叫做redis的持久化
    #原子性,指的是一次完整的事务,与事务的commit、rollback有关
    #redis中的交集,和mysql的连表查询类似
    
    	redis是一个key-value的存储系统,它支持value(数据)类型相对较多,包括string、list、set、zset,这些数据都支持push、pop、add、remove和交集、并集、补集等操作
    	redis致辞各种不同方式的排序
    	为了保证效率,redis中的数据是缓存在内存中的
    	redis会周期性的把数据从内存写入磁盘,或者把修改等操作追加写入记录文件(持久化)
    	redis支持master-slave,即主从复制
    

    redis持久化--RDB

    	在redis运行时,RDB程序将当前内存中的数据库快照 保存到磁盘中,当redis需要重启时,RDB程序会通过重载RDB文件来还原数据库
    	
    #保存(RDBsave)
    	RDBsave负责将内存中的数据库数据'以RDB格式'保存到磁盘中,如果RDB文件已经存在,将会替换已有的RDB文件,保存文件期间会阻塞主进程,这段时间期间将'不能处理新的客户端请求',直到保存完成为止
    	
    #读取(RDBload)
    	当redis启动时,会根据配置的持久化模式,决定是否读取RDB文件,并将其中的对象加载到内存中
    

    redis持久化-AOF

    	以'协议文本'的方式,将所有对数据库进行的写入命令记录到AOF文件,达到记录数据库状态的目的
    	
    #redis的AOF持久化,相当于mysql数据库的binlog日志
    
    #保存
    	1,将客户端请求的命令转化为网络协议格式
    	2.将协议内容字符串追加到变量server.aof 中
    	3.当AOF系统达到设定的条件时,会调用aof_fsync(文件描述符号)将数据写入到磁盘
    	
    #读取
    	1.AOF保存的是网络协议格式的数据,所以只要将AOF中的数据转换为命令,模拟客户端重新执行一遍,就可以还原所有数据库的状态
    	2.读取AOF保存的文本,还原数据为原命令和原参数,然后使用模拟的客户端执行这个目录请求
    	3.一条一条的执行第二步,直到,读取完
    	
    #AOF重写
    	1.把AOF文件从磁盘读取到内存中
    	2.有条件的合并AOF中的redis语句(只保留最新的修改)
    	3.用新的AOF文件,覆盖原有的AOF文件
    

    使用redis对mysql进行性能优化

    0u6HIA.png

    #用户请求与集群的响应
    	1.web服务器先对redis服务器发出请求,查找数据,如果redis服务器中没有对应的数据
    	2.web服务器再对amoeba服务器发出请求
    	3.amoeba对请求进行负载均衡、读写分离,将用户的请求分配到mysql服务器上
    	4.mysql服务器进行请求反馈
    	5.linux系统以key-value的形式,将查询结果保存到redis服务器
    	
    #注意要设置redis数据库数据的生存时间TTL(缓存时间),使用redis数据库中的数据与mysql数据库中的数据一致
    
  • 相关阅读:
    PHP使用http_build_query()构造URL字符串的方法
    php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组
    资金管理
    偏爱粉色,我的儿子会不会娘娘腔?
    中文期刊有哪些?
    超声胎儿图像分割
    加州wonders教材扫盲
    美国小学1-5年级教学大纲
    A股回归牛市?
    深入研究股票涨停
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13710025.html
Copyright © 2020-2023  润新知