我正在尝试设置 nginx,如果某个特定文件存在(可能类似于“升级”)则返回 503。我正在尝试使用该try_files
指令,但当它找到该/upgrading.html
文件时,它会提供该文件,而不是遵循该指令。这是为什么?
location / {
try_files /upgrading.html @keepgoing;
}
location = /upgrading.html {
return 503;
}
location @keepgoing {
#do stuff here to do whatever I would normally do...
}
当我打开调试时,在日志中看到以下内容:
3388 2010/07/01 19:44:21 [debug] 76327#0: *8 test location: "/"
3389 2010/07/01 19:44:21 [debug] 76327#0: *8 using configuration "/"
3390 2010/07/01 19:44:21 [debug] 76327#0: *8 http cl:-1 max:52428800
3391 2010/07/01 19:44:21 [debug] 76327#0: *8 generic phase: 2
3392 2010/07/01 19:44:21 [debug] 76327#0: *8 post rewrite phase: 3
3393 2010/07/01 19:44:21 [debug] 76327#0: *8 generic phase: 4
3394 2010/07/01 19:44:21 [debug] 76327#0: *8 generic phase: 5
3395 2010/07/01 19:44:21 [debug] 76327#0: *8 access phase: 6
3396 2010/07/01 19:44:21 [debug] 76327#0: *8 access phase: 7
3397 2010/07/01 19:44:21 [debug] 76327#0: *8 post access phase: 8
3398 2010/07/01 19:44:21 [debug] 76327#0: *8 try files phase: 9
3399 2010/07/01 19:44:21 [debug] 76327#0: *8 try to use file: "/upgrading.html" "/usr/local/nginx/html/upgrading.html"
3400 2010/07/01 19:44:21 [debug] 76327#0: *8 try file uri: "/upgrading.html"
3401 2010/07/01 19:44:21 [debug] 76327#0: *8 content phase: 10
3402 2010/07/01 19:44:21 [debug] 76327#0: *8 content phase: 11
3403 2010/07/01 19:44:21 [debug] 76327#0: *8 content phase: 12
3404 2010/07/01 19:44:21 [debug] 76327#0: *8 http filename: "/usr/local/nginx/html/upgrading.html"
似乎找不到该指令,但它就在那里,所以不确定我做错了什么。
另外,更一般地说,这是解决这个问题的可接受的方法吗?还有其他方法吗?
答案1
从此页面开始:https://calomel.org/nginx.html
## System Maintenance (Service Unavailable)
if (-f $document_root/system_maintenance.html ) {
error_page 503 /system_maintenance.html;
return 503;
}
我认为,重要的部分是“-f”——它测试文件是否存在。
答案2
我建议你不要使用try_files
这里,而是查找文件并返回错误代码(如果存在)。然后你可以单独处理错误代码。看下面的例子。
# If the maintenance.html file exists, return status 503
if (-f $document_root/maintenance.html) {
return 503;
}
# Then on status 503, use the @maintenance location
error_page 503 @maintenance;
# I the @maintenance location, render the maintenance.html
location @maintenance {
rewrite ^(.*)$ /maintenance.html break;
}
如果您计划定期执行此操作并且每次都希望相同,maintenance.html
您也可以将第一部分更改为如下所示的内容。然后,您就可以始终保持原样,并在需要时maintenance.html
添加空文件。.maintenance
if (-f $document_root/.maintenance) {
return 503;
}