我想在一天中的某个时间段内禁用某个应用程序的访问。
在 Nginx 中可以做这样的事情吗?
if(hour > '04:00:00' && hour < '05:00:00') {
root /var/www/maintenance;
} else {
root /var/www/site;
}
答案1
我只能想到两种方法可以做到这一点(除了 cron 更改符号链接之外):
1)http://nginx.org/en/docs/http/ngx_http_ssi_module.html#variables
2) 创建一个非常小的 PHP/Python/Whatever 应用程序,如果不是维护时间,则返回 200,否则返回 403。使用 http auth 模块。http://nginx.org/en/docs/http/ngx_http_auth_request_module.html
答案2
只需创建一个 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 站点配置中(替换根指示):
include status.conf;
然后是计划任务:
0 4 * * * /opt/scripts/nginx-site-script.sh maintenance
0 5 * * * /opt/scripts/nginx-site-script.sh
尝试在 nginx 中通过 if 语句等执行此操作可能会降低 nginx 的速度,因为 nginx 会在每次请求时评估服务器块(存储在内存中)。
答案3
我通常使用的方法是,每当我第一次在 nginx 中启用应用程序时,都包含一个停机处理程序。以下是示例配置:
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;
第二个位置块中的自定义页面重定向,其中包含简单的“App 1 维护中”消息。只要 app_1 停机,访问者就会收到此自定义“维护中”页面。这可以无缝处理计划外停机和计划停机。
在此示例中,此维护页面对用户的响应代码为 200(OK),但是,如果您愿意,可以通过更改=200
为您选择的返回代码将其更改为错误响应。
您还可以添加一些 javascript 来定期重新加载页面。由于维护页面的 URL 与应用程序的 URL 相同,因此当 app_1 重新上线时,它将在下一次自动重新加载时替换维护页面。
就您而言,由于您想在特定时间禁用公共访问,因此您可以将此 nginx 配置与通过 crontab 安排的应用程序关闭相结合。如果您愿意,您可以在执行维护时将您的应用程序启动到其他端口。只要它没有在其常用端口上监听,访问者就会看到“维护中”页面。