字节跳动青训营系列文章
如何将我的服务开放给用户
这是我参与「第三届青训营 -后端场」笔记创作活动的的第8篇笔记。计算机网络真的是太庞大了
同时这也是课表的第8天课程《如何将我的服务开放给用户》
PC端阅读效果更佳,点击文末:阅读原文即可。
经典问题:浏览器输入网站域名www.toutiao.com到网页加载出来,都经历了哪些过程?
①域名解析
②TCP建连
③SSL握手
...
可以通过浏览器抓包区解析根源或者本质 :www.toutiao.com
A life of a request
随着example公司业务规模和员工数量的增长,使用该方式面临诸多问题:
使用域名系统替换hosts文件
关于域名空间:
顶级域gTLD: general Top-level Domains: gov政府 .edu教育.com商业.mil军事.org非盈利组织
城名报文格式
首先是域名购买
购买二级域名: example.com
域名备案:防止在网上从事非法的网站经营活动,打击不良互联网信息的传播,一般在云厂商处即可进行实名认证并备案 修改配置:清空/etc/hosts 配置/etc/resolv.conf中nameservers为公共DNS 迁移原配置,通过控制台添加解析记录即可
“如何建设外部网站,提升公司外部影响力?
方案:租赁一个外网ip,专用于外部用户访问户网站,将www.example.com解析到外网ip 100.1.2.3,将该ip绑定到一台物理机上,并发布公网route,用于外部用户访问。
内网域名的解析也得出公网去获取,效率低下
外部用户看到内网ip地址,容易被hacker攻击
云厂商权威DNS容易出故障,影响用户体验
持续扩大公司品牌技术影响力,使用自己的DNS系统
dig {$domain} +trace
dig 命令主要用来从 DNS 域名服务器查询主机地址信息,可以用来测试域名系统工作是否正常。
参数:
主机:指定要查询域名主机;查询类型:指定DNS查询的类型;查询类:指定查询DNS的class;查询选项:指定查询选项。
@<服务器地址>:指定进行域名解析的域名服务器;
-b<ip地址>:当主机具有多个IP地址,指定使用本机的哪个IP地址向域名服务器发送域名查询请求;
-f<文件名称>:指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息;
-P:指定域名服务器所使用端口号;
-t<类型>:指定要查询的DNS数据类型;
-x<IP地址>:执行逆向域名查询;
-4:使用IPv4;
-6:使用IPv6;
-h:显示指令帮助信息。
dig @8.8.8.8 www.baidu.com #指定DNS服务器解析,比如
[root@jenkins ~]# dig @223.5.5.5 www.baidu.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @223.5.5.5 www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18719
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 15 IN CNAME www.a.shifen.com.
www.a.shifen.com. 15 IN A 220.181.38.150
www.a.shifen.com. 15 IN A 220.181.38.149
;; Query time: 6 msec
;; SERVER: 223.5.5.5#53(223.5.5.5)
;; WHEN: Tue Oct 22 02:20:06 EDT 2019
;; MSG SIZE rcvd: 90
dig www.baidu.com +short #简洁查询
dig +nocmd +noall +answer +ttlid www.baidu.com #更简洁查询
dig +trac www.baidu.com #DNS请求的递归查询过程
dig +trace -t A @8.8.8.8 taobao.com #指定A记录解析
dig www.baidu.com CNAME #查询域名的CNAME
dig -x 8.8.8.8 #反查询,通过IP查询域名
dig -x 8.8.8.8 +short
类型 目的 A 地址记录,用来指定域名的 IPv4 地址,如果需要将域名指向一个 IP 地址,就需要添加 A 记录。
AAAA 用来指定主机名(或域名)对应的 IPv6 地址记录。
CNAME 如果需要将域名指向另一个域名,再由另一个域名提供 ip 地址,就需要添加 CNAME 记录。
MX 如果需要设置邮箱,让邮箱能够收到邮件,需要添加 MX 记录。
NS 域名服务器记录,如果需要把子域名交给其他 DNS 服务器解析,就需要添加 NS 记录。
SOA SOA 这种记录是所有区域性文件中的强制性记录。它必须是一个文件中的第一个记录。
TXT 可以写任何东西,长度限制为 255。绝大多数的 TXT记录是用来做 SPF 记录(反垃圾邮件)。
A/AAAA: IP指向记录,用于指向IP,前者为IPv4记录,后者为IPv6记录
CNAME:别名记录,配置值为别名或主机名,客户端根据别名继续解析以提取IP地址
TXT:文本记录,购买证书时需要
MX:邮件交换记录,用于指向邮件交换服务器
NS:解析服务器记录,用于指定哪台服务器对于该域名解析
SOA记录:起始授权机构记录,每个zone有 且仅有唯一-的一 条SOA记录,SOA是描述zone属性以及主要权威服务器的记录
思考:站在企业角度思考,我们需要的是哪种DNS服务器?
答案:权威DNS,LocalDNS(可选) 常见的开源DNS: bind、 nsd、 knot、coredns
DNS Query DNS Response DNS Update DNS Notify DNS XFR
经过研发人员的不断努力,example 公司有了自己的权威DNS系统。
常见的加密算法 对称加密:一份秘钥
非对称加密:公钥和私钥
公钥确定是可信的吗?会不会被劫持?
Server端发送是带签名的证书链(下图)
Client收到会仍然需要验证:
外网用户访问站点,一定是一帆风顺的吗?可能出现的问题有哪些?
源站容量低,可承载的并发请求数低,容易被打垮 报文经过的网络设备越多,出问题的概率越大,丢包、劫持、mtu问题 自主选路网络链路长,时延高
响应慢、卡顿如果请求一个网页响应超过3秒,80%的用户就会找其他产品进行替代。就算做的再好也没用 极大的流失了大部分的用户群体,NPS留存率数据不乐观。
源站容量问题:增加后端机器扩容;静态内容,使用静态加速缓存 网络传输问题:动态加速DCDN 全站加速:静态加速+动态加速
针对静态文件传输,网络优化方式?
加缓存(CDN)
解决服务器端的“第一公里”问题
缓解甚至消除了不同运营商之间互联的瓶颈造成的影响
减轻了各省的出口带宽压力
优化了网上热点内容的分布
针对POST等非静态请求等不能在用户边缘缓存的业务,基于智能选路技术,从众多回源线路中择优选择一条线路进行传输 。
RTT示例:
常规请求耗时计算: Via DCDN: 100ms
20(TCP)+20*2(TLS)+20+ 10+ 10(routine)
Direct: 140ms
35(TCP)+35*2(TLS)+35(routine)
请区分下列场景使用的加速类型
“提问:在运营商处租用的100.1.2.3的公网IP,如何在企业内部使用最合理?
现状:直接找一个物理机,ifconfig将网卡配上这个IP,起server监听即可
应用多,起多个server监听不同的端口即可 租多个公网ip (数量有限)
“怎样尽可能充分的利用和管理有限的公网IP资源?
基于IP+端口,利用某种算法将报文转发给某个后端服务器,实现负载均衡地落到后端服务器上。
“提问:RS怎么知道真实的CIP? 回答:通过TCP option字段传递然后通过特殊的内核模块反解
大部分都是通过dpdk技术实现,技术成熟,大厂都在用 纯用户态协议栈,kernel bypass,消除协议栈瓶颈 无缓存,零拷贝,大页内存(减少cache miss) 仅针对4层数据包转发,小包转发可达到限速,可承受高cps
“提问:四层负载对100.1.2.3只能bind一个80端口,而有多个外部站点需要使用,该如何解决?
“换个问法:有一些7层相关的配置需求,该怎么做?
SSL卸载:业务侧是http服务,用户需要用https访问
请求重定向:浏览器访问toutiao.com自动跳转www.toutiao.com
路由添加匹配策略:完全、前缀、正则 Header编辑 跨域支持 协议支持: websocket、 grpc、 quic
最灵活的高性能WEB SERVER,应用最广的7层反向代理。
代理服务器功能
传统服务器:一个进程/线程处理一个连接/请求。阻塞模型、依赖OS实现并发 Nginx: 个进程/线程处理多个连接/请求。异步非阻塞模型、减少OS进程切换
优化内核网络参数
fs.filemax= 999999 net.ipv4.tcp_ tw_ reuse = 1 net.ipv4.tcp_ keepalive_ time = 600 net.ipv4.tcp fin_ timeout = 30 net.ipv4.tcp_ max_tw_ buckets = 5000 net.ipv4.ip_ local_port_ range = 1024 61000 net.ipv4.tcp_ max_ syn.backlog= 1024 net.ipv4.tcp_ syncookies = 1
开源的解决方案: LVS+keepalived LVS: linux virtual server, linux虚拟服务器, 根据目标地址和目标端口实现用户请求转发,本身不产生流量,只 做用户请求转发,详见http://www.linuxvirtualserver.org/
“提问:服务开发前期,如何低成本的让别人访问自己的服务?
回答: Ngrok, Expose your localhost to the web 使用条件:使用github账户授权登录,即可使用,详见https://dashboard.ngrok.com/get-started/setup
命令: ./ngrok http example.com:8082
再看接入架构
范本: https://strikefreedom.top/ 搭建一个专属的个人网站:奇闻轶事、个人杜撰、美食、宠物、技术博客。