Chaussette i Circus do zarządzania i serwowania aplikacji WSGI i ich usług

Produkcyjnie aplikacje webowe napisane z pomocą jakiegoś Pythonowego frameworka działają dzięki gunicornowi, czy uwsgi. Dostępne są też inne rozwiązania, niektóre takie jak chaussette i circus wyglądają na całkiem ciekawe i warte uwagi. Chaussette to skarpetka, a raczej serwer WSGI zdolny serwować nasze aplikacje WSGI. Circus to program do kontrolowania i monitorowania procesów oraz gniazd (socketów). Może zarządzać procesem, czy gniazdem chaussette, celery i wieloma innymi. Oba projekty są ze sobą niejako skojarzone.

Chaussette

chaussette instalujemy za pomocą pip i możemy odpalić np. naszą aplikację Django poleceniem typu:

chaussette moja_aplikacja.wsgi.application

W przypadku Django brany jest plik wsgi.py. Należy upewnić się czy jest tam podany poprawny plik settings (gdy np. mamy różne pliki konfiguracyjne zależnie od produkcji, czy środowiska deweloperskiego).

Samo chaussette wiele nie daje. Można połączyć użycie tego serwera z supervisorem czy circusem - tak by te aplikacje monitorowały i uruchamiały serwer chaussette.

Circus

Circus to monitor procesów i gniazd, podobny do np. supervisora, ale prezentujący inne podejście, o którym za chwilę. Instalujemy go poprzez pip, po czym możemy przystąpić do tworzenia pliku konfiguracji, w którym zawarta będzie konfiguracja samego circusa jak i wszystkich usług jakimi ma zarządzać.

Circus pozwala na lepsze rozłożenie konfiguracji poszczególnych usług. Daje funkcjonalności supervisora, ale pozwala też skonfigurować różne usługi na tym samym poziomie - dodanie workera celery, serwera redisa czy innej podobnej usługi sprowadzi się do dodania odpowiedniego wpisu w konfiguracji circusa. Circus nie obsługuje żądań nadsyłanych przez serwer taki jak Nginx, a jedynie wiąże gniazda ze sobą zbijając serwer WSGI do tego samego poziomu co pozostałe usługi danej aplikacji. Gdy mamy serwer z wieloma aplikacjami pozwala to wystawiać jednego circus do systemowego nginxa, bez konieczności np. modyfikowania konfiguracji systemowego supervisora (na dużą skalę, zawsze może opiekować się poszczególnymi circusami).

Szybki przykład - konfiguracja dla Django

Po zainstalowaniu chausette wykonanie chaussette moja_aplikacja.wsgi:application powinno odpalić serwer WSGI. Jeżeli sypią się wyjątki to pewnie musimy poprawić coś w pliku wsgi.py. Gdy to działa możemy przejść do circus.ini, gdzie zawrzemy konfigurację circusa odpalającego chausette:

Zaczynamy od konfiguracji circusa.
[circus]
endpoint = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
stats_endpoint = tcp://127.0.0.1:5557

[watcher:web]
cmd = /ścieżka/do/virtualenv_aplikacji/bin/chaussette --fd $(circus.sockets.web) moja_aplikacja.wsgi:application
use_sockets = True
numprocesses = 2

[socket:web]
host = 0.0.0.0
port = 8000

Na początku mamy konfigurację circusa (wziętą z jednego z przykładów), a później danej usługi (web po dwukropku to ustalona przez nas nazwa usługi). Opis parametrów dla bloków watcher i socket dostępny jest w dokumentacji. Tego może być sporo (a ja nie jestem specjalistą o konfiguracji serwerów ;)) w zależności od potrzeb.

Mając plik konfiguracyjny możemy uruchomić circusa za pomocą polecenia typu:

circusd circus.conf

Gdy circus działa aplikacja powinna być dostępna poprzez nginxa o ile ma on konfigurację tego typu:

server {
  listen  80;

  location /static/ {
      alias /ścieżka/do/statyki/;
  }
  location /media/ {
      alias /ścieżka/do/mediów/;
  }

  location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://127.0.0.1:8000;
  }
}

Gdzie najważniejsza jest ostatnia sekcja dla location /. proxy_pass musi być ustawione na IP/port, na którym nasłuchuje chausette skonfigurowane w circuse (blok socket:web) - w tym przypadku port 8000. Całość zamiast po TCP może być konfigurowana po gniazdach wystawianych w określonch ścieżkach.

Dodatki

circusctl to konsola dla działającego circusa. Pozwala sprawdzać i np. restartować procesy zarządzane przez tą aplikację. Podobnie jak w supervisorze. Po np. wrzuceniu nowej wersji aplikacji na serwer można zrestartować całego circusa:

circusctl reloadconfig --waiting
circusctl reload --waiting

Do monitorowania możemy użyć też circus-top, czy webowej aplikacji circus-web.

Mam nadzieję że powyższe szybkie zaprezentowanie circusa i chaussette zachęci Cię do zapoznania z tymi aplikacjami i wykorzystania ich na serwerach.

RkBlog

Django, 18 August 2014

Comment article
Comment article RkBlog main page Search RSS Contact