Jak wdrożyć aplikację Django:

Witam wszystkich. To mój pierwszy artykuł w <» DesdeLinux (z kilku, które mam w swoich wersjach roboczych xD), mam nadzieję, że się Wam przyda 😀

No cóż, w mojej nowej i obecnej pracy, w tej chwili trwa migracja kilku systemów do Django (jakie dziwne eh ?? xD) i jednym z moich zadań poza rozwojem jest ich wprowadzenie do produkcji, to jako dobry praktykant, ponieważ po raz pierwszy wprowadzałem aplikację do produkcji na prawdziwym serwerze: $ Zacząłem czytać oficjalną dokumentację każdego z wymaganych pakietów stosu (przede wszystkim Gunicorn i Supervisord) i widząc, że tutoriale W języku hiszpańskim nie były dla mnie zbyt jasne w niektórych aspektach, zdecydowałem się stworzyć mini przewodnik z krokami, które wykonałem, aby wprowadzić aplikację do produkcji, oparty na stosie Django, Gunicorn, Supervisord, Nginx i Postgresql.

W przypadku, gdy pracuję, serwery nadal działają na Debian Squeeze, ale przewodnik powinien być w pełni ważny dla innych dystrybucji ... więc przejdźmy od razu do sedna i zacznijmy:

Będę pracował jako superużytkownik. Przede wszystkim wymagane są następujące pakiety:

PIP -> Narzędzie do instalacji i zarządzania pakietami dla Pythona
aptitude install python-pip

nginx -> Serwer WWW (użyjemy go jako odwrotnego proxy i buforujemy statyczne pliki img, js, css) Instalujemy go za pomocą:
aptitude install nginx

Supervisord -> Aplikacja do zarządzania i monitorowania naszej aplikacji, chociaż jest używana do znacznie więcej. Instalujemy go za pomocą:
aptitude install supervisor

Wirtualne środowisko -> Pomaga nam stworzyć niestandardowe wirtualne środowisko wykonawcze dla naszej aplikacji. Instalujemy go za pomocą:
aptitude install python-virtualenv

pistolet -> serwer WWW dla Pythona (nie będziemy tego jeszcze instalować)

Zakładam, że powinni mieć już zainstalowany i skonfigurowany postgresql

psychopg2 -> Złącze Postgresql dla Pythona (też go jeszcze nie zainstalujemy)

Utwórz środowisko wirtualne z virtualenv:

Najpierw przejdziemy do katalogu roboczego, którego użyjemy do wprowadzenia do produkcji:
cd /var/www/

Następnie w tym katalogu stworzymy środowisko wirtualne:
virtualenv ENV-nombreApp

Przechodzimy do katalogu, który właśnie utworzyłem virtualenv
cd ENV-nombreAPP

Kopiujemy aplikację w tym katalogu i przystępujemy do aktywacji środowiska za pomocą:
source bin/activate

Monit powinien teraz wyglądać tak (ENV)usuario@host:

Dzięki temu wszystko, co robimy, będzie przechowywane w katalogu / var / www / ENV-appname / bez wpływu na pakiety systemowe

Teraz przechodzimy do katalogu aplikacji:
cd nombreApp

Przystępujemy do instalacji listy zależności aplikacji (jeśli to konieczne), w której są one określone w pliku wymagania.txt:
pip install -r requirements.txt

Możemy również instalować pakiety indywidualnie, na przykład, aby zainstalować złącze PostgreSQL:
pip install psycopg2

Instalacja i konfiguracja GUnicorn:

Aby go zainstalować, robimy to w ten sam sposób:
pip install gunicorn

Teraz mamy zamiar go skonfigurować, w tym celu utworzymy plik o nazwie gunicorn-deploy.py w katalogu głównym naszej aplikacji (chociaż nazwa może być dowolna) o następującej treści:

bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging

Konfiguracja nadzorcy:

Teraz ustawmy supervisord, w tym celu generujemy plik konfiguracyjny z

echo_supervisord_conf > /etc/supervisord.conf

Teraz edytujemy plik konfiguracyjny:
vim /etc/supervisord.conf

Odkomentujemy następujące wiersze, usuwając; (średnik):

[unix_http_server] file = / tmp / supervisor.sock [supervisord] logfile = / var / log / supervisord.log logfile_maxbytes = 50 MB logfile_backups = 10 loglevel = debug pidfile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverurl = unix: [program: appname] command = / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -appname / appname / gunicorn-deploy.py directory = / var / www / ENV-appname / appname / autostart = true autorestart = true user = username redirect_stderr = true stdout_logfile = / var / www / logs / appname / supervisord.log

Teraz stworzymy skrypt dla nadzorcy, który rozpocznie pracę z systemem, w tym celu utworzymy plik:
vim /etc/init.d/supervisord

I dodajemy następującą treść:

 # Automatyczne uruchamianie nadzorcy # # opis: Automatyczne uruchamianie supervisord # nazwa procesu: supervisord # plik pid: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 na początku) echo -n "Uruchamianie nadzorcy:" $ SUPERVISORD echo ;; stop) echo -n "Zatrzymywanie nadzorującego:" $ SUPERVISORCTL wyłączanie echa ;; restart) echo -n "Zatrzymywanie nadzorującego:" $ SUPERVISORCTL zamykanie wyłączania echo echo -n "Uruchamianie nadzorującego:" $ SUPERVISORD echo ;; to C

A teraz dajemy uprawnienia do wykonania pliku, aby mógł się uruchomić z systemem:
sudo chmod +x /etc/init.d/supervisord

Aktualizujemy linki, aby uruchomić usługę:
sudo update-rc.d supervisord defaults

Rozpoczynamy usługę:
sudo /etc/init.d/supervisord start

Konfigurowanie nginx:

Ten krok jest również dość prosty, utworzymy następujący plik konfiguracyjny nginx dla naszej aplikacji:

vim /etc/nginx/sites-enabled/nombreApp

Dodamy do Ciebie następującą treść

serwer {nasłuchuj 9001; # port, na którym nginx nazwa_serwera nasłuchuje www.domain.com; # lub 192.168.0.100, adres, do którego uzyskamy dostęp do access_log /var/log/nginx/Appname.access.log; # gdzie będziemy mieć lokalizację dziennika aplikacji / {# gdzie nginx zadzwoni podczas uzyskiwania dostępu do www.dominio.com/proxy_pass http://127.0.0.1:8001; proxy_set_header Host $ http_host; } location / static / {# gdzie nginx uzyska dostęp, gdy wejdziemy na www.dominio.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}

I ponownie uruchamiamy nginx:
service nginx restart

Konfigurowanie Django:

Zmodyfikujmy plik konfiguracyjny django:
vim nombreApp/settings.py

Szukamy linii, która mówi DEBUGUJ = Prawda i zmieniamy wartośćpozostała DEBUG = Fałsz

Dodajemy parametry DB:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # lub mysql, czy cokolwiek innego 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' używają: 'password DB', 'HOST': 'localhost', # lub ten, którego potrzebują 'PORT': '', # lub ten, którego używają}}

Szukamy linii ALLOWED_HOSTS = [] i dodajemy domenę lub adres, przez który uzyskamy dostęp, pozostawiając coś w rodzaju ALLOWED_HOSTS = [„www.domain.com”]

Konfigurujemy katalog dla plików statycznych, szukamy wiersza, który mówi STATIC_ROOT = ' ' i zmieniamy wartość, umieszczając bezwzględną ścieżkę, w której chcemy, aby były nasze pliki statyczne, w moim przypadku zostawiłem to mniej więcej tak STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Prawie skończyliśmy, wykonujemy następujące polecenie:
./manage.py collectstatic

Spowoduje to utworzenie folderu o nazwie „statyka w ścieżce, którą określamy w settings.py ", tutaj będą znajdować się wszystkie nasze pliki statyczne.

Na koniec ponownie uruchamiamy przełożonego, aby przyjąć nowe zmiany:
supervisorctl restart nombreApp

I to by było wszystko, w końcu to nie była prawda? wydawało mi się to proste 😀

Mam nadzieję, że Ci się przyda, pozdrawiam 😉

Dokumentacja GUnicorn

Dokumentacja nadzorcza


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   f3niX powiedział

    Rozumiem, że aplikacja Django nie powinna znajdować się w katalogu głównym folderu serwera WWW (/ var / www)? Ze względów bezpieczeństwa nie wiem, czy się mylę.

    Pozdrowienia.

    1.    urKh powiedział

      W porządku !!! To było coś, czego zupełnie nie zdawałem sobie sprawy, zaktualizuję wpis soon i jak tylko wrócę w poniedziałek wprowadzę zmiany w aplikacji xD
      dzięki

  2.   Rodrigo Bravo (goidor) powiedział

    Dobry poradnik dla brata Epale. Ostatnio też byłem w tym samym, ale w Debianie 7 musiałem mniej więcej szukać i czytać. Zalecam utworzenie wirtualnego środowiska virtualenv w domu użytkownika w ukrytym folderze.

    Pozdrowienia!

  3.   Serw Fenriza powiedział

    hahaha ctm Wczoraj dokumentuję Django, a ty już przemierzasz galaktykę 999999 Pozdrowienia panowie xD

  4.   daniel2ac , , , , , , , , , , ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, , powiedział

    Bardzo dobry artykuł =) zaledwie tydzień temu wdrożyłem moją aplikację django, ale zrobiłem to z uwsgi i nginx, czy wiesz, jaką przewagę ma gunicorn? Dużo o tym wspominałem.
    Miło widzieć, że django staje się bardzo popularne, prawda jest najlepszym frameworkiem, jaki widziałem =)

  5.   oskar powiedział

    Dla STATIC_ROOT to, co robię, to zdefiniowanie zmiennej globalnej. Coś takiego:

    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')

    Gdzie backend to aplikacja, którą stworzyłem. W ten sposób upewniam się, że tam, gdzie wdrażam projekt, ścieżka globalna jest taka sama.

  6.   sprytny powiedział

    Ciekawe, spróbuję w przyszłości.

    Swoją drogą, czy ktoś wie, jak włączyć akcenty i znaki inne niż ASCII w aplikacji django?

    Szukałem wszędzie, żadna z poniższych metod nie działa dla mnie:
    sys.setdefaultencoding ('utf-8') # in sites.py

    # - * - kodowanie: utf-8 - * - # w każdym pliku Pythona

    Edycja site.py i wstawienie utf-8 zamiast ascii ma działać, ale $ file models.py informuje mnie, że mój plik jest nadal ascii.

    Jakieś sugestie?

    1.    sprytny powiedział

      Zadziałało!!!!

  7.   anime230 powiedział

    bardzo dobry samouczek, ale czy mógłbyś zrobić jeden z sposobów przesyłania mojej aplikacji na serwer sieciowy, który jest już w produkcji
    dzięki