Nginx 随机变量

各位程序员早上好, 我正在尝试在 Nginx 上创建随机变量,我的 Nginx 使用了 OpenResty 的 nginx+lua。 下面是一个静态变量的示例:

set $teste 123;

那么,能否将这个静态变量变成随机的?

点赞
用户7121513
用户7121513

如果您正在使用 OpenResty,则可以使用 Lua 进行操作,例如(生成 3 位数):

set_by_lua_block $teste { return string.format('%03d', math.random(1, 999)) }
2020-06-02 22:55:57
用户9783845
用户9783845

你需要提供随机种子,否则每次服务器重新启动时将得到相同的值。

在这里,我使用 resty.random.bytes(内部使用 OpenSSL 中的 RAND_pseudo_bytesRAND_bytes)在 nginx 工作进程启动时提供加密强度的伪随机种子。

更新:您应该使用 resty_random.bytes(n, true) 以获得真正的加密强度的伪随机值。如果第二个参数是 true,将使用 RAND_bytes 而不是 RAND_pseudo_bytes。但在这种情况下,您需要处理熵池可能耗尽的情况。也就是说,如果没有足够的随机性来确保不可预测的字节序列,resty_random.bytes(n, true) 可能会返回 nil

http {

    init_worker_by_lua_block {
        local resty_random = require('resty.random')
        -- 将随机字节(0..255 的整数)作为种子
        local seed = string.byte(resty_random.bytes(1))
        math.randomseed(seed)
    }

    server {
        listen 8888;

        location = / {
            set_by_lua_block $random {
                return math.random(1, 100)
            }

            echo "random number: $random";

        }
    }
}
2020-06-02 23:13:48