我想在一天中的某个时段禁用对应用程序的访问。
在Nginx中可以这样做吗?
if(hour > '04:00:00' && hour < '05:00:00') { root /var/www/maintenance; } else { root /var/www/site; }
我只能想到这样做的两种方式(除了cron更改符号链接):
1) http://nginx.org/en/docs/http/ngx_http_ssi_module.html#variables
2)创build一个非常小的PHP / Python /任何应用程序返回200,如果不是维修时间,否则返回403。 使用httpauthentication模块。 http://nginx.org/en/docs/http/ngx_http_auth_request_module.html
只需创build一个bash脚本来更新文件并将其设置为cronjob,例如:
#!/usr/bin/env bash SiteStatus="$1" SiteStatusConfig="/etc/nginx/status.conf" if [ "$SiteStatus" = "maintenance" ]; then echo "root /var/www/maintenance;" > $SiteStatusConfig else echo "root /var/www/site;" > $SiteStatusConfig fi nginx -s reload
然后放置到你的nginx站点configuration(取代root指令):
include status.conf;
然后cronjob:
0 4 * * * /opt/scripts/nginx-site-script.sh maintenance 0 5 * * * /opt/scripts/nginx-site-script.sh
尝试在nginx中执行此操作,通过if语句等可以减缓nginx的速度,因为nginx会用每个请求评估服务器块(存储在内存中)。
我通常使用的方法是在第一次启用nginx中的应用程序时包含停机处理程序。 这里是configuration示例:
location /app_1/ { proxy_pass http://127.0.0.1:8001/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; error_page 502 =200 /502-app_1-maintenance.html; } location /502-app_1-maintenance.html { root /var/www/html/error; try_files $uri /502-app_1-maintenance.html; }
只要nginx无法连接到端口8001上的app_1,就会产生502错误。 该错误通过error_page 502 =200 /502-app_1-maintenance.html;redirecterror_page 502 =200 /502-app_1-maintenance.html; 到包含简单的“App 1 Under Maintenance”消息的第二个位置块中的自定义页面。 访问者在任何时候app_1被closures时都会得到这个自定义的“维护中”页面。 这可以无缝处理计划外以及计划停机时间。
在这个例子中,这个维护页面对用户的响应代码是200(OK),但是,如果您希望将=200更改为您select的返回代码,则可以将其更改为错误响应。
您也可以添加一些JavaScript来定期重新加载页面。 由于维护页面的url与应用程序的url相同,所以当app_1重新联机时,将会replace下一次自动重装的维护页面。
在你的情况下,因为你想在某些时候禁用公共访问,你可以将这个nginxconfiguration与通过crontabclosures的预定应用程序结合起来。 如果你愿意,你可以在进行维护时将应用程序放在不同的端口上。 只要不在通常的端口上收听,访问者就会看到Under Maintenance页面。