2011-06-21 13 views
5

Mam nową witrynę zbudowaną na Django i Pythonie 2.6, które wdrożyłem w chmurze (zgodność z buzzword I instancja Amazon micro EC2 jest darmowa!).
Oto moje szczegółowe notatki: https://docs.google.com/document/d/1qcZ_SqxNcFlGKNyp-CXqcFxXXsKs26Avv3mytXGCedA/edit?hl=en_USBezproblemowa instalacja Django na pojedynczym serwerze

Ponieważ jest to nowa strona (i chce grać w najnowsze i najlepsze) użyłem Nginx i Gunicorn na szczycie Inspektora.
Wszystkie oprogramowanie instalowane z bagażnika przy użyciu YUM/easy_install.
Moja baza danych to Sqlite (na razie - nie jestem pewien, gdzie pójść dalej, ale to nie jest pytanie). Również na liście zadań: virtualenv + pip.
Jak dotąd tak dobrze.
Mój kod w SVN. Napisałem prosty plik fabfile do wdrożenia - sprawdza najnowszy kod i restartuje Gunicorn przez Supervisora. Podłączyłem moją nazwę DNS do Elastic IP.
Działa.

Moje pytanie brzmi: jak zaktualizować witrynę bez zakłóceń w działaniu usługi? Użytkownicy witryny otrzymują 404s/500s, gdy uruchamiam mój mały skrypt aktualizacji.

Czy można to zrobić bez dodawania kolejnego serwera (cena jest kluczowa)?

Chciałbym mieć system pomostowy (na innym porcie?) I płynne przełączanie między etapami i produkcją. Na tym samym (bezpłatnym) serwerze. Via Fabric.
Jak to zrobić? Czy to samo Nginx działa na obu stronach? Czy mogę ulepszyć etapy bez ranienia produkcji? Jak wyglądałaby fabfile? Jak wyglądałoby drzewo katalogów?

Dzięki!

Tal.

pokrewne:

+0

Dla każdego, kto czyta "EC2 Micro jest wolny": tak naprawdę nie jest (przynajmniej już nie jest). Jest on bezpłatny przez pierwsze 750 godzin, co stanowi w przybliżeniu 20 USD. kasuj inne [Oferty ASW bezpłatne] (http://aws.amazon.com/free/) .. – Stefano

Odpowiedz

3

Nginx umożliwia skonfigurowanie przełączania awaryjnego dla odwrotnych serwerów proxy, w których można umieścić jedną instancję Gunicorn jako podstawową i dopóki działa ta wersja, nigdy nie będzie patrzyła na przełączanie awaryjne.

Po skonfigurowaniu witryny tak, aby nowa wersja znajdowała się w instancji przełączania awaryjnego, wystarczy napisać plik fab, aby zaktualizować wystąpienie niepowodzenia nową wersją witryny, a następnie, gdy jest to gotowe, wyłączyć instancję podstawową. Nginx bezproblemowo przełączy się na drugą instancję i uruchomi nową wersję bez przestojów.

Następnie można zaktualizować wersję podstawową, a następnie włączyć ją ponownie, a urządzenie główne jest teraz aktywne. W tym momencie można na wszelki wypadek uruchomić instancję przełączania awaryjnego lub ją wyłączyć.

Kilka rzeczy do rozważenia. Musisz być ostrożny z bazami danych, jeśli używasz sqllite upewnij się, że obie instancje gunicorn mogą uzyskać dostęp do pliku sqllite.

Jeśli masz normalną bazę danych, jest to mniejszy problem, wystarczy upewnić się, że zastosujesz wszystkie migracje bazy danych, których potrzebuje nowa wersja, zanim się do niej przełączysz.

Jeśli są to zmiany kompatybilne wstecznie, to nie jest wielka sprawa. Jeśli nie są kompatybilne wstecz, to bądź ostrożny, możesz złamać starą wersję strony, zanim przejdziesz do nowej wersji.

Aby było łatwiej, uruchomiłem wersje w różnych środowiskach wirtualnych.

Jeśli używasz nadzorcy do kontrolowania gunicorn, możesz użyć poleceń superwizycji do ponownego załadowania/ponownego uruchomienia, którekolwiek wystąpienie chcesz wdrożyć bez wpływu na inne.

nadzieję, że pomoże

Oto przykład i konfiguracji nginx (nie pełny plik konfiguracyjny, usunęła nieistotnych części)

Zakłada podstawowym instancji gunicorn działa na porcie 9005, a druga jest działa na porcie 9006

upstream service-backend { 
    server localhost:9005;  # primary 
    server localhost:9006 backup; # only used when primary is down 
} 

server { 
    listen 80; 
    root /opt/htdocs; 
    server_name localhost; 

    access_log /var/logs/nginx/access.log; 
    error_log /var/logs/nginx/error.log; 

    location/{ 
     proxy_pass http://service-backend; 
    } 
} 
+0

Jak skonfigurować Nginx, aby to zrobić? Oto moja konfiguracja Nginx: http://pastebin.com/xdYxPeS2 Czy mogę pozwolić, aby oba Gunicorns pracowały równolegle, słuchając różnych portów (stopniowanie/produkcja) i nadal przełączały się zgodnie z opisem? –

+0

dodano konfigurację przykładowego nginx. Tak, możesz mieć je oba działające w tym samym czasie na różnych portach. Najlepszym sposobem, aby to zrobić, jest supervisor lub inny menedżer procesów. –

+0

To pozwala mi mieć 2 gunicory, każda z innym SW i Nginx zarządzają przełączaniem, ponieważ zabijam działającego Gunicorn z Supervisorctl. Ale jak mogę przetestować serwer zapasowy z uruchomionym nowym oprogramowaniem? Nie jest połączony ze światem zewnętrznym. Czy nie jest jedynym portem Nginx, który nasłuchuje w tej konfiguracji 80? –

1

Brzmi jak trzeba dowiedzieć się, jak powiedzieć gunicorn do gracefully restart. Wygląda na to, że wszystko, co musisz zrobić, to wysłać HUP do procesu gunicorn kiedy powiadomić, aby ponownie załadować aplikację. Jak opisano w linku na temat, gunicorn docs wyjaśnić, jak to zrobić.

+0

Czy Gunicorn "z wdziękiem" z wdziękiem rozpoczyna się od nowa? Czy wszyscy użytkownicy witryny działają tak, jakby nic się nie wydarzyło? Jak to działa, gdy Nginx wysyła zadania do portu Gunicorn i nikt nie słucha (przez krótką chwilę)? Co więcej, nie dotyczy to aktualizacji kodu źródłowego - w jaki sposób nowa instancja Gunicorn wie o uruchomieniu nowego kodu? –

+0

Zwykle "pełne wdzięku ponowne uruchamianie" oznacza nie tracenie żadnych żądań podczas ponownego uruchamiania. Czytałem trochę materiału o jednorożcu, a gunicon jest jego portem. Sądzę, że żądania, które są wysyłane podczas wysyłania SIGHUP, zakończą przetwarzanie, gdy twój nowy kod zostanie odwirowany. Jednorożec został zaprojektowany tak, aby procesy robocze były wyciągane z kolejki żądań tylko wtedy, gdy pracownik jest "gotowy". Ten post na blogu wspomina o tym: https://github.com/blog/517-unicorn ... ten link opisuje również pełną wdzięku funkcję ponownego uruchamiania: http://tomash.wrug.eu/2010/01/30/the- awesomeness-of-unicorn.html – pcting

+0

Kolejna rzecz, którą chcę dodać, jest w pewien sposób powiązana z reakcją Kena ... Wykonałbym toczące się ponowne uruchamianie na wszystkich serwerach Gunicorn, aby twoje serwery Gunicorn nie zostały przeciążone oczekującymi żądaniami i ładowaniem nowi pracownicy. – pcting

Powiązane problemy