linux第三周
1、简述HTTP交互原理
交互过程
- DNS解析(客户端访问某一个域名,需要向DNS服务器区解析这个域名对应的IP地址,DNS服务器端会根据这个请求的域名返回一个IP地址)
- 由于HTTP是基于TCP的,所以需要建立TCP的连接,客户端DNS解析完成以后,会跟目的端服务器进行TCP的三次握手,建立连接关系;
- 客户端与服务端建立TCP连接以后,进行数据的发送,客户端会发送request,请求的头部(request header)中一般包含有:
accept:用于告知服(服务器)客户端可以处理的内容;
Accept-Encoding:客户端可以理解的内容编码方式,一般一种压缩算法;
Accept-Language:客户端可以理解的语言类型;
Cache-Control:如何缓存,存多久;
Connection:当前事务处理完成是否会关闭连接,keepalived为长连接;
Host:请求要发送到的主机;
Cookie:由服务器下发给客户端,可用于标记是否登录过;
user-agnet:携带由客户端的信息,操作系统,浏览器类型,手机还是电脑端;
***请求的method(方式)***:
- GET:获取URL对应的资源
- POST:提交请求,用于更新或者创建资源;在web中填写收件地址
- PUT:用于向指定的URL传递更新的资源,幂等;在web中更新收件地址;
- DELETE:用于删除指定的URL的资源,幂等;比如在web上删除收件信息;
- HEAD:用于检查;
- 服务端收到后会对这个request进行回复,将所请求的信息返回给客户端;respone,respone header中一般包含有:
date:时间
server:服务端使用的web软件
Connection:当前事务处理完成是否会关闭连接,keepalived为长连接;
· 还会携带由返回的字节数,长度,上一次资源修改的时间等等; - status code:状态码
- 数据传输完成后,如果是长连接的请求下,连接时间到期以后会断开数据的连接;
2、实现一个Nginx热部署
yum安装nginx热部署
当前nginx版本
[root@upgrade_nginx ~]# nginx -v
nginx version: nginx/1.16.1
创建测试页面
[root@upgrade_nginx conf.d]# cat /etc/nginx/conf.d/test.conf
server {
listen 80;
server_name 10.0.0.254;
location / {
root /upgrade;
default_type html/txt;
}
}
[root@upgrade_nginx conf.d]# mkdir /upguade
[root@upgrade_nginx conf.d]# echo "upgrade_version" > /upguade/index.html
[root@upgrade_nginx conf.d]# cat /upguade/index.html
upgrade_version
上传新版本tar包
[root@upgrade_nginx ~]# ls
anaconda-ks.cfg nginx-1.20.1.tar.gz
安装编译环境
yum install -y gcc gcc-c++ pcre-devel openssl-devel zlib-devel GeoIP-devel GeoIP-data perl-devel perl-ExtUtils-Embed gd-devel libxml2 libxslt-devel gperftools redhat-rpm-config
解压新版本tar包,进行编译
#获取安装的模块
#进入源码包目录,执行./configure;
#编译
make
#进入objs文件夹,此时有nginx二进制文件,以及相关模块文件;
将原二进制文件备份,并将objs中的nginx文件拷贝至/usr/sbin下
;
[root@upgrade_nginx objs]# mv /usr/sbin nginx /usr/sbin/nginx-$(date +%F)
[root@upgrade_nginx objs]# ll /usr/sbin/nginx-2021-06-02
-rwxr-xr-x 1 root root 1215088 Nov 1 2020 /usr/sbin/nginx-2021-06-02
[root@upgrade_nginx objs]# mv nginx /usr/sbin/
[root@upgrade_nginx objs]# ll /usr/sbin/nginx
-rwxr-xr-x 1 root root 8411704 Jun 2 22:38 /usr/sbin/nginx
模块文件的拷贝
#拷贝objs目录下以.so结尾的文件至/usr/sbin
[root@upgrade_nginx objs]# cp ./*.so /usr/sbin/
[root@upgrade_nginx objs]# ll /usr/sbin/*.so
-rwxr-xr-x 1 root root 157704 Jun 2 22:51 /usr/sbin/ngx_http_image_filter_module.so
-rwxr-xr-x 1 root root 186328 Jun 2 22:51 /usr/sbin/ngx_http_perl_module.so
-rwxr-xr-x 1 root root 170384 Jun 2 22:51 /usr/sbin/ngx_http_xslt_filter_module.so
-rwxr-xr-x 1 root root 801032 Jun 2 22:51 /usr/sbin/ngx_mail_module.so
-rwxr-xr-x 1 root root 1342912 Jun 2 22:51 /usr/sbin/ngx_stream_module.so
#将/usr/lib64/nginx/modules目录下所有的模块文件备份;
[root@upgrade_nginx modules]# mkdir /tmp/bak
[root@upgrade_nginx modules]# ls
ngx_http_image_filter_module.so ngx_http_xslt_filter_module.so ngx_stream_module.so
ngx_http_perl_module.so ngx_mail_module.so
[root@upgrade_nginx modules]# mv * /tmp/bak/
[root@upgrade_nginx modules]# ls
[root@upgrade_nginx modules]# ll /tmp/bak/
total 348
-rwxr-xr-x 1 root root 24600 Nov 1 2020 ngx_http_image_filter_module.so
-rwxr-xr-x 1 root root 24528 Nov 1 2020 ngx_http_perl_module.so
-rwxr-xr-x 1 root root 24576 Nov 1 2020 ngx_http_xslt_filter_module.so
-rwxr-xr-x 1 root root 101368 Nov 1 2020 ngx_mail_module.so
-rwxr-xr-x 1 root root 174840 Nov 1 2020 ngx_stream_module.so
#将objs目录下的木块文件拷贝到/usr/lib64/nginx/modules
[root@upgrade_nginx objs]# cp ~/nginx-1.20.1/objs/*.so /usr/lib64/nginx/modules
[root@upgrade_nginx objs]# ll /usr/lib64/nginx/modules
total 2604
-rwxr-xr-x 1 root root 157704 Jun 2 22:57 ngx_http_image_filter_module.so
-rwxr-xr-x 1 root root 186328 Jun 2 22:57 ngx_http_perl_module.so
-rwxr-xr-x 1 root root 170384 Jun 2 22:57 ngx_http_xslt_filter_module.so
-rwxr-xr-x 1 root root 801032 Jun 2 22:57 ngx_mail_module.so
-rwxr-xr-x 1 root root 1342912 Jun 2 22:57 ngx_stream_module.so
替换nginx.pm文件
cp /root/nginx-1.20.1/objs/src/http/modules/perl/nginx.pm /usr/lib64/perl5/vendor_perl/
kill -USR,给nginx发送平滑迁移信号
;
#查看当前nginx的进程号,8048
[root@upgrade_nginx objs]# ps -ef | grep nginx
root 8048 1 0 22:26 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 8049 8048 0 22:26 ? 00:00:00 nginx: worker process
root 12547 7884 0 23:03 pts/0 00:00:00 grep --color=auto nginx
#给nginx发送平滑迁移信号
kill -USR2 `cat /run/nginx.pid`
#查看nginx进程信息,能看到有两个master进程
root 8048 1 0 22:26 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 8049 8048 0 22:26 ? 00:00:00 nginx: worker process
root 12549 8048 0 23:04 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 12550 12549 0 23:04 ? 00:00:00 nginx: worker process
root 12552 7884 0 23:04 pts/0 00:00:00 grep --color=auto nginx
#查看nginx的pid,会出现一个pid.oldbin
[root@upgrade_nginx objs]# ll /run/nginx.pid*
-rw-r--r-- 1 root root 6 Jun 2 23:04 /run/nginx.pid
-rw-r--r-- 1 root root 5 Jun 2 22:26 /run/nginx.pid.oldbin
kill -WHCT,处理完关闭进程
;
kill -WINCH `cat /run/nginx.pid.oldbin`
查看版本
[root@upgrade_nginx objs]# nginx -v
nginx version: nginx/1.20.1
将旧的进程关闭
kill -QUIT `cat /run/nginx.pid.oldbin`
遇到问题1
:
nginx -t 检查语法发现有相关报错:
[root@upgrade_nginx modules]# nginx -t
nginx: [alert] version 1.20.1 of nginx.pm is required, but 1.16.1 was found
nginx: configuration file /etc/nginx/nginx.conf test failed
1、将安装包中.bs和.so文件替换
[root@upgrade_nginx nginx]# find / -type f -name nginx.so
/root/nginx-1.20.1/objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.so
/usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so
[root@upgrade_nginx nginx]# find / -type f -name nginx.bs
/root/nginx-1.20.1/objs/src/http/modules/perl/blib/arch/auto/nginx/nginx.bs
/root/nginx-1.20.1/objs/src/http/modules/perl/nginx.bs
[root@upgrade_nginx nginx]#
2、用nginx.pm文件
[root@upgrade_nginx nginx]# find / -type f -name nginx.pm
/root/nginx-1.20.1/src/http/modules/perl/nginx.pm
/root/nginx-1.20.1/objs/src/http/modules/perl/nginx.pm
/root/nginx-1.20.1/objs/src/http/modules/perl/blib/lib/nginx.pm
/usr/lib64/perl5/vendor_perl/nginx.pm
cp /root/nginx-1.20.1/objs/src/http/modules/perl/nginx.pm /usr/lib64/perl5/vendor_perl/
源码安装nginx热部署
1、查看老版本的nginx版本
2、编译新版本nginx
3、文件替换
4、kill -USR2平滑迁移
5、kill -WINCH处理完请求以后关闭
6、kill -QUIT关闭旧进程
回退:
7、kill -HUB拉起旧worker进程;
8、kill -WINCH让新进程处理完请求以后关闭
9、kill -QUIT关闭新进程
3、搭建一款Wordpress博客系统
Wordpress是使用PHP编写的,需要依赖于LNMP环境;
环境拓扑如下(单LVS-NAT模式):
-
web服务器配置
#nginx安装,php安装,nginx调用php,php环境连接mysql,提供访问的资源/code/wordpress;
#nginx配置文件
#GW指向router
-
proxy配置(RS节点)
#nginx安装
#nginx配置 :
1、定义stream
2、定义server块,监听端口,监听域名/地址,location路径,rewrite;
#GW指向LVS的DIP
-
LVS配置
#开启IP转发
#配置VIP,将访问VIP的流量代理到RIP(proxy),NAT模式
VIP:10.0.0.1
DIP:10.0.0.5
RIP:10.0.0.2
RIP:10.0.0.3
#由于LVS的DIP、VIP、RIP都为同一个网段,且web服务器的GW为DIP,会出现重定向(即web服务器的真实网关为10.0.0.5(LVS),然后LVS的网关为10.0.0.7,则web服务器回包的时候会直接到10.0.0.7,导致访问失败,需要关闭重定向;)
- route配置
#配置公网连接地址,默认路由指向公网
WAN IP:192.168.60.241
LAN IP:10.0.0.7
#iptables规则配置,DNAT,SNAT
· 验证
#windws的hosts文件修改:
#访问站点:
#刷新,查看proxy上的access.log
碰到问题:
LVS需要关闭重定向,不然web服务器的回包不需要经过IPVS,直接会到router;
4、简述对称加密与非对称加密
对称加密
即加密/解密使用同一把钥匙;
Bob使用A秘钥对文档进行加密,通过中间网络传递到Alice,而Alice收到该文档以后也是用A秘钥进行解密,从而打开文档里的内容;
对称加密的前提:
双方必须拥有相同的钥匙才能进行文档的加解密;
非对称加密
即根据算法,生成一对秘钥,公钥加密,私钥解密;
1、Alice事先将公钥传递给Bob;
2、Bob拿着Alice给的公钥对一个文档进行加密,传输到Alice;
3、Alice使用自己的私钥对这个加密的文档进行解密,从而读取到文档里头的数据;
非对称加密的前提:
私钥自己用,公钥传递到对端,事先需要先传递公私钥;
HTTPS
HTTPS是在HTTP的基础上,套接了一层SSL(现在使用的TLS);
一、证书的验证(秘钥的交互、生成)------>非对称加密
1、浏览器向服务器发起请求,携带random1、协议的版本(TLS1.1/1.2/1.3)、加密的算法
2、服务器端接收请求,并返回证书,携带random2、随机数2;
3、浏览器向CA机构进行验证,不合法—告警提示,合法-----进行下一步(至此服务端与浏览器都拥有相同的加密算法+random1、random2、证书–客户端拥有公钥,服务端拥有私钥);
4、若合法,浏览器生成random3,同时使用公钥加密random3,传递到服务端,服务端使用私钥解密;(至此浏览器与服务端同时拥有相同的加密算法,random1+random2+random3)
5、服务端与客户端使用random1、random2、random3生成对称秘钥,数据传输时使用对称秘钥对数据进行加密;
二、数据的加密传输-------->对称加密
6、使用对称秘钥对数据进行加密传输;
HTTPS秘钥如何生成,如何验证:
秘钥的生成需要依赖于CA机构,服务端申请证书(证书中包含有一对公私钥),安装在服务器端;
秘钥的验证需要依赖于CRL服务器,或者CA服务器端的OCSP相应程序;也可以在nginx上打开OCSP的开关,客户端向nginx去验证;
5、实现一个keepalive高可用测试
环境拓扑如下:
keepalived+LVS(DR模式)
web服务器配置:
1、网卡地址
内网网卡:10.0.0.10 10.0.0.11 GW:10.0.0.7
2、环境安装、配置(LNMP)
3、代码部署
RS节点配置
1、网卡地址
内网网卡:10.0.0.2 10.0.0.3 GW:10.0.0.7
VIP(loopback口):10.0.0.1(VIP)
2、nginx安装、配置(代理);
DS节点(lvs)配置
1、网卡地址
内网网卡 : 10.0.0.5 10.0.0.6 GW:10.0.0.7
VIP:10.0.0.1
2、ip转发forward 配置
3、lvs、keepalived安装
4、keepalived配置文件修改:
master配置文件:
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens34
virtual_router_id 51
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.1
}
}
virtual_server 10.0.0.1 80 {
delay_loop 6
lb_algo wlc
#LVS的模式
lb_kind DR
perssisstence_timeout 5
protocol TCP
real_server 10.0.0.2 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 2
delay_beefore_retry 3
}
}
real_server 10.0.0.3 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 2
delay_beefore_retry 3
}
}
}
virtual_server 10.0.0.1 443 {
delay_loop 6
lb_algo wlc
lb_kind DR
perssisstence_timeout 5
protocol TCP
real_server 10.0.0.2 443 {
weight 1
TCP_CHECK {
connect_port 443
connect_timeout 3
nb_get_retry 2
delay_beefore_retry 3
}
}
real_server 10.0.0.3 443 {
weight 1
TCP_CHECK {
connect_port 443
connect_timeout 3
nb_get_retry 2
delay_beefore_retry 3
}
}
}
route节点配置
1、网卡地址:
内网网卡:10.0.0.7
外网网卡 : 192。168.60.241 GW 192.168.60.2
2、ip转发 forward
3、iptables配置(DNAT)
测试:
1、测试RS节点故障一台以后LVS是否能够正常调度;
#关闭ds节点的nginx
#查看keepalived日志
健康检查发现DS节点不可达,移除DS节点
#访问业务
2、测试lvs一个节点故障以后业务访问
#在master停用keepalived
VIP迁移到BACKUP节点
访问业务