diff --git a/rootfs/etc/nginx/lua/lua_ingress.lua b/rootfs/etc/nginx/lua/lua_ingress.lua index f0d33db81..b751b2214 100644 --- a/rootfs/etc/nginx/lua/lua_ingress.lua +++ b/rootfs/etc/nginx/lua/lua_ingress.lua @@ -2,25 +2,40 @@ local _M = {} local seeds = {} local original_randomseed = math.randomseed -math.randomseed = function(seed) - local pid = ngx.worker.pid() - if seeds[pid] then +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 ngx.log(ngx.WARN, string.format("ignoring math.randomseed(%d) since PRNG is already seeded for worker %d", seed, pid)) return end + seed = get_seed_from_urandom() + if not seed then + seed = ngx.now() * 1000 + pid + end original_randomseed(seed) seeds[pid] = seed end -local function randomseed() - math.randomseed(ngx.time() + ngx.worker.pid()) -end - function _M.init_worker() - randomseed() + math.randomseed() end return _M