x------------------------------------------------------------------------------
#将系统初始化的所有步骤写成脚本,参考视频放置于mirrors.qfcc.online中
#2023年10月30日19:58:33
pdif(){
if [[ $1 -eq 0 ]]; then
echo "${2}安装成功"
else
echo "${2}安装失败"
exit
fi
}
is_package_exist(){
if rpm -q $1 &>/dev/null;then
return 0
else
yum -y install $1 &>/dev/null
echo "${1}安装完成"
return 1
fi
}
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/centos-base.repo https://mirrors.qfcc.online/mirrors/centos-base.repo &>/dev/null
pdif $? centos-base.repo
yum clean all &>/dev/null
rm -rf /var/cache/yum/*
yum makecache fast &>/dev/null
yum -y install epel-release &>/dev/null
rm -rf /etc/yum.repos.d/epel*
curl -o /etc/yum.repos.d/epel.repo https://mirrors.qfcc.online/mirrors/epel.repo &>/dev/null
yum makecache fast &>/dev/null
pdif $? epel
software=("vim" "net-tools" "screen" "lrzsz" "wget")
for p in ${software[@]}; do
is_package_exist $p
done
if ! rpm -q autoconf &>/dev/null; then
yum -y groupinstall "Development Tools"
fi
#yum groupinstall "Development Tools" #&>/dev/null
#pdif $? "Development Tools"
sed -i '/^UUID/d' /etc/sysconfig/network-scripts/ifcfg-ens33
echo "网卡配置完成"
#防火墙
if [ "`systemctl status firewalld | awk -F ";" NR==2'{print $2}'`" = " disabled" ];then
echo "防火墙已处于关闭状态,无需操作"
else
systemctl disable firewalld
echo "防火墙关闭成功"
fi
if [ "`getenforce`" = "Disabled" ];then
echo "selinux已处于关闭状态,无需操作"
else
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
echo "selinux关闭成功"
fi
echo "配置完成"
reboot
------------------------------------------------------------------------------
#编写一个脚本, 要求能够实现对软件的识别, 例如netstat指令识别, 如果系统中不存在该指令则安装net-tools软件包;
#2023年10月31日16:04:08
read -p "请输入你想查询的指令" input
yumname=$(yum provides ${input} | grep "[0-9]" | awk -F "-[0-9]" 'NR==1{print $1}')
name=${yumname##*:}
if ! rpm -q ${name} &> /dev/null ;then
echo "${input}命令的软件包名称为:${name}"
echo "检测到软件未安装,正在进行安装……"
yum -y install ${name} &> /dev/null
echo "${name}安装完成"
else
echo "${input}命令的软件包名称为:${name}"
echo "${name}已安装,无需操作"
fi
------------------------------------------------------------------------------
#/usr/bin/env bash
#编写一个脚本, 要求能够实现对指定目录的判断(是否存在), 不存在则创建且要输出提示;
#2023年10月31日16:48:01
read -p "请输入目录路径" daddress
if [ ! -d ${daddress} ]; then
mkdir -p ${daddress}
echo "该目录经检测不存在,已成功创建"
cd ${daddress}
else
echo "目录已存在"
fi
------------------------------------------------------------------------------
#/usr/bin/env bash
#编写一个命令式脚本, 要求根据指定的选项, 实现探测指定IP地址是否活跃、实现探测端口是否活跃、实现帮助信息输出的功能;
#2023年10月31日18:56:33
pdip(){
read -p "请输入要探测的IP地址:" ipnm
ping -c1 ${ipnm} &> /dev/null
if [[ $? -eq 0 ]]; then
echo "IP:${ipnm}活跃"
else
echo "IP:${ipnm}不活跃"
fi
}
pddk(){
yum -y install lsof &> /dev/null
read -p "请输入要探测的端口:" dknm
lsof -i :${dknm} &> /dev/null
if [[ $? -eq 0 ]]; then
echo "端口${dknm}活跃"
else
echo "端口${dknm}不活跃"
fi
}
print(){
echo "这里是帮助信息"
}
cat <<-EOF
1)探测IP地址是否活跃
2)探测端口是否活跃
3)帮助
输入其他退出
EOF
read -p "" input
case $input in
1)
pdip
break
;;
2)
pddk
break
;;
3)
print
break
;;
*)
exit
break
;;
esac
------------------------------------------------------------------------------
#/usr/bin/env bash
#编写一个命令式脚本, 要求根据指定的选项, 实现对指定目录的判断是否存在, 实现对指定文件的判断是否存在;
#2023年10月31日19:09:59
wenjian(){
read -p "请输入文件的路径" input
if [[ ! -f ${input} ]]; then
echo "文件不存在"
else
echo "文件存在"
fi
}
mulu(){
read -p "请输入文件的路径" input
if [[ ! -d ${input} ]]; then
echo "目录不存在"
else
echo "目录存在"
fi
}
cat <<-EOF
1)判断文件是否存在
2)判断目录是否存在
3)退出
EOF
read -p "" input
case $input in
1)
wenjian
break
;;
2)
mulu
break
;;
3)
exit
break
;;
esac
------------------------------------------------------------------------------
#思考题: 如何像使用 `ls` 一样使用上述编写的脚本, 即在任意位置均可使用(形式: scripts_name options parameter);
1、编写shell脚本
2、赋予脚本执行权限
3、用echo $PATH 命令查看PATH变量,将脚本复制到其中的/usr/bin目录下
4、临时自定义别名:alias 别名='脚本名'
5、永久自定义别名:vi /root/.bashrc
添加如下内容:alias 别名='脚本名'
------------------------------------------------------------------------------
#匹配年月日日期 格式2018-08-06
[0-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])
------------------------------------------------------------------------------
#匹配长度为8-10位的用户密码 : 包含数字字母下划线
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?_).{8,10}$
------------------------------------------------------------------------------
#2023年11月1日16:36:40
------------------------------------------------------------------------------
#1. df与du查看磁盘的大小不一致,是什么原因?怎么解决?
用户删除了仍在使用的文件,文件删除了但是文件句柄仍然保留,df命令统计文件句柄,du命令不会在文件系统目录中统计这些文件。
解决方法:使用lsof | grep deleted 命令查找到带有deleted标识符的进程PID,然后kill -1 PID 重启它,就恢复正常
命令:lsof | grep deleted | grep -v PID | awk '{ pid[$2]++ }END{ for(p in pid){ print "kill -1",p}}' | bash -
------------------------------------------------------------------------------
#2. 理解并背诵客户端与服务端建立连接的过程和意义
首先客户端根据浏览器中提供的域名进行DNS解析获取到服务器的IP地址,再根据url中提供的port确定访问的端口号,至此客户端操作系统会与服务器操作系统建立TCP三次握手并形成网络通路,至此浏览器封装请求体,将请求体所建立的TCP通路传输到服务器中,服务器将请求体解开,根据提供的请求行的url以及请求头中的头部信息以及请求体中的验证信息将请求的资源封装成响应体,再增加响应头、状态行、沿原来的通路传给客户端。
意义:TCP三次握手给HTTP信息传输,提供了稳定的底层支持,符合OSI七层参考模型的:下层服务于上层的理念。
------------------------------------------------------------------------------
#3. 请求体及响应体的应用和流转过程
初始化请求体包含请求行(包含了Method、URL、Version)、请求头(包含了由服务器确定的请求头)、请求体(包含了用户信息、令牌等)
初始化响应体包含响应行(包含了http状态码、Version)、响应头(返回请求头对应的响应头)、响应体(包含了html、css、JavaScript、媒体文件等)
1、用户在浏览器输入url
2、浏览器根据输入的url地址确定服务器的IP地址
3、浏览器开始构建请求体
4、利用http三次握手将请求体传输到服务器
5、服务器接收并识别请求体中的用户信息并进行身份甄别
6、根据URI判断是否包含对应的资源
7、如果不包含:返回带有错误状态码的响应体。如果包含:封装好对应的初始响应体并按照接收路径向浏览器返回响应。
------------------------------------------------------------------------------
#4. 详细描述一下浏览器访问百度站点所经历的过程和细节
1、打开浏览器输入www.baidu.com后按回车
2、浏览器根据输入的url地址确定服务器的IP地址(使用了DNS协议)
3、浏览器开始构建请求体(请求行:Method URL Version、请求头:由服务器确定、请求体:包含了用户信息,令牌等信息)
4、电脑通过三次握手将请求体传输到服务器
5、服务器接收并识别请求体中的用户信息进行身份甄别
6、根据URI判断是否包含对应的资源
7、如果不包含:返回带有错误状态码的响应体。如果包含:封装好对应的初始响应体并按照接收路径向浏览器返回响应。
8、用户看到网页界面
------------------------------------------------------------------------------
xxxxxxxxxx
------------------------------------------------------------------------------
#2023年11月02日作业:
#1.将状态码中的4xx及5xx状态码总结产生原因及解决方法,并且背下来(可与同桌互相交流背诵)
400:请求报文中存在语法错误(URL写错了)-----客户端检查URL
401:认证信息不存在于请求头中(未认证)-----给用户返回让用户先登录
403:请求资源未找到or对访问的URI地址没权限-----让用户提升权限
404:请求资源未找到-----给用户返回请求资源未找到
413:请求体中的数据过大,服务端无法处理这么大的请求体-----调整吞包的上限,一般设置为256M
429:客户端短时间内发送了太多请求,被限制访问了-----减少发送请求的次数
431:请求体重的header头字段太大了,服务端无法处理这么大的头部信息-----调大请求头处理的上限
500:服务端中的代码存在bug-----让研发参与(修bug)
502:多指代理服务器的配置有问题-----检查nginx配置是否有问题、检查代理服务器和负载均衡器时候宕机,登陆上去启动它
504:多指代理得上游服务器错误,通常是代码执行超时、代码发生了死循环-----找到研发,让研发支持解决问题
503:服务器处于超负载or维护状态-----临时加配置
------------------------------------------------------------------------------
#2.将nginx子配置文件的用法搞明白并使用三个子配置文件分别在网页上显示出1 2 3这个三个数字
xxxxxxxxxx
------------------------------------------------------------------------------
#2023年11月6日14:14:17
生产环境中一定要用源码方式部署nginx
------------------------------------------------------------------------------
#错误日志的三元素:
--报错时间点
--报错的接口(URI、url)
--报错的描述
------------------------------------------------------------------------------
#正常小公司用户数和pv量(uv:用户数 pv:点击量)
大概有20万uv每天pv量在150-200之间
------------------------------------------------------------------------------
#1.总结nginx作为中间件上线vue项目的过程,尽量描述准确
在正常的研发环境中,前端工程师将前端代码编辑好之后,交由运维进行上线,运维会自动或手动的执行前端代码的依赖包安装,并在此过程中使用前端独有的命令生成对应的上线产物,此时通过远程的传输手段将产物上线到对应的机器中,至此完成上线。
------------------------------------------------------------------------------
#2.总结故障处理思路
1、确定问题的现象
2、根据现象去到该进程的日志中查看具体的原因
3、根据原因确定解决方案,并实行
4、将该问题编辑成脚本加入到具体的监控软件中,方便下次报错直接处理
------------------------------------------------------------------------------
#3.整理今天所学的负载均衡器的理论及设置方法
1、设置负载均衡机器的header将其传送到上游的服务器中进行识别:
用户的真实IP地址记录到上游Nginx服务器的日志中,可以在负载均衡Nginx的配置中添加以下指令,将用户的真实IP地址通过自定义的HTTP请求头传递给上游服务器:
在Nginx的负载均衡配置中,找到代理服务器相关的位置块(如location
)。
在该location块内添加指令:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这条指令将设置名为X-Forwarded-For
的HTTP请求头,并将其值设置为包含用户真实IP地址的字符串。通过使用$proxy_add_x_forwarded_for
变量,可以将用户真实IP地址添加到原始的X-Forwarded-For
请求头中。
保存配置文件并重新加载Nginx服务,使配置生效。
xxxxxxxxxx
#2023年11月07号作业题
------------------------------------------------------------------------------
#1. 整理nginx负载均衡算法,并背下来
轮询(RR):默认的负载均衡算法,按顺序将请求依次分发给后端服务器,实现简单的均衡负载。
IP哈希(ip_hash):根据客户端的IP地址对请求进行哈希计算,将同一IP的请求分发给相同的后端服务器。
最少连接(least_conn):将请求发送给当前连接数最少的后端服务器。这样可以使请求在服务器上分布得更均衡
加权轮询(weight):为每个后端服务器分配一个权重值,按照权重比例分配请求。权重越高的服务器将接收到更多的请求。
加权URL哈希(hash $request_uri):根据请求的URL进行哈希计算,并根据后端服务器的权重选择服务器来处理相同URL的请求
------------------------------------------------------------------------------
#2. 将nginx高可用keepalived做一遍实验
*
------------------------------------------------------------------------------
#3. 将https原理搞明白,并背下来
https原理总结: 浏览器构造请求体向服务端发送请求, 服务端接收到请求后将被访问域名的证书返回给浏览器, 此时浏览器对证书进行验证, 如果验证为不合法则浏览器警告用户“不安全”, 如果验证正常则生成一个随机数, 并使用证书对该随机数进行加密, 并将加密后的随机数传给服务端, 此时服务端通过私钥解密随机数, 再使用随机数对要返回的响应体进行加密传送给浏览器, 浏览器在通过对应的随机数进行解密, 以此建立的加密通信
------------------------------------------------------------------------------