分类 Nginx 下的文章

代码中的谎言

俗话说,一个谎言,要用一百个谎言去圆。

在代码的世界里,同样如此。当然,这里只是借用“谎言”这个概念,并不带有任何贬义色彩。“谎言”用来指代那些由于设计或理解上的小疏漏,因为这些小疏漏,导致后续的代码里使用很多迂回的策略来达到目的。

但是代码世界里的“谎言”,又与真实世界的“谎言”截然不同,因为我们有版本管理系统在背后默默的记录着一切。通过它,我们可以对“谎言”进行追根溯源,找到最初的疏漏。

今天我们就来以Nginx-RTMP这个项目为例,来“拆穿”它的一个设计精巧的“谎言”。

- 阅读剩余部分 -

对一门编程语言的基本尊重

在大学里我们就知道一个著名的论断:程序=数据结构+算法,无数人奉为圭臬,衍生出很多变形体,比如"编程语言不重要,思想才重要"。

现在网络社群发达,一个实际上在某一个领域才刚入门没多久的人,在解决了新手提出的几个hello world 级别的问题之后,就会被称为大神。然后他就能开始散布一些言论了。

这些言论本身放在一定的限定条件之下是没有问题的,比如 “Python 可简单了,看一个下午手册就能开始干活了”,他至少得有几个限定条件,比如你之前熟悉过其编程语言。即使在这些限定条件之下,你也得踏踏实实花几个小时到半天的时间来看手册不是么。

- 阅读剩余部分 -

关于Nginx-1.9.11的动态模块

我们知道,原生 Nginx 增加、修改一个第三方模块,需要重新编译源代码,所有的模块都是用静态链接的形式组织起来的。而 Tengine 有一个增强的功能,即动态模块加载 DSO(Dynamic Shared Objects), 可以实现运行时动态加载模块,而不用每次都要重新编译Tengine。

在 2016 年农历春节期间,Nginx 官方发布了最新版本 Nginx-1.9.11,也增加了该功能。

Nginx-1.9.11 的Changelog 如下:

Changes with nginx 1.9.11 09 Feb 2016

*) Feature: TCP support in resolver.

*) Feature: dynamic modules.

*) Bugfix: the $request_length variable did not include size of request
headers when using HTTP/2.

*) Bugfix: in the ngx_http_v2_module.

从使用的角度上来说,是增加了一个指令 load_modules 指令,来加载编译为 so 形式的动态模块。

- 阅读剩余部分 -

使用ngx.header修改Accept-Ranges的问题

今天有位朋友在使用 OpenResty 时发现一个奇怪的事情。

他打算用 ngx.header 来修改响应的 Accept-Ranges 头,于是按照惯例做法,在 *_by_lua 脚本中写入ngx.header["Accept-Ranges"] = "xxx"。在 OpenResty 中,这是一种经常被使用到的方法。

他发现的问题是,当他这么修改后,真实响应的 Accept-Ranges 头不是被改写了,而是出现了两个并列的 Accept-Ranges 头,其中第一个的值是他打算修改的值,而第二个 Accept-Ranges 头的值却是原始的值,即 "bytes".

- 阅读剩余部分 -

如何绘制流程图和结构图

经常会看到一些技术博客在讲解代码的时候,能配上一幅幅精美的程序流程图、结构图,一直都很佩服这样的作者。其实他们大多数也并没有使用什么特别的工具,基本上可以分为如下几类:

  • Microsoft Viso, Word, PPT, Windows 自带的画图板等常用办公软件
  • 一些其他相对较小众的绘图软件,例如 Pencil
  • 脑图工具,例如 Xmind
  • Graphviz, 使用一种叫 dot 的语言来描述结构并生成图片
  • 利用最基本的字符(连字符,箭头等)来绘制,这种做法第一眼就会给人一种返璞归真的感觉,但实际上我个人并不习惯

上面这几类绘制结构图、流程图的方法或工具,我基本上都使用过,但绘图水平实在太差,效率也很低。在读代码的时候,大部分是靠笔、纸这种最原始的工具来完成分析,甚至还专门买了一个白板放在家里。这样往往几幅图画下来后,自己是弄得很明白了,却没法分享到文章里去。

- 阅读剩余部分 -