Я пытаюсь настроить 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"
Похоже, он не может найти директиву, но она есть, поэтому не уверен, что я делаю не так.
Также, в более общем плане, приемлем ли это подход к решению этой проблемы? Как это сделать?
С этой страницы: 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' - он проверяет, существует ли файл.
Я предлагаю вам не использовать 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;
}