Luaだけで頑張りたかったけど、思いつかずBashにも頼ってしまったConfig
スループットが0に近い社内環境なら、特に問題なく動作。
Websocketでコネクションが残り続ける後段へのアクセスを制御するものなので、
利用できる場面は限定されそう。
できるだけフロントに手を入れない形を目指した結果の苦肉の策
→きっともっとオシャレで高速な、OS依存しないコード書く方法はあるんだろうけど、
Lua初めて触ってチンプンカンプンなので、そのうち。
location / {
access_by_lua_block {
local remote_ip = ngx.var.remote_addr
local command = "netstat -anpt| grep nginx | grep ESTAB | grep -v 127.0.0.1 | grep -v " .. remote_ip .. " | wc -l"
local sorry_text = "現在、別の方がアクセス中のため本ページにアクセスできません。"
-- コマンド実行して結果を取得
local handle = io.popen(command)
local result = handle:read("*a")
handle:close()
local other_active_sessions = tonumber(result)
-- 実行結果から、他のIPアドレスのTCPコネクションがあれば、Sorry応答
if other_active_sessions and other_active_sessions > 0 then
ngx.status = ngx.HTTP_OK
ngx.header["Content-Type"] = "text/plain; charset=utf-8"
ngx.say(sorry_text)
return ngx.exit(ngx.OK)
end
}
proxy_pass http://hogehoge;
}