Tworzymy stronę „Under construction”

Pamiętacie animowane gify z początku Internetu? Kilkanaście lat temu najważniejszą rzeczą w procesie tworzenia strony było wrzucenie na serwer świecącego animowanego gifa, obowiązkowo z widokiem placu budowy i wielkim under construction. Potem wystarczyło już nigdy nie zaglądać na ten serwer i mieliśmy piękną stronę wiecznie w budowie (jak Świątynia Opatrzności Bożej).

W dobie blogów w 15 minut i silinków ala demotywatory za 50zł, o wrzuceniu tekstu „strona w budowie” nikt już nie myśli. Czasem jednak chcielibyśmy mieć możliwość wygodnego poinformowania użytkowników, że robimy migrację lub właśnie coś zmieniamy. Dziś szybki przepis jak to zrobić.

Potrzebne nam będą:

  • Nginx z Passengerem jako serwer http.
  • Capistrano jako narzędzie do deploymentu.
  • Railsowa aplikacja.
  • Strona z gifem under construction, może być też jakiś stylowy licznik, że wracamy za 7 dni.
  • Butelka piwa – zawsze się przyda.

Nasz plik z gifem nazwijmy maintenance_file.html, umieśćmy w katalogu public i dodajmy go do repozytorium.

public/maintance_file.html

Na serwerze znajdźmy plik konfiguracyjny nginxa. Prawdopodobnie znajduje się w katalogu /opt/nginx/conf/nginx.conf. Wewnątrz dyrektywy server dodajmy następujący wpis:

if (-f $document_root/maintenance.html) {
  rewrite ^(.*)$ /maintenance.html break;
}

Cały dyrektywa server powinien wyglądać wtedy podobnie do poniższego.

server {
    server_name www.foo.com;
    listen 80;
    root /webapps/foo/public;
    passenger_enabled on;
		
    if (-f $document_root/maintenance.html) {
        rewrite ^(.*)$ /maintenance.html break;
    }
}

Jeśli w katalogu public jest plik maintance.html to wtedy o cokolwiek nie poprosimy, to dostaniemy ten plik. Dlatego plik w naszym repozytorium nazywa się inaczej (maintence_file.html). Zostało teraz tylko tak przygotować capistrano, by przed restartem w naszym katalogu public pojawiał się plik maintance i znikał po jego zakończeniu.

before 'deploy:restart', 'deploy:disable_site'
after 'deploy:restart', 'deploy:enable_site'

namespace :deploy do
  desc "Enables site"
  task :enable_site, :roles => :app do
    run "rm -f #{current_path}/public/maintenance.html"
  end

  desc "Disables site"
  task :disable_site, :roles => :app do
    run "ln -nfs #{current_path}/public/assets/maintenance.html /
     #{current_path}maintenance_file.html"
  end
end

I to wszystko. Osobną kwestią, pozostaje, w którym momencie chcemy pokazywać użytkownikowi informację o niedostępności strony, ale cały mechanizm pozostaje bez zmian. Użytkownicy Appacha, mogą zastosować podobny mechanizm.

Byłbym zapomniał. Jak wszystko zadziała ładnie, to możemy wypić piwo.



Komentarze

  1. kazjote 12.11.2010

    Comment Arrow

    Dzięki za artykuł 🙂

    Jakiś pomysł jak zwrócić odpowiedni kod odpowiedzi 503 Service Unavailable?

    To byłoby informacją również dla wyszukiwarek, że nasza treść ze strony nagle nie zniknęła 🙂


  2. tjeden 12.11.2010

    Comment Arrow

    Żeby zwrócić 503, należy zastąpić naszą regułę następującą:

    error_page 503 @503;
    location @503 {
    rewrite ^(.*)$ /maintenance.html break;
    }

    if (-f $document_root/maintenance.html) {
    return 503;
    }




O autorze

Aleksander Dąbrowski

Od 2008 zawodowo programuje w Ruby i Railsach. Jest maniakiem prostych i eleganckich rozwiązań, nie boi się usuwania brzydkiego kodu. Uwielbia dzielić się wiedzą, a w wolnych chwilach naprawia samochody.