2018-12-19 13:46:53 +00:00
|
|
|
local _M = {}
|
|
|
|
|
|
|
|
local seeds = {}
|
|
|
|
local original_randomseed = math.randomseed
|
|
|
|
|
2019-01-17 16:21:25 +00:00
|
|
|
local function get_seed_from_urandom()
|
|
|
|
local seed
|
|
|
|
local frandom = io.open("/dev/urandom", "rb")
|
|
|
|
if frandom then
|
|
|
|
local str = frandom:read(4)
|
|
|
|
frandom:close()
|
|
|
|
seed = 0
|
|
|
|
for i = 1, 4 do
|
|
|
|
seed = 256 * seed + str:byte(i)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return seed
|
|
|
|
end
|
|
|
|
|
|
|
|
math.randomseed = function()
|
|
|
|
local pid = ngx.worker.pid()
|
|
|
|
local seed = seeds[pid]
|
|
|
|
if seed then
|
2018-12-19 13:46:53 +00:00
|
|
|
ngx.log(ngx.WARN,
|
2019-01-18 02:08:33 +00:00
|
|
|
string.format("ignoring math.randomseed() since PRNG is already seeded for worker %d", pid))
|
2018-12-19 13:46:53 +00:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2019-01-17 16:21:25 +00:00
|
|
|
seed = get_seed_from_urandom()
|
|
|
|
if not seed then
|
|
|
|
seed = ngx.now() * 1000 + pid
|
|
|
|
end
|
2018-12-19 13:46:53 +00:00
|
|
|
original_randomseed(seed)
|
|
|
|
seeds[pid] = seed
|
|
|
|
end
|
|
|
|
|
|
|
|
function _M.init_worker()
|
2019-01-17 16:21:25 +00:00
|
|
|
math.randomseed()
|
2018-12-19 13:46:53 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
return _M
|