Strona konserwacji nginx, najlepsze praktyki

13

Chcę skonfigurować serwer tak, aby wyświetlał stronę konserwacji, jeśli istnieje. Wypróbowałem ten kod i działa:

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

Zauważyłem jednak, że zostanie podany z kodem stanu 200 i może powodować zamieszanie w wyszukiwarkach. Myślę, że najlepszą praktyką byłoby zwrócenie kodu stanu 503. W Google znajduję kilka odpowiednich stron na ten temat, takich jak ten . Używają jednak if, aby dokonać przekierowania i zgodnie z dokumentacją nginx korzystanie z ifs nie jest bezpieczne.

Czy istnieje sposób na zrobienie tego bez użycia if? Czy w takim przypadku można bezpiecznie używać?

Dzięki.

NeDark
źródło

Odpowiedzi:

7

Myślę, że najlepszą praktyką byłoby zwrócenie kodu statusu 500.

Myślę, że masz na myśli 503 zamiast 500.

używają ifdo przekierowania i zgodnie z dokumentacją nginx korzystanie z ifs nie jest bezpieczne.

Nie tylko returnjest w 100% bezpieczny wewnątrz ifw locationkontekście.

Zgodnie z dokumentacją nginx , możesz podać kod statusu HTTP jako ostatni argument try_files. Próbowałem tego, ale to nie zadziałało.

kwanty
źródło
21

Oto co robię.

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

Jeśli plik tam jest, wyświetli się strona konserwacji. Po usunięciu pliku wrócisz do normy.

Mikrofon
źródło
2
Tak, to ten sam kod, który znajduje się w linku w pytaniu. Właściwie pytam, czy w tym przypadku można bezpiecznie używać ifs, ponieważ nie należy go używać zgodnie z dokumentacją .
NeDark,
1
I ta sama dokumentacja: 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).Strona błędu_błędu, jak pokazał Mike, jest zwykle ustawiana w kontekście serwera {}.
Regan
1
Zrobiłem to samo, z wyjątkiem tego, że wykonałem „return 503” bez sprawdzania istnienia pliku. W ten sposób mogę po prostu włączyć / wyłączyć stronę (używając układu Debiana „dostępne strony” / „dostępne strony”) poprzez symlinkowanie i włączenie strony konserwacji.
Asfand Qazi
2
Wygląda na to, że byłby hitem wydajności: NGINX będzie musiał sprawdzić istnienie pliku dla każdego żądania ...
Marc
2
Marc, nie jest tak, ponieważ powszechnie używane pliki są przechowywane w pamięci podręcznej systemu plików, która jest w pamięci.
Mike