这是我参与「第三届青训营 -后端场」笔记创作活动的的第9篇笔记
- 输入网站域名到网页加载出来,都经历了哪些过程
- 域名解析
- TCP建连
- SSL握手
- 企业接入
- 域名系统
- Host管理
- 主机表 Host->IP映射
- 效率很低
- 使用域名系统替换Hosts文件
- 域名购买
- 域名备案:防止在网上从事非法的网站经营活动,打击不良互联网信息的传播,一般在云厂商处即可进行实名认证并备案。
- 修改配置
- 清空
/etc/hosts - 配置
/etc/resolv.conf中nameservers为公共DNS迁移原配置,通过控制台添加解析记录
- 清空
- 开放外部用户访问
- 租赁一个外网IP,专用于外部用户访问门户网站,将
www.example.com解析到外网IP上,将该IP绑定到一台物理机上,并发布公网route,用户外部用户访问
- 租赁一个外网IP,专用于外部用户访问门户网站,将
- 自建DNS服务器
- 外部云厂商处DNS解析的缺点
- 内网域名的解析也得出公网去获取,效率低下
- 外部用户看到内网ip地址,容易被hacker攻击
- 云厂商权威DNS容易出故障,影响用户体验
- 持续扩大公司品牌技术影响力,使用自己的DNS系统
- DNS查询过程
- 权威DNS系统架构
- 常见的开源DNS:
bind、nsd、knot、coredns - DNS Query
- DNS Response
- DNS Update
- DNS Notify
- DNS XFR
- 常见的开源DNS:
- 外部云厂商处DNS解析的缺点
- Host管理
- 接入HTTPS协议
- 对称加密和非对称加密
- 对称加密
- 双方持有相同的密钥
- 密钥可能被截获
- 非对称加密
- 使用公钥和私钥
RSA算法
- 对称加密
- SSL的通信过程
client randomserver randompremaster secret- 加密算法协商
- 计算出
session key用来加密
- 对称加密和非对称加密
- 接入全站加速
- 问题
- 源站容量低,可承载的并发请求数低,容易被打垮
- 报文经过的网络设备越多,出问题的概率越大,丢包、劫持、MTU问题
- 自主选路网络链路长,时延高
- 解决方案
- 源站容量问题
- 增加后端机器扩容;静态内容,使用静态加速缓存
- 网络传输问题
- 动态加速DCDN
- 全站加速
- 静态加速+动态加速
- 源站容量问题
- 静态加速CDN
- 缓存:将服务器上的静态内容缓存到CDN结点上,客户端无需访问源站,通过访问CDN节点访问静态内容,速度加快并且减轻源站压力
- 优点
- 解决服务器端的"第一公里"问题
- 缓解甚至消除了不同运营商之间互联的瓶颈造成的影响
- 减轻了各省的出口带宽压力
- 优化网上热点内容的分布
- 动态加速DCDN
- 针对POST等非静态请求等不能在用户边缘缓存的业务,基于智能选路技术,从众多回源线路中择优选择一条线路进行传输。
- 问题
- 4层负载均衡
- 基于IP+端口,利用某种算法将报文转发到某个后端服务器,实现负载均衡地落到后端服务器上
- 功能
- 解耦vip和rs
- NAT
- 防攻击: syn proxy
- 常见的调度算法原理
- RR轮询:Round Robin,将所有请求平均分配给每个真实服务器RS
- 加权RR轮询:给每个后端服务器一个权值比例,将请求按照比例分配
- 最小连接:把新的连接请求分配到当前连接数最小的服务器
- 五元组Hash:根据sip、sport、proto、dip、dport对静态分配的服务器做散列取模
- 缺点:当后端某个服务器故障后,所有连接都重新计算,影响整个hash环
- 一致性Hash:只影响故障服务器上的连接session,其余服务器上连接不受影响
- 实现方式FULLNAT
- RS如何知道真实的CIP
- 通过TCP Option字段传递然后通过特殊的内核模块反解
- RS如何知道真实的CIP
- 使用特点
- 大部分是通过dpdk技术实现,技术成熟
- 纯用户态协议栈,kernel bypass,消除协议栈瓶颈
- 无缓存,零拷贝,大页内存(减少cache miss)
- 仅针对4层数据包转发,小包转发可达到限速,可承受高cps
- 开源解决方案:LVS+keepalived
- LVS:linux虚拟服务器,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发
- Keepalived:LVS集群高可用,解决某个节点故障问题
- 7层负载均衡
- 问题
- SSL卸载:业务侧是http服务,用户需要用https访问
- 请求重定向:浏览器访问toutiao.com自动跳转www.toutiao,com
- 路由添加匹配策略:完全、前缀、正则
- Header编辑
- 跨域支持
- 协议支持:websocket、grpc、quic
- Nginx
- 最灵活的高性能Web Server,应用最广的7层反向代理
- 简介
- 模块化涉及,较好的扩展性和可靠性
- 基于master/worker架构设计
- 支持热部署;可在线升级
- 不停机更新配置文件、更换日志文件、更新服务器二进制
- 较低的内存消耗:1万个keep-alive连接模式下的非活动连接仅消耗2.5M内存
- 事件驱动模型:异步非阻塞模型、支持aio,mmap(内存映射)
- 功能
- Keepalive
- 访问日志
- url rewrite重写
- 路径别名
- 基于ip的用户访问控制
- 限速及并发连接数控制
- 异步非阻塞
- 传统服务器
- 一个进程/线程处理一个连接/请求阻塞模型、依赖os实现并发
- Nginx
- 一个进程/线程处理多个连接/请求异步非阻塞模型、减少os进程切换
- 传统服务器
- Nginx简单调优
- OS容量
- 缓冲队列
- 文件句柄数
- 源端口数
- CPU效率
- 合适worker数
- worker进程数=CPU核数
- CPU亲和
- 每个worker程绑定一个CPU核,提升缓存命中率
- 提升worker进程优先级
- 减少cpu开销
- multi-accept允许worker同时接受新连接
- accept-mutex解决惊群问题
- reuseport监听同端口,内核负载均衡
- 合适worker数
- 网络效率
- 连接复用
- 减少upstream建联
- 使用Cache
- 减少超时时间对业务的影响
- gzip压缩
- 会增加cpu开销,需平衡使用
- 开启proxy_buffering
- 谨慎设置proxy_buffer大小,磁盘io读取
- 连接复用
- 磁盘IO效率
- SSD
- 优化log存储
- Sendfile
- AIO
- ThreadPool
- 定位性能瓶颈
- Google Performance Tool
- OS容量
- 问题
- 如何将本地服务开放外网访问
- Ngrok,Expose your localhost to the web
- 使用条件:使用github账户授权登录
- 域名系统