Страница обслуживания на nginx, лучшие практики

13

Я хочу настроить сервер так, чтобы он отображал страницу обслуживания, когда она существует. Я попробовал этот код и работает:

location / {
    try_files /maintenance.html $uri $uri/ @codeigniter;
}

Но я заметил, что ему будет предоставлен код состояния 200, и это может привести к путанице в поисковых системах. Я думаю, что лучшая практика будет возвращать код состояния 503. На Google я нахожу несколько соответствующих страниц об этом, как это . Тем не менее, они используют if для перенаправления и, согласно документации nginx, использование ifs небезопасно.

Есть ли способ сделать это без использования if? Безопасно ли использовать в этом случае?

Благодарю.

NeDark
источник

Ответы:

7

Я думаю, что лучшая практика будет возвращать код состояния 500.

Я думаю, что вы имеете в виду 503 вместо 500.

они используют ifдля перенаправления и, согласно документации nginx, использование ifs небезопасно.

Только returnна 100% безопасно внутри ifв locationконтексте.

Согласно документации nginx , вы можете указать код статуса HTTP в качестве последнего аргумента try_files. Я пробовал это, но это не сработало.

кванты
источник
21

Вот что я делаю.

            if (-f $document_root/maintenance.html) {
                    return 503;
            }
            error_page 503 @maintenance;
            location @maintenance {
                    rewrite ^(.*)$ /maintenance.html break;
            }

Если файл там, он покажет страницу обслуживания. После удаления файла вы вернетесь к нормальной жизни.

Майк
источник
1
Да, это тот же код, который указан в ссылке в вопросе. Я на самом деле спрашиваю, безопасно ли использовать ifs в этом случае, поскольку его не следует использовать в соответствии с документацией .
NeDark
1
И та же самая документация: In some cases it's also possible to move ifs to server level (where it's safe as only other rewrite module directives are allowed within it).страница ошибки обслуживания, как показал Майк, обычно устанавливается в контексте сервера {}.
Regan
1
Я сделал то же самое, за исключением того, что просто «вернул 503» без проверки существования файла. Таким образом, я могу просто включить / отключить сайт (используя разметку Debian «sites-available» / «sites-enabled») с помощью символической ссылки и включить страницу обслуживания.
Асфанд Кази
1
Похоже, это будет ударом по производительности: NGINX нужно будет проверять наличие файла для каждого запроса ...
Marc
1
Марк, это не так, поскольку общедоступные файлы хранятся в кеше файловой системы, который находится в памяти.
Майк