把我的服务开放给用户| 青训营笔记

164 阅读7分钟

课程目标

  • 系统的熟悉和学习到企业级网络接入核心组件及基本原理
  • 了解从输入网页到内容加载出来
  • 从零搭建自己的网站和博客
  • 当访问服务出现问题时,可以针对性故障分析与解决

01.接入问题引入

1.1 输入www.toutiao.com到网页加载出来,都经历了什么?

  1. 域名解析
  2. TCP建立连接
  3. SSL握手
  4. ……
graph LR
DNS-->TCP-->TLS-->HTTP请求

1.2 字节接入框架

字节接入框架

02.企业接入升级打怪之路

  • 域名系统
  • 自建DNS服务器
  • HTTPS协议
  • 接入全站加速
  • 四层负载均衡
  • 七层负载均衡

2.1 使用域名系统

2.1.1 HOST管理

  • 公司维护 /etc/hosts主机表
  • 随着规模增加,遇到如下问题:
    • 流量和负载:用户增长、文件越来越大
    • 名称冲突
    • 时效性:分发靠人工上传,时效性太差

2.1.2 使用域名系统

使用域名系统替换hosts文件

关于域名空间:

  • 结构为树型
  • 通过划分zone的方式进行分层授权
  • 全球公共域名空间仅对应一棵树
  • 查询起点:根域名服务器
  • 域名组成格式:[a-zA-Z0-9_-],以点划分label

2.1.3 域名购买与配置迁移

  • 购买二级域名
  • 域名备案
  • 修改配置:
    • 清空/etc/hosts
    • 配置/etc/resolv.conf中的nameservers为公共DNS
    • 迁移原配置,通过控制台添加解析记录即可

2.1.4 如何开放外部用户访问

方案:租赁一个外网ip,将公司主页解析到外网ip,将ip绑定到一台物理机上,并发布公网route,用于外部用户访问。

2.2 自建DNS服务器

2.2.1问题背景

  • 内网域名的解析也得出公网去获取,效率低下
  • 外部用户看得到内网ip,容易被攻击
  • 云厂商DNS容易出故障,影响用户体验
  • 持续扩大公司品牌技术影响力,使用自己的DNS系统

2.2.2 DNS查询过程

2.2.3 DNS记录类型

  • A/AAAA:IP指向记录,用于指向IP,前者为ipv4、后者为ipv6
  • CNAME:别名记录
  • TXT:文本记录
  • MX:邮件交换机路
  • NS:解析服务器记录
  • SOA:起始授权机构记录

2.2.4 权威DNS系统架构

思考:站在企业的角度思考,我们需要的是哪种DNS服务器?

答案:权威DNS、LocalDNS

常见开源DNS:bind、nsd、knot、coredns

bind:

  • query
  • response
  • update
  • notify
  • XFR 拉取变更

2.2.5 权威DNS系统架构

  • 用户向local DNS请求
  • 用户向公司权威DNS服务器请求
  • 访问到公司服务

2.3 接入https协议

问题背景

  • 页面出现白页、奇怪的东西
  • 返回了403
  • 搜索不了东西
  • 弹窗广告
  • 搜索后被大数据了

原因:使用了http明文传输,内容被运营商篡改和获取

2.3.2 对称加密和非对称加密

常见加密算法:

  • 对称加密:一份密钥
  • 非对称加密:公钥和私钥
    • RSA算法

2.3.3 SSL的通信过程

  • client random
  • server random
  • premaster secret
  • 加密算法协商
  • 生成对称密钥 session key

2.3.4 证书链

  • server端发送是带签名的证书链

  • client收到后需要验证

    • 是否可信机构颁布
    • 域名与访问是否一致
    • 数字签名是否一致
    • 证书的有效期
    • 证书撤回状态
  • 查找证书链指纹(摘要信息)

  • 加密指纹得到数字签名

  • 服务器将上次CA公钥解密

2.3.5 使用https

2.4 接入全站加速

2.4.1问题背景

外网访问站点可能会出现什么问题?

  • 源站容量低,可承载的并发请求数低,容易被打垮
  • 报文经过的网络设备多,出问题概率大。如丢包、劫持、MTU
  • 自主选网络链路长,时延高

2.4.2 解决问题

  • 源站容量问题
    • 增加后端机器
    • 静态扩容,使用静态加速缓存
  • 网络传输问题
    • 动态加速DCDN
  • 全站加速
    • 静态加速
    • 动态加速

2.4.3 静态加速CDN

针对静态文件传输,网络优化方式?

  • 缓存

  • 客户端连接cdn节点

  • 智能调整DNS

优势:

  • 解决服务器端的第一公里问题
  • 缓解甚至消除了不同运营商之间的互联的瓶颈造成的影响
  • 减轻了各省的出口带宽压力
  • 优化了网上热点内容的分布

2.4.4 动态加速 DCDN

  • 动态内容无法缓存
  • 采用智能选路技术

2.4.5 DCDN原理

2.4.6 使用全站加速

  • 注册抖音:动态
  • 点开某个视频:静态加速
  • 用户打开官网:动态加静态

2.5 四层负载均衡

2.5.1 运营商处租用的公网ip,如何使用最合理

  • 现状:直接找一个物理机,将网卡配上这个ip,起server监听即可
  • 多个应用起多个监听端口即可
  • 使用多个ip

怎样尽可能充分利用和管理公网ip资源?

2.5.2 什么是4层负载均衡

基于IP+端口,利用某种算法将报文转发给某个后端服务器,实现负载均衡地落到后端服务器上。

三个主要功能:

  1. 解耦vip(虚拟ip,用户使用服务的入口)和rs(real server)
  2. NAT
  3. 防攻击: syn proxy

2.5.3 常见的调度算法原理

  • RR轮询:平均分配每个真实RS
  • 加权RR轮询:给每一个RS一个比例,按比例分配
  • 最小连接:分配到连接数最小的服务器
  • 五元组hash
    • 缺点:某个服务器故障后,所有连接重新计算
  • 一致性hash
    • 只影响故障服务器上的连接session

2.5.4 常见的实现方法fullnat

提问:RS怎么知道真实的CIP

  • 通过TCP option字段传递
  • 再通过特殊的内核模块进行反解

2.5.5 4层负载均衡特点

  • 大部分使用dpdk
  • 纯用户态协议栈,kernel bypass,消除协议栈瓶颈
  • 无缓存、零拷贝、大页内存,减少cache miss
  • 仅针对4层数据包转发,小包转发可达到限速,可承受高cps(高并发)

2.5.6 使用4层负载均衡

2.6 7层负载均衡

2.6.1问题背景

提问:四层负载只能bind一个80端口,而有多个外部站点使用,如何解决?

有一些7层相关的配置需求,该如何做?

  • SSL卸载
  • 请求重定向
  • 路由添加匹配策略
  • header编辑
  • 跨域支持
  • 协议支持:websocket、grpc、quic

2.6.2 Nginx 简介

  • 最灵活的高性能web server,应用最广的7层反向代理
  • 模块化设计,易于扩展
  • 基于master/worker架构设计
  • 支持热部署,可在线升级
  • 不停机更新配置文件、更换日志文件、更新服务器二进制
  • 较低的内存消耗
  • 事件驱动:异步非阻塞模型、支持aio、mmap(内存映射)

2.6.4 Nginx反向代理示意图

代理服务器功能

  • keepalive
  • 访问日志
  • url rewrite
  • 路径别名
  • 基于ip的用户的访问控制
  • 限速及并发连接数控制
  • ……

2.6.5 Nginx内部架构

Nginx内部

2.6.6 事件驱动模型

  • 将各种网络事件当做独立的时间处理

2.6.7 异步非阻塞

  • 传统服务器
    • 一个进程处理一个连接、请求
    • 阻塞模型
    • 依赖OS实现并发
  • Nginx
    • 一个进程处理多个连接
    • 异步非阻塞模型
    • 减少OS进程切换

2.6.8 Nginx简单调优

Nginx调优

  • 优化内核网络参数

    • timewait_reuse
    • 增大filemax
    • 减小keepalive
    • 主动断连时间缩小
    • ……
  • 提升CPU使用效率

    • 合适的worker进程数

      • worker进程数=CPU核数
    • CPU亲和

      • 每个worker绑定一个CPU核,提升缓存命中率
    • 减少CPU开销

  • 提高网络效率

    • 连接复用

      • 减少upstream
    • 使用cache

      • 超时时间对业务的影响
    • gzip压缩

      • 会增加cpu开销,需平衡使用
    • 开启proxy_buffering

      • 谨慎设置proxy_buffer大小,促进磁盘IO读写

2.6.10 使用7层负载均衡

使用7层负载均衡

03.动手实践

3.1 DNS服务器搭建

3.2 四层负载均衡使用含

  • LVS+keepalived
  • Nginx stram

3.3 7层负载均衡实验