配置 nginx,当文件存在时提供 503 服务

配置 nginx,当文件存在时提供 503 服务

我正在尝试设置 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;
}

相关内容