Назад | Перейти на главную страницу

Настройте 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"

Похоже, он не может найти директиву, но она есть, поэтому не уверен, что я делаю не так.

Также, в более общем плане, приемлем ли это подход к решению этой проблемы? Как это сделать?

С этой страницы: 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;
}