http&nginx&keepalived

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节点
在这里插入图片描述
访问业务
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值