体系化带你全面认识 Nginx

前言

作为一名开发人员,你是不是经常碰到领导让你上服务器去修改 Nginx 配置,然而你会以“我是开发,这个我不会”为理由搪塞过去呢!今天就让我们一起告别这种尴尬,向“真正”的程序员迈进!!!

Nginx 概述

nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, nginx 是免费的并可以商业化,配置使用也比较简单。

Nginx 特点

查看更多

苹果M1芯片Macbook安装win10

前言

苹果2020年底发布了“最不讲武德”的M1芯片Macbook、mac mini,惊艳了无数玩家。M1芯片采用ARM架构,5纳米工艺的M1芯片偷袭了Intel的14纳米工艺的cpu,这靠的是台积电5纳米代工,还是Intel长期14纳米的坚持?本文介绍在ARM架构的M1芯片Macbook上面安装win10玩steam、epic games的步骤,来看看在苹果M1芯片上玩steam是什么体验。

1. 安装Parallels Desktop软件

用M1 Macbook的Safari浏览器点击链接进入Parallels官网下载Parallels Desktop软件的登陆界面:

[苹果M1芯片Macbook安装win10玩steam游戏步骤

查看更多

一个惊人快速的终端录像工具,也能录制 VSCode 和 Chrome 窗口

【导语】:t-rec 是一款惊人的快速终端记录器,可以生成 gif 图像。

简介

t-rec 是使用 Rust 实现的一款快速终端记录器,结果可生成动图或视频,有以下特点:

  • 以每秒 4 帧的速度录制终端
  • 生成高质量的小尺寸动画 gif 图像或 mp4 视频
  • 内置空闲帧检测和优化 (用于超级流体演示)
  • 应用 (可以禁用) 边框装饰效果,如投影
  • 在 MacOS 和 Linux 上运行
  • 使用本地高效的 api
  • 在没有任何云服务的情况下运行,完全脱机
  • 支持终端尺寸大于 80x24
  • 字体和颜色均可正常显示
  • 支持基于 curses 的程序
  • 支持转义序列
  • 没有记录和重放 - 只是一个简单的命令来管理
  • 隐藏功能: 记录任意窗口

项目地址

github

下载安装

t-rec 仅支持在 MacOS 和 Linux 安装使用,方法如下:

查看更多

我用 Python 的 Seaborn 库,绘制了 17 个超好看图表!

Seaborn简介

定义

Seaborn是一个基于matplotlib且数据结构与pandas统一的统计图制作库。Seaborn框架旨在以数据可视化为中心来挖掘与理解数据。

优点

  1. 代码较少

  2. 图形美观

  3. 功能齐全

  4. 主流模块安装

pip命令安装

`pip install matplotlib  
pip install seaborn`

从github安装

`pip install git+https://github.com/mwaskom/seaborn.git`

流程

导入绘图模块

查看更多

工作两三年了,整不明白架构图都画啥?

1. 前言

很多程序员画架构图头疼,不知道画什么、怎么画!

分享评审述职答辩,只要你在程序员这个行业,就几乎离不开要画图。

一提到画图很多人就想站会起来喊,”内卷“、”内卷啦“、”PPT工程师“,但程序代码本身就是一种数学逻辑的具体实现,如果没有一些图表配合文字的阐述,讲真很难让所有人都能在共同的共识下进行交流。

这不像是文科,”八表流云澄夜色,九霄华月动春城“ 上来就能联想到它是在描述啥。但是偏理科代码逻辑或架构设计,只能把抽象的内容用图表的形式展现出来,让大家在同一的共识下共同协同工作。

查看更多

RabbitMQ 集群高可用原理及实战部署介绍

前言

在项目中想要 RabbitMQ 变得更加健壮,就要使得其变成高可用,今天我们一起来聊聊关于 RabbitMQ 集群原理和部署流程

1. 介绍

在前几篇文章中,我们详细的介绍了 RabbitMQ 的内部结构和使用,以及 SpringBoot 和 RabbitMQ 整合,都是基于单台 RabbitMQ 进行使用的。

我们知道在微服务流行的当下,一旦单台服务器挂了,基本上就无法提供高可用的服务了,因此为了保证服务高可用,在生产环境上我们通常的做法是搭建一个 RabbitMQ 集群,即使某台 RabbitMQ 故障了,其他正常的 RabbitMQ 服务器依然可以使用,应用程序的持续运行不会受到影响。

2. 集群架构原理

在前几篇文章中,我们有介绍到 RabbitMQ 内部有各种基础构件,包括队列、交换器、绑定、虚拟主机等,他们组成了 AMQP 协议消息通信的基础,而这些构件以元数据的形式存在,它始终记录在 RabbitMQ 内部,它们分别是:

  • 队列元数据:队列名称和它们的属性

  • 交换器元数据:交换器名称、类型和属性

  • 绑定元数据:一张简单的表格展示了如何将消息路由到队列

  • vhost 元数据:为 vhost 内的队列、交换器和绑定提供命名空间和安全属性

这些元数据,其实本质是一张查询表,里面包括了交换器名称和一个队列的绑定列表,当你将消息发布到交换器中,实际上是将你所在的信道将消息上的路由键与交换器的绑定列表进行匹配,然后将消息路由出去。

消息路由表

查看更多

Swift:解包的正确姿势

嗯,先来一段感慨

对于Swift学习而言,可选类型Optional是永远绕不过的坎,特别是从OC刚刚转Swift的时候,可能就会被代码行间的?与!,有的时候甚至是??搞得稀里糊涂的。

这篇文章会给各位带来我对于可选类型的一些认识以及如何进行解包,其中会涉及到Swift中if let以及guard let的使用以及思考,还有涉及OC部分的nullablenonnull两个关键字,以及一点点对两种语言的思考。

var num: Int? 它是什么类型?

在进行解包前,我们先来理解一个概念,这样可能更有利于对于解包。

首先我们来看看这样一段代码:

 `var num: Int?

  num = 10

  if num is Optional<Int> {

   print("它是Optional类型")

  }else {

    print("它是Int类型")

  }`

请先暂时不要把这段代码复制到Xcode中,先自问自答,num是什么类型,是Int类型吗?

好了,你可以将这段代码复制到Xcode里去了,然后在Xcode中的if上一定会出现这样一段话:

查看更多

macOS 下 FFmpeg 视频转码入门及进阶使用心得

简介

如今较为常见的视频封装格式有 mp4mkv 等, 内部的视频编码格式从前几年盛行的 H.264/x264 逐渐开始向新一代的 HEVC/x265( High Efficiency Video Coding 高效视频编码)过渡,而常见的音频编码格式无非 AC3、DTS 或者 AAC 等。无论是借助带有 GUI 的编码软件,还是使用命令行,FFmpeg 是最为广泛使用的工具,理论上 FFmpeg 支持各个平台,包括 Windows、macOS、iOS 以及 Android 等,这里只介绍在 macOS 下的使用。通过简单的命令,你可以大致了解 FFmpeg 在视频转换上的强大之处,视频编码部分也集中在 x264、x265,以及如何压制 macOS High Sierra 和 iOS 11 可以正确识别并生成缩略图的 HEVC 10bit 视频。最后会用一个较为复杂的例子,应用 -filter_complex 进行视频帧率的插值运算、嵌入 pgs 图形字幕,以及最后输出 HEVC 编码进行说明。

FFmpeg安装

如果有看过我以前文章的朋友,可能会注意到使用 Homebrew 编译 mpv 的一个重要依赖就是 FFmpeg。不过,如果将其用作视频转码,默认编译的 FFmpeg 会缺少一部分组件,因此这里可能需要重新安装 FFmpeg。以我个人编译版本为例,使用 –HEAD 来配合最新的 mpv,在 Terminal 中输入如下命令:

brew install ffmpeg --HEAD --with-fdk-aac --with-sdl2 --with-freetype --with-libass --with-libbluray --with-libvorbis --with-libvpx --with-opus --with-webp --with-x265

等待安装结束即可。

基础篇

压制 x264 编码视频文件

ffmpeg -i input.mp4 -c:a libfdk_aac -c:v libx264 -crf 20 -preset slow output.mp4

使用 FFmpeg 编码的基本规则, -i 之后的文件为输入的视频文件,即 input.mp4 ,支持的格式众多,例如 mkv、flv、vob 等等,文件可以包含目录,使用 macOS 的文件拖拽功能很方便。output.mp4 即为输出文件,文件名可自定义,视频封装格式建议对应编码格式,不应将 mpeg-2 或者 vp8 编码的视频也封装为 mp4。-c:a 之后表示输出文件的音频编码器,一般 mp4 常用的音频编码为 AAC-LC,按照官方 Wiki 指南,建议使用编码器 libfdk_aac 而不是 aac,libfdk_aac 音质更好,这也是为什么在前文中编译 FFmpeg 增加 –with-fdk-aac 的原因。-c:v 之后代表输出文件的视频编码器,使用 libx264 即可压制 x264 编码的视频流。-crf 20 代表视频编码的码率系数,数字越大,压制的效果越差,建议选择范围在 16 - 28,压制高质量的视频建议取值 20 以下。-preset slow 代表一组控制压缩时间和文件大小的参数选择,一般常选 fast、medium 和 slow。

以上都是基于 one-pass 压制,如果需要严格控制码率则需要使用 two-pass,更详细的介绍,可以参考 Encode / H.264。

压制 HEVC 10bit 编码视频文件

查看更多

高性能 Nginx HTTPS 调优 - 如何为 HTTPS 提速 30%

为什么要优化 Nginx HTTPS 延迟

Nginx 常作为最常见的服务器,常被用作负载均衡 (Load Balancer)、反向代理 (Reverse Proxy),以及网关 (Gateway) 等等。一个配置得当的 Nginx 服务器单机应该可以期望承受住 50K 到 80K 左右每秒的请求,同时将 CPU 负载在可控范围内。 但在很多时候,负载并不是需要首要优化的重点。比如对于卡拉搜索来说,我们希望用户在每次击键的时候,可以体验即时搜索的感觉,也就是说,每个搜索请求必须在 100ms - 200ms 的时间内端对端地返回给用户,才能让用户搜索时没有“卡顿”和“加载”。因此,对于我们来说,优化请求延迟才是最重要的优化方向。

这篇文章中,我们先介绍 Nginx 中的 TLS 设置有哪些与请求延迟可能相关,如何调整才能最大化加速。然后我们用优化卡拉搜索 Nginx 服务器的实例来分享如何调整 Nginx TLS/SSL 设置,为首次搜索的用户提速 30% 左右。我们会详细讨论每一步我们做了一些什么优化,优化的动机和效果。希望可以对其它遇到类似问题的同学提供帮助。 照例,本文的 Nginx 设置文件放置于 github,欢迎直接使用: 高性能 Nginx HTTPS 调优(https://github.com/Kalasearch/high-performance-nginx-tls-tuning)

TLS 握手和延迟

很多时候开发者会认为:如果不是绝对在意性能,那么了解底层和更细节的优化没有必要。这句话在很多时候是恰当的,因为很多时候复杂的底层逻辑必须包起来,才能让更高层的应用开发复杂度可控。比如说,如果你就只需要开发一个 APP 或者网站,可能并没有必要关注汇编细节,关注编译器如何优化你的代码——毕竟在苹果或者安卓上很多优化在底层就做好了。 那么,了解底层的 TLS 和应用层的 Nginx 延迟优化有什么关系呢? 答案是多数情况下,优化网络延迟其实是在尝试减少用户和服务器之间的数据传输次数,也就是所谓的 roundtrip。由于物理限制,北京到云南的光速传播差不多就是要跑 20 来毫秒,如果你不小心让数据必须多次往返于北京和云南之间,那么必然延迟就上去了。 因此如果你需要优化请求延迟,那么了解一点底层网络的上下文则会大有裨益,很多时候甚至是你是否可以轻松理解一个优化的关键。本文中我们不深入讨论太多 TCP 或者 TLS 机制的细节,如果有兴趣的话请参考 High Performance Browser Networking 一书。 举个例子,下图中展示了如果你的服务启用了 HTTPS,在开始传输任何数据之前的数据传输情况。 可以看到,在你的用户拿到他需要的数据前,底层的数据包就已经在用户和你的服务器之间跑了 3 个来回。 假设每次来回需要 28 毫秒的话,用户已经等了 224 毫秒之后才开始接收数据。 同时这个 28 毫秒其实是非常乐观的假设,在国内电信、联通和移动以及各种复杂的网络状况下,用户与服务器之间的延迟更不可控。另一方面,通常一个网页需要数十个请求,这些请求不一定可以全部并行,因此几十乘以 224 毫秒,页面打开可能就是数秒之后了。 所以,原则上如果可能的话,我们需要尽量减少用户和服务器之间的往返程 (roundtrip),在下文的设置中,对于每个设置我们会讨论为什么这个设置有可能帮助减少往返程。

Nginx 中的 TLS 设置

那么在 Nginx 设置中,怎样调整参数会减少延迟呢?

查看更多