• 架构师第六周作业


    第六周

    一、实现harbor的高可用

    #环境准备:
    第一台主机:ubuntu  harbor1   10.0.0.151
    第二台主机:centos7  harbor2  10.0.0.152
    
    1.安装docker
    #见上一次作业
    
    2.harbor以来docker compose,所以先安装docker compose
    方法1:通过pip安装
    [root@Harbor1 ~]  #yum -y   install python3
    [root@Harbor1 ~]  #pip3   install --upgrade pip
    [root@Harbor1 ~]  #pip3   install docker-compose
    
    方法2:下载程序(此方法更快)
    [root@Harbor1 ~]  #curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    
    #添加可执行权限
    [root@Harbor1 ~]  #chmod +x /usr/local/bin/docker-compose
    
    
    
    3.下载Harbor安装包并解压缩
    [root@Harbor1 ~]  #wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.6.tgz
    [root@Harbor1 ~]  #mkdir /apps
    [root@Harbor1 ~]  #tar xvf harbor-offline-installer-v1.7.6.tgz -C   /apps
    
    4.修改harbor配置文件
    [root@Harbor1 ~]  #vim /apps/harbor/harbor.cfg
    #只需要修改下面两行
    hostname = 10.0.0.151    #修改此行,指向当前主机IP 或 FQDN
    harbor_admin_password = 123456   #修改此行指定harbor登录用户admin的密码
    
    5.运行harbor安装脚本
    [root@Harbor1 ~]  # /apps/harbor/install.sh
    #centos7没问题。但是ubuntu因为没有/usr/bin/python文件,运行/apps/harbor/install.sh会报错。拉不起容器。这里通过创建软链接解决
    /apps/harbor/install.sh: ./prepare: /usr/bin/python: bad interpreter: No such file or directory
    [root@Harbor1 ~]  #  ln -s   /usr/bin/python3.6 /usr/bin/python
    
    #查看相关容器
    [root@Harbor1 ~] # docker ps
    CONTAINER ID   IMAGE                                    COMMAND                  CREATED          STATUS                             PORTS                                                                                                                 NAMES
    b3a907af0c50   goharbor/nginx-photon:v1.7.6             "nginx -g 'daemon of…"   8 seconds ago    Up 7 seconds (health: starting)    0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:4443->4443/tcp, :::4443->4443/tcp   nginx
    2156c970ccc1   goharbor/harbor-jobservice:v1.7.6        "/harbor/start.sh"       10 seconds ago   Up 9 seconds                                                                                                                                             harbor-jobservice
    301fa9b3b260   goharbor/harbor-portal:v1.7.6            "nginx -g 'daemon of…"   10 seconds ago   Up 8 seconds (health: starting)    80/tcp                                                                                                                harbor-portal
    44d513fc24a1   goharbor/harbor-core:v1.7.6              "/harbor/start.sh"       12 seconds ago   Up 10 seconds (health: starting)                                                                                                                         harbor-core
    bccd0ee05b52   goharbor/harbor-db:v1.7.6                "/entrypoint.sh post…"   16 seconds ago   Up 12 seconds (health: starting)   5432/tcp                                                                                                              harbor-db
    8c636669ec89   goharbor/harbor-registryctl:v1.7.6       "/harbor/start.sh"       16 seconds ago   Up 11 seconds (health: starting)                                                                                                                         registryctl
    7a1ad24b012a   goharbor/redis-photon:v1.7.6             "docker-entrypoint.s…"   16 seconds ago   Up 14 seconds                      6379/tcp                                                                                                              redis
    0f0e1ac82fad   goharbor/harbor-adminserver:v1.7.6       "/harbor/start.sh"       16 seconds ago   Up 13 seconds (health: starting)                                                                                                                         harbor-adminserver
    a5fd2b4c2860   goharbor/registry-photon:v2.6.2-v1.7.6   "/entrypoint.sh /etc…"   16 seconds ago   Up 12 seconds (health: starting)   5000/tcp                                                                                                              registry
    f7c1a8e06c63   goharbor/harbor-log:v1.7.6               "/bin/sh -c /usr/loc…"   17 seconds ago   Up 16 seconds (health: starting)   127.0.0.1:1514->10514/tcp                                                                                             harbor-log
    
    
    6.登陆harbor的web页面,并创建项目test(公开)
    用浏览器访问 http://10.0.0.151/
    用户名: admin
    密码: 123456  即前面harbor.cfg中指定的密码
    
    7.命令行登录harbor并上传镜像到仓库
    #修改docker服务文件
    [root@Harbor1 ~]  # grep ExecStart /lib/systemd/system/docker.service
    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  --insecure-registry 10.0.0.151 --insecure-registry 10.0.0.152
    
    
    #命令行登陆harbor
    root@harbor1:~# docker login 10.0.0.151
    Username: admin
    Password: 123456
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
    Login Succeeded
    
    
    #给本地镜像打标签并上传到harbor
    修改 images 的名称,不修改成指定格式无法将镜像上传到 harbor 仓库
    [root@centos7 ~]  # docker tag alpine:latest 10.0.0.151/test/alpine:latest
    [root@centos7 ~]  # docker push 10.0.0.151/test/alpine:latest
    
    #最后访问harbor网站验证上传镜像成功 
    
    8.实现Harbor的高可用
    #Harbor支持基于策略的Docker镜像复制功能,这类似于MySQL的主从同步,其可以实现不同的数据中心、不同的运行环境之间同步镜像,并提供友好的管理界面,大大简化了实际运维中的镜像管理工作,已经有用很多互联网公司使用harbor搭建内网docker仓库的案例,并且还有实现了双向复制功能
    
    8.1.在另一台主机上搭建Harbor
    #参照上述步骤,在第二台主机上搭建Harbor
    #harbor.cfg中配置文件中 hostname 修改为本机地址,其他步骤相同
    
    8.2.第二台harbor上新建项目
    #参考第一台harbor服务器的项目名称,在第二台harbor服务器上新建与之同名的项目test(公开)
    
    8.3.第二台harbor上仓库管理中新建目标
    #参考第一台主机信息,新建复制(同步)目标信息,将第一台主机设为复制的目标。
    #登录管理网页,点击系统管理--仓库管理--新建目标。输入第一台harbor服务器上的主机和用户信息,目标名:test,目标url:http://10.0.0.151,用户名:admin,密码:123456
    
    8.4.二台harbor(10.0.0.152)上新建复制规则实现到第一台harbor的单向复制
    #在第二台harbor上建立复制的目标主机,即第一台harbor主机
    #登录管理网页,点击系统管理--复制管理--新建规则,名称:test,源项目:test,目标:test-http://10.0.0.151,出发模式:即刻,勾选“删除本地镜像的同时也删除远程的镜像”和“立即复制现有的镜像”。
    
    8.5.在第一台harbor(10.0.0.151)上重复上面操作
    #以上操作,只是实现了从第二台harbor主机10.0.0.152到第一台harbor主机10.0.0.151的单向同步在第一台harbor上再执行下面操作,才实现双向同步
    #登录管理网页,点击系统管理--仓库管理--新建目标。输入第二台harbor服务器上的主机和用户信息,目标名:test,目标url:http://10.0.0.152,用户名:admin,密码:123456
    #登录管理网页,点击系统管理--复制管理--新建规则,名称:test,源项目:test,目标:test-http://10.0.0.152,出发模式:即刻,勾选“删除本地镜像的同时也删除远程的镜像”和“立即复制现有的镜像”。
    
    8.6.确认同步成功
    #管理网页,项目中,在第二台harbor主机上可以查看到从第一台主机同步过来的镜像
    
    8.7.在第二台harbor上传镜像验证是否可以双向同步
    [root@Harbor2 ~]  # docker login 10.0.0.152
    [root@Harbor2 ~]  # docker tag busybox:latest  10.0.0.152/test/busybox
    [root@Harbor2 ~]  # docker push 10.0.0.152/test/busybox
    #在两台主机的管理网页中已经可以看到镜像同步了
    

    二、几种IO模型的原理

    1.服务端 I/O 流程
    I/O在计算机中指Input/Output, IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。
    
    一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说:###I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。###
    
    Linux 的 I/O 。磁盘I/O。网络I/O : 一切皆文件,本质为对socket文件的读写
    
    2.磁盘 I/O
    磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间。
    
    机械磁盘的寻道时间、旋转延迟和数据传输时间:
    寻道时间:是指磁头移动到正确的磁道上所花费的时间,寻道时间越短则I/O处理就越快,目前磁盘的寻道时间一般在3-15毫秒左右。
    
    旋转延迟:是指将磁盘片旋转到数据所在的扇区到磁头下面所花费的时间,旋转延迟取决于磁盘的转速,通常使用磁盘旋转一周所需要时间的1/2之一表示,比如7200转的磁盘平均训传延迟大约为60*1000/7200/2=4.17毫秒,公式的意思为 (每分钟60秒*1000毫秒每秒/7200转每分/2),如果是15000转的则为60*1000/15000/2=2毫秒。
    
    数据传输时间:指的是读取到数据后传输数据的时间,主要取决于传输速率,这个值等于数据大小除以传输速率,目前的磁盘接口每秒的传输速度可以达到600MB,因此可以忽略不计。
    
    常见的机械磁盘平均寻道时间值:
    7200转/分的磁盘平均物理寻道时间:9毫秒
    10000转/分的磁盘平均物理寻道时间:6毫秒
    15000转/分的磁盘平均物理寻道时间:4毫秒
    
    常见磁盘的平均延迟时间:
    7200转的机械盘平均延迟:60*1000/7200/2 = 4.17ms
    10000转的机械盘平均延迟:60*1000/10000/2 = 3ms
    15000转的机械盘平均延迟:60*1000/15000/2 = 2ms
    
    每秒最大IOPS的计算方法:
    7200转的磁盘IOPS计算方式:1000毫秒/(9毫秒的寻道时间+4.17毫秒的平均旋转延迟时间)=1000/13.13=75.9 IOPS
    10000转的磁盘的IOPS计算方式:1000毫秒/(6毫秒的寻道时间+3毫秒的平均旋转延迟时间)=1000/9=111IOPS
    15000转的磁盘的IOPS计算方式:15000毫秒/(4毫秒的寻道时间+2毫秒的平均旋转延迟时间)=1000/6=166.6 IOPS
    
    3. 网络 I/O
    网络通信就是网络协议栈到用户空间进程的IO就是网络IO
    网络I/O 处理过程:
    (1)网络请求。
    (2)copy到内核空间。
    (3)copy到用户空间进程内存中。
    (4)web进程处理用户请求。
    (5)copy到内核空间。
    (6)copy到网卡。
    (7)返回数据。
    获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)
    构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)
    返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)
    
    不论磁盘和网络I/O,每次I/O,都要经由两个阶段:
    第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
    第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
    
    4. #I/O 模型相关概念
    同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
    #(1)同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
    #(2)异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
    
    阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
    #(1)阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
    #(2)非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
    
    5.# 网络 I/O 模型
    阻塞型、非阻塞型、复用型、信号驱动型、异步
    #(1)阻塞型 I/O 模型(blocking IO)
    阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞
    
    非阻塞:程序向内核发送请I/O求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回IO结果,进用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作
    
    用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个I/O请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够
    
    优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源
    
    缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销较大,apache 的preforck使用的是这种模式。
    
    同步阻塞:程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进程将一直等待并不再接受新的请求,并由进程轮训查看I/O是否完成,完成后进程将I/O结果返回给Client,在IO没有返回期间进程不能接受其他客户的请求,而且是有进程自己去查看I/O是否完成,这种方式简单,但是比较慢,用的比较少。
    
    #(2)非阻塞型 I/O 模型 (nonblocking IO)
    用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即 “轮询”机制存在两个问题:如果有大量文件描述符都要等,那么就得一个一个的read。这会带来大量的Context Switch(read是系统调用,每调用一次就得在用户态和核心态切换一次)。轮询的时间不好把握。这里是要猜多久之后数据才能到。等待时间设的太长,程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU而已,是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。
    
    非阻塞:程序向内核发送请I/O求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回IO结果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核I/O是否完成。
    
    #(3)多路复用 I/O 型(I/O multiplexing)
    I/O multiplexing 主要包括:select,poll,epoll三种系统调用,select/poll/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/poll/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
    
    当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
    
    Apache prefork是此模式的select,work是poll模式。
    
    IO多路复用(IO Multiplexing) :是一种机制,程序注册一组socket文件描述符给操作系统,表示“我要监视这些fd是否有IO事件发生,有了就告诉程序处理”
    
    IO多路复用一般和NIO一起使用的。NIO和IO多路复用是相对独立的。NIO仅仅是指IO API总是能立刻返回,不会被Blocking;而IO多路复用仅仅是操作系统提供的一种便利的通知机制。操作系统并不会强制这俩必须得一起用,可以只用IO多路复用 + BIO,这时还是当前线程被卡住。IO多路复用和NIO是要配合一起使用才有实际意义
    
    IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,就通知该进程多个连接共用一个等待机制,本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上,而不是阻塞在真正的IO操作上
    
    用户首先将需要进行IO操作添加到select中,同时等待select系统调用返回。当数据到达时,IO被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行
    
    从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视IO,以及调用select函数的额外操作,效率更差。并且阻塞了两次,但是第一次阻塞在select上时,select可以监控多个IO上是否已有IO操作准备就绪,即可达到在同一个线程内同时处理多个IO请求的目的。而不像阻塞IO那种,一次只能监控一个IO
    
    虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只是注册自己需要的IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率
    
    IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO模型,而非真正的异步IO
    
    优点:可以基于一个阻塞对象,同时在多个描述符上等待就绪,而不是使用多个线程(每个文件描述符一个线程),这样可以大大节省系统资源
    
    缺点:当连接数较少时效率相比多线程+阻塞 I/O 模型效率较低,可能延迟更大,因为单个连接处理需要 2 次系统调用,占用时间会有增加
    
    IO多路复用适用如下场合:
    当客户端处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用
    当一个客户端同时处理多个套接字时,此情况可能的但很少出现
    当一个服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到I/O复用
    当一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用
    当一个服务器要处理多个服务或多个协议,一般要使用I/O复用
    
    #(4) 信号驱动式 I/O 模型 (signal-driven IO)
    信号驱动I/O的意思就是我们现在不用傻等着了,也不用去轮询。而是让内核在数据就绪时,发送信号通知我们。
    
    调用的步骤是,通过系统调用 sigaction ,并注册一个信号处理的回调函数,该调用会立即返回,然后主程序可以继续向下执行,当有I/O操作准备就绪,即内核数据就绪时,内核会为该进程产生一个SIGIO 信号,并回调注册的信号回调函数,这样就可以在信号回调函数中系统调用 recvfrom 获取数据,将用户进程所需要的数据从内核空间拷贝到用户空间
    
    此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。
    
    在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。
    
    优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此可以提高资源的利用率
    
    缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知
    
    异步阻塞:程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核收到进程请求后进行的IO如果不能立即返回,就由内核等待结果,直到IO完成后内核再通知进程,apache event是此模式
    
    #(5)异步 I/O 模型 (asynchronous IO)
    异步I/O 与 信号驱动I/O最大区别在于,信号驱动是内核通知我们何时开始一个I/O操作,而异步I/O是由内核通知我们I/O操作何时完成,两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把等待上菜的时间也给省了
    
    相对于同步I/O,异步I/O不是顺序执行。用户进程进行aio_read系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。等到socket数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。IO两个阶段,进程都是非阻塞的。
    
    异步IO与信号驱动IO最主要的区别是信号驱动IO是由内核通知应用程序何时可以进行IO操作,而异步IO则是由内核告诉用户线程IO操作何时完成。信号驱动IO当内核通知触发信号处理程序时,信号处理程序还需要阻塞在从内核空间缓冲区拷贝数据到用户空间缓冲区这个阶段,而异步IO直接是在第二个阶段完成后,内核直接通知用户线程可以进行后续操作了
    
    优点:异步 I/O 能够充分利用 DMA 特性,让 I/O 操作与计算重叠
    
    缺点:要实现真正的异步 I/O,操作系统需要做大量的工作。目前 Windows 下通过 IOCP 实现了真正的异步 I/O,在 Linux 系统下,Linux 2.6才引入,目前 AIO 并不完善,因此在 Linux 下实现高并发网络编程时以 IO 复用模型模式+多线程任务的架构基本可以满足需求
    
    Linux提供了AIO库函数实现异步,但是用的很少。目前有很多开源的异步IO库,例如libevent、libev、libuv。
    
    异步非阻塞:程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核调用的IO如果不能立即返回,内核会继续处理其他事物,直到IO完成后将结果通知给内核,内核在将IO完成的结果返回给进程,期间进程可以接受新的请求,内核也可以处理新的事物,因此相互不影响,可以实现较大的同时并实现较高的IO复用,因此异步非阻塞使用最多的一种通信方式
    
    6.# 五种 IO 对比
    可以看到前 4 种模型的主要区别在于第一阶段,因为它们的第二阶段是一样的:在数据从内核复制到用户进程的缓冲区期间,进程阻塞与 recvfrom 调用,相反异步 IO 模型在这两个阶段都要处理,从而不同于其他 4 种模型。
    

    三、配置虚拟主机,实现强制https跳转访问www.x.com(x.com为自己定义的域名)

    #Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据.
    
    #(1)https 配置参数
    #nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数--with-http_ssl_module开启
    
    配置参数如下:
    ssl on | off; #老版本使用,新版本淘汰  
    listen 443 ssl;#新版本直接在listen后面加ssl
    #为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
    ssl_certificate /path/to/file;
    #指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件
    ssl_certificate_key /path/to/file;
    #当前虚拟主机使用的私钥文件,一般是key文件
    ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 
    #支持ssl协议版本,早期为ssl现在是TLS,默认为后三个
    ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
    #配置ssl缓存
       off: #关闭缓存
     none:  #通知客户端支持ssl session cache,但实际不支持
     builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有
     [shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间
    大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称
    ssl_session_timeout time;
    #客户端连接可以复用ssl session cache中缓存的有效时长,默认5m
    
    #(2)自签名证书
    #自签名CA证书
    [root@centos8 ~]# cd /apps/nginx/
    [root@centos8 nginx]# mkdir certs
    [root@centos8 nginx]# cd certs/
    [root@centos8 nginx]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout 
    ca.key -x509 -days 3650 -out ca.crt #自签名CA证书
    Generating a 4096 bit RSA private key
    .................++
    .....
    Country Name (2 letter code) [XX]:CN #国家代码
    State or Province Name (full name) []:HuBei  #省份
    Locality Name (eg, city) [Default City]:HuBei #城市名称
    Organization Name (eg, company) [Default Company Ltd]:tan #公司名称   
    Organizational Unit Name (eg, section) []:tan #部门
    Common Name (eg, your name or your server's hostname) []:ca.tan.org #通用名称
    Email Address []: qqq@qq.com#邮箱
    [root@centos8 certs]# ll ca.crt 
    -rw-r--r-- 1 root root 2118 Feb 22 12:10 ca.crt
    
    #自制key和csr文件
    [root@centos8 certs]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout 
    www.tan.org.key     -out www.tan.org.csr 
    Generating a 4096 bit RSA private key
    ........................................................................++
    ......
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:HuBei
    Locality Name (eg, city) [Default City]:HuBei
    Organization Name (eg, company) [Default Company Ltd]:tan.org
    Organizational Unit Name (eg, section) []:tan.org
    Common Name (eg, your name or your server's hostname) []:www.tan.org
    Email Address []:qqqq@qq.com
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:      
    An optional company name []:
    [root@centos8 certs]# ll
    total 16
    -rw-r--r-- 1 root root 2118 Feb 22 12:10 ca.crt
    -rw-r--r-- 1 root root 3272 Feb 22 12:10 ca.key
    -rw-r--r-- 1 root root 1760 Feb 22 12:18 www.tan.org.csr
    -rw-r--r-- 1 root root 3272 Feb 22 12:18 www.tan.org.key
    #签发证书
    [root@centos8 certs]# openssl x509 -req -days 3650 -in www.tan.org.csr -CA 
    ca.crt -CAkey ca.key -CAcreateserial -out www.tan.org.crt
    
    #验证证书内容
    [root@centos8 certs]# openssl x509 -in www.tan.org.crt -noout -text 
    Certificate:
       Data:
           Version: 1 (0x0)
           Serial Number:
               bb:76:ea:fe:f4:04:ac:06
       Signature Algorithm: sha256WithRSAEncryption
           Issuer: C=CN, ST=HuBei, L=HuBei, O=tan, OU=tan, 
    CN=tan.ca/emailAddress=qqqq@qq.com
           Validity
               Not Before: Feb 22 06:14:03 2019 GMT
               Not After : Feb 22 06:14:03 2020 GMT
           Subject: C=CN, ST=HuBei, L=HuBei, O=tan.org, OU=tan.org, 
    CN=www.tan.org/emailAddress=qqqq@qq.com
           Subject Public Key Info:
               Public Key Algorithm: rsaEncryption
                   Public-Key: (4096 bit)
                    
    #合并CA和服务器证书成一个文件,注意服务器证书在前
    [root@centos8 certs]#cat www.tan.org.crt ca.crt > www.tan.org.pem
    
    #(3) https 配置
    server {
     listen 80;
     listen 443 ssl;
     ssl_certificate /apps/nginx/certs/www.tan.org.pem;
     ssl_certificate_key /apps/nginx/certs/www.tan.org.key;
     ssl_session_cache shared:sslcache:20m;
     ssl_session_timeout 10m;
     root /data/nginx/html; 
    }
    #重启Nginx并访问验证
    
    #(4) 自动跳转 https
    基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全部自动跳转至 https,另外也可以实现部分 location 跳转
    
    [root@centos8 ~]#vim /apps/nginx/conf.d/pc.conf
    server {
     listen 443 ssl;
     listen 80;
     ssl_certificate /apps/nginx/certs/www.tan.org.crt;
     ssl_certificate_key /apps/nginx/certs/www.tan.org.key;
     ssl_session_cache shared:sslcache:20m;
     ssl_session_timeout 10m;
     server_name www.tan.org;
     location / {    #针对全站跳转
       root /data/nginx/html/pc;
       index index.html;
        if ($scheme = http ){  #如果没有加条件判断,会导致死循环
       rewrite / https://$host redirect;
       }  
     }
     location /login {     #针对特定的URL进行跳转https 
     if ($scheme = http ){  #如果没有加条件判断,会导致死循环
       rewrite / https://$host/login redirect;
       }
    
     }
    }
    
    #重启Nginx并访问测试
    [root@centos7 ~]#curl -ikL www.tan.org
    

    四、配置nginx通过不同path反代至不同后端tomcat(即访问www.a.com/a/反代至tomcat1,访问www.a.com/b/反代至tomcat2)

    tomcat1 http://10.0.0.152
    tomcat2 http://10.0.0.162
    
    修改nginx.conf
     server {
            listen       80;
            server_name  www.tan.com;
    
            location ~/a/ {
                proxy_pass http://10.0.0.152:8080;
            }
            location ~/b/{
                proxy_pass http://10.0.0.162:8080;
     }
        }
  • 相关阅读:
    python 中 repr() 与str() 区别
    python高级特性 知识 架构总结
    python 递归 之加特技 汉诺塔
    python 递归 反转字符串
    git 的使用
    vim 常用命令
    ubuntu下零基础建站之python基础环境搭建
    Oracle 分组统计,抽取每组前十
    SQL Server2008知识点总结
    java 连接sql server2008配置
  • 原文地址:https://www.cnblogs.com/tanll/p/16280159.html
Copyright © 2020-2023  润新知