LeeYzero的博客

业精于勤,行成于思

0%

之前搭建了一个 codeserver 的开发环境,但还遗留了配置HTTPS访问域名的问题。本周正好有空搞下,本来打算花钱买一个HTTPS证书,发现 Let’s Encrypt 提供了免费的HTTPS证书,而且还提供了配套的工具让网站开启HTTPS变得非常简单,本文记录下安装步骤。

在介绍安装步骤之前先简单介绍一下 HTTPS 的工作原理,不感兴趣的同学可以直接跳过。

简单来说,HTTPS 就是安全的HTTP(S表示Secure的意思),我们知道HTTP报文是采用明文传输的,报文容易被窃听或篡改。HTTPS 是在传输层和应用层中加一个安全层(SSL),负责对报文进行加密和解密。

传统的对称加密(加密解密使用相同密钥)要在传输两端共享密钥,涉及到密钥安全问题。而非对称加密(公钥加密,私钥解密)可以完美解决密钥交换问题。非对称加密的公钥是公开的,任何人都可以使用这个公钥进行加密。

但别人又怎么相信这个公钥是你发布的呢,这又是一个信任问题,解决办法是引入一个可信息的第三方机构。通常的做法是将这个公钥放到一个证书(Certificate)中,然后由这个可信任的第三方机构来统一认证和颁发。这个可信任的第三方机构就是证书颁发机构(CA,Certificate Authority)。

拿到证书后,怎么验证这个证书是不是第三方机构颁发的呢?(哈哈,是不是感觉问题好多呀),答案是使用数字签名技术,简单来说就是为证书的内容做一个签名,并附到证书的末尾,这个签名具有惟一性和不可伪造性。

客户端(通常是浏览器)收到证书时会对证书合法性进行检查。如果这个机构是可信任的权威机构颁发的,浏览器可能已经知道其公开密钥了(浏览器会预先安装很多签名颁发机构的证书),这样,就可以通过数字签名来验证证书的完整性了。

所以,客户端和服务端进行HTTPS通信时,除了进行正常的TCP三次握手外,还需要进行SSL握手,这个过程主要是从服务端拿到证书、验证证书的合法性,然后交换加密密钥。后续的通信就可以使用这个加密密钥对报文加密和解密了。

突然发现写多了(化繁为简能力还有提高),以上就是HTTPS的大致原理,当然HTTPS的细节交互更加复杂,以上概述只是让大家对HTTPS有个宏观上的认识。有了这个背景,我们就知道启用HTTPS主要需要以下两个步骤:

  • 从CA机构获取一个受信任的HTTPS证书。
  • 将证书部署到服务端。

Let’s Encrypt 就是一个可信息的证书颁发机构,它颁发的免费数字证书浏览器是信任的,而且它还提供便捷的安装和续约工具,下面就进入安装环节吧。

Read more »

写在前面

跳跃表是一种可以替代平衡树的数据结构。跳跃表采用概率上的平衡而不是强制要求节点的平衡,使得其在插入和删除时更容易实现,而且具有更好的效率。由于跳跃表具有良好的性能和算法实现的简单性,被广泛应用于工程实践中,如redisleveldb等。

本文是对William Pugh的论文Skip Lists: A Probabilistic Alternative to Balanced Trees的解读,主要介绍算法核心思想和算法实现,对于算法的时间和空间复杂度分析并不是本文的重点,这部分内容在论文中有详细介绍。

Read more »

写在前面

MySQL是一款开源的关系型数据库,广泛应用于Web后端的数据存储。索引是MySQL非常重要技术组成部分,深入理解MySQL的索引原理,有助于我们建立高性能的索引以及对索引进行调优。

MySQL支持多种索引类型,如B-Tree索引、哈希索引、全文索引等。索引是在存储引擎中实现的,在实际环境中,应用比较多的是InnoDB存储引擎和MyISAM存储引擎,这两个存储引擎底层都是使用的B-Tree索引。所以,为了不引起歧义,本文讨论的MySQL索引,没有特殊说明,都是指的B-Tree索引。

Read more »

背景

最近由于组织架构调整,团队引入不少新成员。这些成员来自不同的团队和背景,每个人的日志打印风格难免也有所差异,十分有必要制定一个统一的日志打印规范。

规范日志打印主要有以下作用:

  • 让系统运行状态更透明,提高线上故障排查效率。
  • 减少代码风格差异,利于代码阅读和维护。
  • 统一日志格式,利于外围工具(日志监控报警工具等)处理。

团队成员在研发过程中应该遵守该规范,文档内容可能会与你的喜好冲突,请尽量用包容的心态接受。如果有不合理之处,请先在组内提出建议,组内一致表决通过后修改规范。

Read more »

最近换了一台mac,配置了一下终端(terminal)环境,在此记录一下,以便后续查阅,同时给分享给网友作为参考。本文不会细无具细,只会列举出主要步骤和相关配置参考资料。主要包括以下四个部分:

终端效果:

Read more »

最近读了《如何阅读一本书》,很遗憾自己没有早点读到这本书,同时也庆幸自己现在读到这本书。阅读的目标有两种,一种是为了获取资讯,另一种是为了增进理解。《如何阅读一本书》便是一本教你如何通常阅读以增进理解的实用书籍。

打开你的手机,看看你一周的花在各大手机APP上的时间。抖音、快手、知乎、B站、微信公众号…,这些time killer是不是占用了大量的时间?看起来你每天(被)输入了大量信息,但这些信息是否真能增进我们对自己世界的了解呢。很遗憾,并没有。发生这一现象的原因主要有两点:

  • 这些媒体经过精心的设计,对资讯进行精美的包装,让受众根本用不着自己做结论。他们直接将包装后的观点装进自己的脑海中,缺乏对事物的思考。
  • 这些媒体提供的绝大部分是资讯类信息,而且比较零碎,缺乏逻辑性。太多的资讯如同太少的资讯一样,都是对理解力的阻碍。现代媒体正以压倒性的泛滥资讯阻碍了我们的理解力。

诚然,互联网上的确有很多非常不错的知识。但书籍(也包括电子书)仍然是获取知识最重要的信息来源。如何通过阅读以增进理解力本身是一种艺术,《如何阅读一本书》提供了很多值得参考的规则,值得花时间投入学习。但诚如作者所说,对于一本实用性的书,当你读完并赞同作为的观点后,作者的任务就完成了,但作为读者,你的任务才刚刚开始。作者在书中所建议的方法对你是不是有效,需要你在实践中寻找答案。

Read more »

从个人经历过的多个团队中,发现有一个共性是:极少有团队注重单元测试。甚至当我想在团队中倡导单元测试时,有个研发经理跟我表达单元测试没有任何意义的结论。我不知道这是个人的不幸呢,还是整个中国互联网公司的现状如此?

本文算是给单元测试”正名”,介绍单元测试的意义以及编写可测试代码的一些原则和思考。

什么是单元测试

单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能够快速运行。单元测试可靠、可读、并且可维护。只要产品代码不发生变化,单元测试的结果是稳定的。

——The Art of Unit Testing

工作单元是指从调用系统的一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为总称为一个工作单元。一个单元可以小到只包含一个方法,也可以大到包括实现某个功能的多个类和函数。

Read more »

Code Server是一个基于VSCode实现的开源的云端IDE,只要能联网,就可以通过浏览器进行访问,无需安装,十分方便。本文主要介绍如何在CentOS 8中安装Code Server。

依赖环境

  • 2GB RAM
  • 需要root权限,对于非root账号,需要sudo权限
  • 需要安装nginx
Read more »