聊聊 HTTP 性能优化

哈喽大家好,我是咸鱼。

作为用户的我们在 “上网冲浪” 的时候总是希望快一点,尤其是抢演唱会门票的时候,但是现实并非如此,有时候我们会遇到页面加载缓慢、响应延迟的情况。

而 HTTP 协议作为互联网世界的基础,从网站打开速度到移动应用的响应时间,HTTP 性能的优化直接关系到我们在网络世界的舒适体验程度。

更快的响应时间和速度能够提供更好的用户体验,不但如此,还可以降低服务器和网络带宽的使用,从而节省相关的成本

那么今天我们就来聊聊 HTTP 性能如何进行优化

数据压缩

随着互联网的发展,网路上传输的数据越来越大,随随便便一个文件几个 G 甚至上百 G,就算你是百兆、千兆带宽也扛不住。

如何能够在有限的带宽里传输更多的数据,常见的解决方式是数据压缩

如果压缩率能有 50%,例如 100K 的数据能够压缩成 50K 的大小,那么就相当于在带宽不变的情况下网速提升了一倍,加速的效果是非常明显的。

使用常见的压缩算法(如 gzip 和 br )对数据进行压缩,不但如此,我们可以对 HTTP 中传输的各种数据进行针对性地压缩,做到【对症下药】。

  • HTML/CSS/JS

对于这类纯文本格式数据,我们在进行压缩时通常会去除其中多余的空格、换行和注释等元素。尽管压缩后的文本可能看起来比较混乱,对人类可读性较差,但这对计算机并不影响流畅阅读。

  • JPG/JPEG/PNG

对于这类图片格式数据,虽然它本身已经被压缩过了,不能被 gzip、br 处理,但仍然有优化的空间。

例如,可以考虑去除图片中的拍摄时间、地点、机型等元数据,适度降低分辨率和缩小尺寸。

此外,尽量采用高压缩率的格式,有损格式可以选择 JPEG,而无损格式则可以考虑使用 webp 格式。

  • 小数据

对于较小的数据,HTTP 中有一种被称为 “资源合并”(Concatenation)的优化方式,即将多个小资源合并成一个大资源,通过单个请求下载到客户端,随后由客户端使用 JavaScript、CSS 等进行拆分使用。

这种方式虽然减少了请求的次数,但是处理起来比较麻烦。

需要注意的是,在数据压缩的时候应当注意选择适当的压缩率,不要追求最高压缩比,否则会耗费服务器的计算资源,增加响应时间,反而会“得不偿失”。

上面讲的都是针对 HTTP 报文里的 body 的压缩方式,对于 header 的压缩在 HTTP/1 里是没有的(HTTP/2 才有)。

不过我们可以采取一些手段来减少 header 的大小,不必要的字段就尽量不发(例如 User-Agent、Server、X-Powered-By)

使用缓存

数据 “千里迢迢” 从服务端到客户端,我们可以把这些 “来之不易” 的数据【暂时保存】起来,以便在下次请求时直接复用,从而避免多次请求带来的高昂成本。

比如说网站上访问量最高的网页、热点新闻,尤其是【读多写少】的数据,把它们缓存下来能够把巨大的流量挡在外面,减轻服务器的压力,对性能的改善是非常显著的。

HTTP 传输的每一个环节基本上都会有缓存,不过大致可以分成:

  • 浏览器端缓存

  • 服务端缓存

  • 中间传输缓存

在浏览器端,通过与服务端协商相关的缓存策略,将一些资源缓存到本地,以便在下次访问时进行复用。

常见的缓存策略包括 HTTP 头中的 Cache-ControlExpires 以及 ETag 等,通过这些标识,浏览器可以判断是否需要从服务端重新获取资源,或者直接使用本地缓存。

在服务端,可以借助专门的缓存中间件,如 Memcache 或 Redis,将计算得到的中间结果和资源存储在内存或硬盘中。

这样,Web 服务器在处理请求时会首先检查缓存,如果找到相应的数据,就能够立即返回给客户端,避免了访问后端服务或数据库的时间开销。

而关于中间传输的缓存,常见的有 HTTP 代理缓存和 CDN(Content Delivery Network,内容分发网络)。

HTTP 代理缓存,通过使用增加了缓存功能的 HTTP 代理服务器(例如 Nginx),缓存源服务器的数据,分发给下游的客户端。

而使用 CDN 把源服务器的内容逐级缓存到网络中的每一个 CDN 节点中,这样用户在上网的时候就不直接访问源站,而是访问离它最近的一个 CDN 节点(其实就是缓存了源服务器内容的代理服务器)

使用高性能 web 服务器

除了传输过程中对数据进行压缩和使用缓存,我们还可以在服务端下手。

首先我们应该选择高性能的 Web 服务器,最常见的应该就是 Nginx 了。

作为一款【高性能,轻量级】的 Web 服务器,【进程池+单线程】的工作模式让 Nginx 消耗较少的 CPU 和内存,非常轻量,而【I/O 多路复用】又使得 Nginx 的工作效率大大提升。

我们还可以通过 Nginx 实现【动静分离】:把动态页面和静态页面交给不同的服务器来解析,来加快解析速度,提高请求的访问效率,降低原来单个服务器的压力。

# Nginx 动静分离配置
server {listen 80 ; location ~* \.(png)$ {root /var/images/png/;}location ~* \.(php)$ {proxy_pass http://php_back_end;}
}

不但如此,在配置 Nginx 的时候还应该开启 HTTP 长连接

这样做可以平均握手成本到多次请求中,避免了每个请求都要进行 TCP 连接建立和断开的开销,从而提高了性能。连接的复用使得后续的请求不再需要进行完整的三次握手过程,减少了连接建立的延迟。

升级 HTTP/2

除了上面的【数据压缩】、【使用缓存】、【使用高性能 web 服务器】,HTTP 性能优化还有一个选择,那就是【把协议由 HTTP/1 升级到 HTTP/2】

HTTP/2 基于 Google 的 SPDY 协议,完全兼容 HTTP/1,我们来看看它的一些优点。

  • 头部压缩

报文 Header 一般会携带 “User Agent”、“Cookie”、“Accept”、“Server” 等许多固定的头字段,多达几百字节甚至上千字节,但 Body 却经常只有几十字节(比如 GET 请求)

更要命的是,成千上万的请求响应报文里有很多字段值都是重复的,非常浪费,导致大量带宽消耗在了这些冗余度极高的数据上。

为了压缩头部,HTTP/2 开发了专门的 “HPACK” 算法:在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,还釆用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的高压缩率。

  • 二进制格式

相较于 HTTP/1 里纯文本形式的报文,HTTP/2 全面采用二进制格式,既方便计算机解析,而且体积小、速度快,使性能大大提高。

除此之外,HTTP/2 使用虚拟的流(stream)传输消息,解决了“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率;

今天这篇文章讲了 HTTP 性能优化的一些方法,希望能对你有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

穷人想赚钱该怎么选打工VS创业?2024年如何把握新机遇?

在贫穷的困境中,打工与创业似乎成为了两条截然不同的道路,摆在每一个渴望改变命运的人面前。然而,这并非简单的选择题,而是一场关于勇气、智慧与机遇的较量。打工,对于许多人来说,是稳定且相对安全的收入来…

【TypeScript系列】类

类 背景阅读:类(MDN) TypeScript 对 ES2015 引入的 class 关键字提供了全面支持。 与其他 JavaScript 语言特性一样,TypeScript 添加了类型注解和其他语法,使你能够表达类和其他类型之间的关系。 类成员 下面是一个…

Aigtek前置微小信号放大器有什么作用

前置微小信号放大器是一种被广泛应用于无线通信、雷达、射频等领域中的低噪声放大器。相较于传统的放大器,前置微小信号放大器具有更高的灵敏度和更低的噪声系数。下面安泰Aigtek将介绍前置微小信号放大器的作用和意义。 一、前置微小信号放大器的作用 放大弱信号 前…

【golang】二叉树的遍历

本文使用golang实现二叉树的遍历,包含以下7种方法。 深度优先遍历 先序遍历 递归法非递归法 中序遍历 递归法非递归法 后序遍历 递归法非递归法 广度优先遍历 二叉树节点定义: type Node struct {Val intLeft *NodeRight *Node }深度优先遍历 先…

C语言实现回调函数

C语言实现回调函数 一、回调函数概念1.1 什么叫函数指针 二、回调函数案例 一、回调函数概念 回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数…

IDEA启动项目读取nacos乱码导致启动失败

新安装的2023社区版IDEA,启动项目报错。 forest: interceptors: - com.gdsz.b2b.frontend.api.Interceptors.ApiInterceptor org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1 at org.yaml.snakeyaml.reader.S…

Java面试题总结10之MySQL索引和锁

索引的基本原理 把无需的数据变成有序的查询 1,把创建了索引的列的内容进行排序 2,对排序结果生成倒排表 3,到倒排表内容上拼上数据地址链 4,在查询的时候,先拿到倒排表内容,再取出数据地址链&#xf…

error: cannot bind non-const lvalue reference of type 解决方法

error: cannot bind non-const lvalue reference of type 解决方法 问题来源解决方法 问题来源 使用direct_visual_lidar_calibration时需要安装Iridescence 编译时出现如下错误 /home/flipper/iridescence/src/glk/glsl_shader.cpp:289:36: error: cannot bind non-const lv…

7-3 前世档案(Python)

网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。 现在我们把结论从左到右顺序…

基于Leatlet标注Geojson下载器实现

在上一篇文章中,我们学习了Leaflet的基础知识,包括如何创建地图、添加图层等。在本文中,我们将深入学习Leaflet中标注的创建和管理,包括如何添加标注、自定义标注图标、创建图层组、批量添加和删除标注、为标注添加属性和弹出框等…

手机卡丢失了怎么办?挂失与补办全攻略来了

现在人人都离不开手机,手机改变了我们的生活,但是有时我们可能会遇到手机卡丢失或被盗的情况。这时,及时挂失并补办新的手机卡至关重要,以确保个人信息安全和通信畅通。这里小编将为您提供详细的手机卡挂失与补办流程指南&#xf…

day38 动态规划part1

509. 斐波那契数 简单 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),…

VS配置开发与远程调试笔记

先简单写一下,后续详细补充 场景:本地机器开发,虚拟机调试 准备工作: 由于要将生成的文件生成在虚拟机,避免反复拷贝,直接配置虚拟机共享文件夹进行写入,步骤如下: 虚拟机打开网…

Vue3:ref和reactive实现响应式数据

一、情景说明 在Vue2中,我们已经知道数据的响应式,是什么含义 就是,在data块中,定义的变量,在页面中引用后 任何地方修改了该变量,页面中引用的变量会立即显示最新数值。 这块,我们学习了 插值…

Leetcode : 1122. 数组的相对排序

思路&#xff1a;计数排序&#xff0c;然后根据计数的数组序列重构数组&#xff0c;针对多余的数组元素采取sort函数进行升序排列加在末尾即可。 #include <iostream> #include <vector> #include <algorithm>using namespace std;class Solution { public:v…

ChatGPT消息发不出去了?我找到解决方案了

现象 今天忽然发现 ChatGPT无法发送消息&#xff0c;能查看历史对话&#xff0c;但是无法发送消息。 猜测原因 出现这个问题的各位&#xff0c;应该都是点击登录后顶部弹窗邀请[加入多语言 alapha 测试]了&#xff0c;并且语言选择了中文&#xff0c;抓包看到ab.chatgpt.com…

win11修改主机mac地址

很多时候&#xff0c;为了限制恶意的蹭流浪&#xff0c;除了分配固定的ip地址外&#xff0c;还限制mac地址。只有mac与ip一致&#xff0c;才能上网冲浪 网络适配器中修改 搜索“控制面板”打开 控制面板 > 网络和Internet > 网络和共享中心 >查看网络状态和任务>…

【操作系统学习笔记】文件管理1.9

【操作系统学习笔记】文件管理1.9 参考书籍: 王道考研 视频地址: Bilibili 文件保护 口令保护 为文件设置一个口令&#xff0c;用户请问访问该文件时必须提供口令交由系统验证 优点 保存口令的空间开销小验证口令的时间开销小 缺点 正确的口令存放在系统内部&#xff0c;不…

kafka 可视化工具

kafka可视化工具 随着科技发展&#xff0c;中间件也百花齐放。平时我们用的redis&#xff0c;我就会通过redisInsight-v2 来查询数据&#xff0c;mysql就会使用goland-ide插件来查询&#xff0c;都挺方便。但是kafka可视化工具就找了半天&#xff0c;最后还是觉得redpandadata…

【框架】React和Vue的异同

1. 前言 React对于原生JS要求会高一级&#xff0c;国外React用的多&#xff0c;国内Vue用的多。 2. 共同点 组件化函数式编程 &#xff08;vue3函数式编程、vue2声明式编程&#xff09;单向数据流&#xff0c;数据驱动视图VirtualDOM Diff算法操作DOM社区成熟&#xff0c;…