概述
背景: 有些网络由于某种特殊需求,需要每日在指定时间内开放,在其余时间展示“系统正在维护中…”的页面。
基于类似需求,最好的当然是定时自动处理了,省去人工处理的麻烦;
一、整体思路
1、设计2个nginx.conf, 分别指向正式系统和维护系统路径;
2、编写切换nginx配置并重新加载nginx的脚本;
3、然后使用crontab定时器执行脚本,定时切换2个不同的nginx.conf;
二、具体实现
2.1 设计2个nginx.conf, 分别指向正式系统和维护系统路径。
注意: 这2个nginx.conf, 要放到一个不会被删除的位置,我这边放到了/data/script/ 目录下;
正常系统的配置:nginx.conf
刚安装完nginx后,默认nginx.conf的配置就行,正式的系统也用默认的index.html(作为示例)
系统正在维护中 的配置:nginx-stopsvc.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
# 停止维护的页面放到这个路径下
root /usr/local/nginx/stopsvc;
index index.html index.htm;
}
}
}
系统维护中页面(/usr/local/nginx/stopsvc/index.html)如下:
<!DOCTYPE html>
<html>
<head>
<title>系统维护中</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>系统正在维护中,给您带来的不便,非常抱歉...</h1>
</body>
</html>
2.2 编写切换nginx配置并重新加载nginx的脚本
定时启动脚本:就是把正常系统的nginx配置放到/usr/local/nginx/conf/ 目录下
2.2.1 start.sh脚本如下:
# /bin/bash
rm -f /usr/local/nginx/conf/nginx.conf
cp -rp /data/script/nginx.conf /usr/local/nginx/conf/nginx.conf
cd /usr/local/nginx/sbin
./nginx -s reload
curtime=$(date "+%Y-%m-%d %H:%M:%S")
echo $curtime "开启服务成功"
上述脚本安行说明:
先删除原有的默认配置
将准备好的正式系统的nginx.conf配置替换过去
到nginx的sbin目录
执行重新加载nginx的命令
变量接当前指定格式时间
输出时间和结果
2.2.2 stop.sh脚本如下:
# /bin/bash
rm -f /usr/local/nginx/conf/nginx.conf
cp -rp /data/script/nginx-stopsvc.conf /usr/local/nginx/conf/nginx.conf
cd /usr/local/nginx/sbin
./nginx -s reload
curtime=$(date "+%Y-%m-%d %H:%M:%S")
echo $curtime "停止服务成功"
上述脚本安行说明:
先删除原有的默认配置
将准备好的系统维护中…的nginx-stopsvc.conf配置替换过去
到nginx的sbin目录
执行重新加载nginx的命令
变量接当前指定格式时间
输出时间和结果
2.3、然后使用crontab定时器执行脚本,定时切换2个不同的nginx.conf;
脚本写好后,加入定时器定时执行,执行crontab -e编辑当前用户的定时器任务
crontab -e
执行上述命令后,会进入类似vim编辑器的界面,输入要执行的定时器配置,然后:wq保存退出即可,如下:
# 表示每日16:30执行stop.sh脚本,并将日志输出到startAndStopLog.log
30 16 * * * /usr/local/script/stop.sh >> /usr/local/script/startAndStopLog.log
30 8 * * * /usr/local/script/start.sh >> /usr/local/script/startAndStopLog.log
说明:
【整体格式】:要执行cron表达式 要执行的脚本的全路径 >> 日志文件全路径
cron表达式格式,从左到右依次为:minute hour day month dayofweek
minute - 从0到59的整数
hour - 从0到23的整数
day - 从1到31的整数 (必须是指定月份的有效日期)
month - 从1到12的整数 (或如Jan或Feb简写的月份)
dayofweek - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
设置后,使用crontab -l命令查看设置定时器的结果:
[root@wdy stopsvc]# crontab -l
30 16 * * * /usr/local/script/stop.sh >> /usr/local/script/startAndStopLog.log
30 8 * * * /usr/local/script/start.sh >> /usr/local/script/startAndStopLog.log
三、测试结果
3.1 早上 8:30 系统正式运行
(我这边是nginx的默认页面和配置),如下:
3.2 下午 16:30 系统进入维护中
这里的示例就比较简陋了哈, 结果如下:
四、测试日志
[root@wdy stopsvc]# cat startAndStopLog.log
2022-03-25 16:30:00 停止服务成功
2022-03-26 08:30:00 开启服务成功
五、可能的问题
1、如果不执行,可能是时区不对,比如你晚上20点执行,时区不对的话,可能是date输出是8点,你设置20点当然不执行了
设置时区为上海timedatectl set-timezone Asia/Shanghai
[root@host-wdy stopsvc]# date
Tue Apr 26 08:03:32 EDT 2022
[root@host-wdy stopsvc]# timedatectl set-timezone Asia/Shanghai
[root@host-wdy stopsvc]# timedatectl
Local time: Tue 2022-04-26 20:07:16 CST
Universal time: Tue 2022-04-26 12:07:16 UTC
RTC time: Tue 2022-04-26 11:48:36
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@host-wdy stopsvc]# date
Tue Apr 26 20:07:45 CST 2022
2、可能是sh脚本没有执行权限
chomd +x start.sh stop.sh
END
最后
以上就是小巧乌冬面为你收集整理的Nginx从入门到实战(七):定时器动态切换nginx配置-实现网站自动启停END的全部内容,希望文章能够帮你解决Nginx从入门到实战(七):定时器动态切换nginx配置-实现网站自动启停END所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复