Nginx 随机变量
Nginx random variables
程序员们早上好,
我正在尝试在 nginx 上创建随机变量,(我有 OpenResty nginx+lua)。
下面是一个静态变量的例子:
set $teste 123;
那么是否可以将这个静态变量随机化?
如果你使用的是 openresty,你可以在 lua 的帮助下完成,例如(生成 3 位数字):
set_by_lua_block $teste { return string.format('%03d', math.random(1, 999)) }
您需要提供随机种子,否则每次重新启动服务器时您将获得相同的值。
我使用 resty.random.bytes
(内部使用来自 OpenSSL 的 RAND_pseudo_bytes or RAND_bytes)在 nginx worker 启动时提供加密强度伪随机种子。
UPD:您应该使用 resty_random.bytes(n, true)
来获得真正的 加密强度 伪随机值。如果第二个参数是 true
,将使用 RAND_bytes
而不是 RAND_pseudo_byte
。但在这种情况下,您将不得不处理熵池可能耗尽的问题。也就是说,如果没有足够的随机性来确保不可预测的字节序列,resty_random.bytes(n, true)
可能会 return nil
。
http {
init_worker_by_lua_block {
local resty_random = require('resty.random')
-- use random byte (0..255 int) as a seed
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";
}
}
}
程序员们早上好, 我正在尝试在 nginx 上创建随机变量,(我有 OpenResty nginx+lua)。 下面是一个静态变量的例子:
set $teste 123;
那么是否可以将这个静态变量随机化?
如果你使用的是 openresty,你可以在 lua 的帮助下完成,例如(生成 3 位数字):
set_by_lua_block $teste { return string.format('%03d', math.random(1, 999)) }
您需要提供随机种子,否则每次重新启动服务器时您将获得相同的值。
我使用 resty.random.bytes
(内部使用来自 OpenSSL 的 RAND_pseudo_bytes or RAND_bytes)在 nginx worker 启动时提供加密强度伪随机种子。
UPD:您应该使用 resty_random.bytes(n, true)
来获得真正的 加密强度 伪随机值。如果第二个参数是 true
,将使用 RAND_bytes
而不是 RAND_pseudo_byte
。但在这种情况下,您将不得不处理熵池可能耗尽的问题。也就是说,如果没有足够的随机性来确保不可预测的字节序列,resty_random.bytes(n, true)
可能会 return nil
。
http {
init_worker_by_lua_block {
local resty_random = require('resty.random')
-- use random byte (0..255 int) as a seed
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";
}
}
}