因为业务的需要,两会期间需要定时开关 nginx服务器上的网站。

功能

  • 可以定时开关网站, 默认设定为早8点~晚21点开放;
  • 被关闭的网站访问时会被强行中断连接;
  • 设定 geowhite_list_ips 可以允许白名单IP不受闭站影响;
  • 设定 mapwhite_list_websites 可以允许特定的网站(域名)不受闭站影响。

条件

  • 需要一个 nginx 服务器软件
  • nginx 需要编译带上 ngx_http_lua_module 模块

由于我们的服务器使用 openresty,因此符合以上条件。

Lua 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

--
-- 定时关闭服务器脚本
-- Uer: Micblo
-- Date: 2017/3/3
-- Time: 14:26
--

local time = os.time()

-- 两会: 2017-03-12 解封 --
if (
1489276800 > time and
ngx.var.white_list_ips == "0" and
ngx.var.white_list_websites == "0"
) then
local now_hour = tonumber(os.date("%H", time))
-- 每日 8 ~ 21 点开放 --
if (now_hour < 8 or now_hour >= 21) then
ngx.exit(444)
end
end

在需要管控的网站的 server {} 下附上 access_by_lua_file lua/cron-block.lua; 调用这个Lua文件。

注意文件路径需要改成你实际存放这个脚本的位置,相对路径的起始目录为 nginx 的根目录。

white_list_ips 设置白名单IP

由于业务需要,两会期间依然允许一部分内网IP访问这些关闭的网站。

我们使用 geo 来存放这些IP。

1
2
3
4
5
geo $remote_addr $white_list_ips {
default 0;
10.0.0.0/8 1;
192.168.0.0/16 1;
}

这样,在 10.0.0.0/8192.168.0.0/16 网段的小伙伴就可以不受限制访问到网站了。

white_list_websites 设置域名白名单

由于业务需要,两会期间依然允许一部分网站可以被访问。

我们使用 map 来存放这些网站的域名。

1
2
3
4
5
map $server_name $white_list_websites {
default 0;
example.com 1;
system.example.com 1;
}

这样,在 example.comsystem.example.com 这两个网站可以不被关闭。

综合

最后我们把代码揉在一起:

1
2
3
4
5
6
7
8
9
10
11
12
13
geo $remote_addr $white_list_ips {
default 0;
10.0.0.0/8 1;
192.168.0.0/16 1;
}

map $server_name $white_list_websites {
default 0;
example.com 1;
system.example.com 1;
}

access_by_lua_file lua/cron-block.lua;

建议把这个代码单独放到一个通用的配置文件里面,让全部的 serverinclude 它。

这样全部的 server 都可以适用这个规则。

如果不需要用这个脚本,直接注释掉 access_by_lua_file 那行即可。

除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

本文地址:https://blog.micblo.com/2017/03/12/nginx-Lua-%E8%AE%BE%E5%AE%9A%E7%BD%91%E7%AB%99%E5%AE%9A%E6%97%B6%E5%85%B3%E9%97%AD/