在实际业务需求中,要求在工作时间段(07:30~18:00)内允许访问系统,在非工作时间段内访问系统时跳转维护。
通过上网查阅资料,有几种方式可以实现基于时间段进行开放访问或维护:
1、Windows服务器创建定时任务,定时重启nginx并切换配置。
2、通过nginx配置定时控制访问或维护。
使用windows的定时任务过于麻烦,而且不一定稳定,有些服务器可能是linux,所以决定使用nginx配置的方式。
nginx配置文件如下:
server {
listen 80;
server_name localhost;
location / {
# 获取本地时间,并转换为对应格式,将时分设置到变量中
if ($time_local ~ "^(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+) \+(\d+)") {
set $hour $4:$5;
}
# 判断变量中的时分,是否处于非工作时间,是则调整维护
if ($hour ~ "^((0[0-6]|2[0-4]|1[8-9]):[0-9][0-9])|(07:[0-2][0-9])") {
rewrite ^(.*)$ /50x.html break;
}
# 此处相当于else,正常访问
root html;
index index.html index.htm;
}
}
注意,如果你的nginx中如果配置了负载均衡和代理,则使用以上配置跳转代理页面可能会有问题。
此时只需将重定向(rewrite
)维护页面修改为代理维护页面即可,在nginx中添加维护页面的代理:
server {
listen 8847;
server_name localhost;
client_max_body_size 1024m;
location / {
rewrite ^/(.*)$ /50x.html break;
}
}
修改业务系统的server配置:
server {
listen 80;
server_name localhost;
location / {
# 获取本地时间,并转换为对应格式,将时分设置到变量中
if ($time_local ~ "^(\d+)\/(\w+)\/(\d+):(\d+):(\d+):(\d+) \+(\d+)") {
set $hour $4:$5;
}
# 判断变量中的时分,是否处于非工作时间,是则调整维护
if ($hour ~ "^((0[0-6]|2[0-4]|1[8-9]):[0-9][0-9])|(07:[0-2][0-9])") {
# 此处将重定向修改为代理即可
proxy_pass http://localhost:8847; break;
}
# 此处相当于else,正常访问
proxy_pass http://xxxxxxxx;
}
}
至此已经可以实现业务需求,特此记录。