杭州亚运会期间领导要求只允许工作日允许对外提供服务, 非工作日不允许访问. 刚开始打算写脚本定时kill和重启服务来实现, 但是有的服务虽然不允许访问可是一些后台定时任务还是需要持续跑的. 因此最终考虑通过nginx配置文件来限制非工作时间的访问.
实现的思路是穷举所有不允许访问的日期和工作时间, 在不允许访问的时间请求时在nginx里直接拦截返回404. 当前配置是根据当前操作系统的时间来判断的. 因此需要保证操作系统时间正确.
1.首先通过$time_local获取日期09/Oct/2023:16:49:46 +0800. 并通过正则获取到当前的月, 日, 时, 分.
2.然后先判断日期是否是非工作日, 若是则直接返回404, 如果是允许访问的日期则再判断时, 分
3.排除掉所有不允许访问的请求后,剩下的正常返回
配置如下:
location / {
# 获取本地时间
if ( $time_local ~ "^(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+) \+(\d+)" ) {
set $hour $4;
set $day $1;
set $month $2;
set $min $5;
}
set $flag "";
if ($month = Sep) {
set $flag "${flag}1";
}
if ($day ~ 09|10|16|17|23|24|29|30) {
set $flag "${flag}2";
}
if ($flag = "12") {
return 404;
}
set $flag1 "";
if ($month = Oct) {
set $flag1 "${flag1}3";
}
if ($day ~ 01|02|03|04|05|06|14|15|21|22|28|29) {
set $flag1 "${flag1}4";
}
if ($flag1 = "34") {
return 404;
}
if ($hour ~ 01|02|03|04|05|06|07|21|22|23|24) {
return 404;
}#8:30—20:00对外提供服务
#判断是不是8:00 - 8:30
set $flag3 "";
if ($hour = 08) {
set $flag3 "${flag3}5";
}
if ($min ~ 01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29) {
set $flag3 "${flag3}6";
}
if ($flag3 = "56") {
return 404;
}
root html8002/pds;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}