Poslua Blog

「你是一个出色的程序员」要比「你是一个开发总监」要有意义的多

Kong 插件加载机制概述

以请求的视角回顾自己的一生

概述 插件可以认为是 Kong 管理 API 的核心,其模块化和可扩张性做得很好,尤其是其灵活的加载机制使得 Kong 能够针对不同 API 启用、组合任意插件。Kong 默认自带的插件集,按照功能的不同大致可以分为六大类:Authentication 认证、Security 安全、Traffic Control 流量控制、Analytics & Monitoring 分析监控、T...

Source Code Pro 字体其实并不完美

Courier New 不愧为终端之王

事情的起因是这样的,前两天我在服务器上看到一个莫名其妙的文件夹 ‐p,所以决定删了它,于是顺手就敲了 rm -rf -- -p。 然而执行结果却令人意外:rm 提示目录并不存在。 rm 删除包含特殊字符的文件时,需要 -- 参数 显然这里显示出来的 ‐p 其实并不是 ASCII 中的 -p。之后我又手动的拷贝了 ll 输出的 -p,这一次成功删除了这个目录。 为了彻底弄清...

浅谈 Kong key-auth 插件 token 的生成

CSPRNG or 真随机?

最近我在 Kong 的 Blog 上看了一篇文章:That’s So Random: (Pseudo)Random Data Generation in Kong API Gateway,文章中介绍了 Kong 是怎么处理随机数问题的,读后受益良多,在此做一个分享。 seed 的生成 在 OpenResty 中如果使用 ngx.now() 设置种子的话,将会导致各个 worker 的种子...

谈谈 Kong rate-limiting 插件中的缺陷

Redis 高频卡控中的 Race Conditions 问题

知名 API 网关 Kong 有个 rate-limiting 的插件,可以利用它来实现限流的需求。例如:根据特定时间窗口来限制 API 的调用次数。其关键代码是这么实现的: red:init_pipeline() for i = 1, idx do red:incrby(keys[i], value) if expirations[i] then red:expire(k...

pairs 的遍历顺序

其实本质上还是按照顺序遍历的

在 Lua 中,我们经常使用 pairs 来遍历一个 “hashmap”,但是你有没有想过,pairs 遍历的顺序到底依据的是啥? 为了搞清楚这个问题,这里先来做个测试: 注:以下测试结果均基于 Lua 5.1.4 case 1 local st = { lguafYWz = "1 ", BNwGryzZ = "2 ", FuKaDkdd = "3 "...

Lua string hash 算法

JSHash

我在前一篇文章介绍过下面这 3 个字符串拥有相同的 hash,会导致 Hash Dos 问题: "0000000000000000000000000000000000" "f0l0l0w0m0e0n0t0w0i0t0t0e0r0?0:0)0" "x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0" 但是 Lua 并没有将自己的 string hash 算法暴露出来,那...

Lua string 哈希碰撞

Hash Collisions

Lua 中 40 字节以下的字符串会被内部化到一张表中(Lua 5.3),这张表挂在 global state 结构下。对于短字符串,相同的串在同一虚拟机上只会存在一份,这被称为字符串的内部化。 其实字符串在 Lua VM 中是以两种内部形式保存的:短字符串及长字符串。其界限默认设置为40(字节) 对于比较长的字符串(32字节以上),为了加快哈希过程,计算字符串哈希值是跳跃进行的...

NGINX resolver 配置中的 "坑"

不要着急去当第一个吃螃蟹的人

最近我把自己的 OpenResty 升级到了最新的 openresty/1.13.6.1 版本,却发现 dns 解析不能正常工作了: ... resolver 127.0.0.1; server { listen 8888; server_name _; location / { content_by_lua_block { ...

TIME_WAIT 的 Timer

我们知道 TCP 在关闭连接的时候,主动断开的一方将处于 TIME_WAIT 状态,并将持续两倍的 MSL。这个 MSL 在 RFC 793 中的建议是 1 分钟,但是很多系统实现都是 30 秒,所以 TIME_WAIT 的时长也就是 1 分钟。 而且这个数值是硬编码在内核中的,也就是说除非你重新编译内核,否则没法修改它。我们可以通过 ss 来查看 TIME_WAIT 的剩余存活时长(...

直观的表现 PRNG 周期性

无图无真相。真的真,真出声

我在前面的一些文章中介绍过:Lua 随机数算法用的是 LCG(32位的随机数,周期最多为232); LuaJIT 用的是 LFSR,周期达到 2223。下面是我分别用 Lua 和 LuaJIT 的随机数填充一个位图,代码: #!/usr/bin/env lua -- Draws the B/W image with lua-gd local gd = require "gd" loca...