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

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 \n'
 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数据库中的数据一致
posted @ 2020-09-22 08:08  看萝卜在飘  阅读(790)  评论(0编辑  收藏  举报