Hur man distribuerar en Django-applikation:

Vad sägs om hälsningar alla, detta är min första artikel i <» DesdeLinux (de varios que tengo en mis borradores xD), espero les sea de utilidad 😀

Tja, i mitt nya och nuvarande jobb, för tillfället genomförs migrering av flera system till Django (hur konstigt va ?? xD) och en av mina uppgifter, förutom utveckling, är att sätta dessa i produktion, så hur bra lärling, eftersom det var första gången jag satte en applikation i produktion på en riktig server: $ Jag började läsa det officiella dokumentet för alla paket som krävs i stacken (Gunicorn och Supervisord mer än alla), och såg att självstudierna i Spanska de var inte så tydliga för mig i vissa aspekter, jag bestämde mig för att skapa en miniguide med de steg som jag följde för att sätta applikationen i produktion, baserad på stacken Django, Gunicorn, Supervisord, Nginx och Postgresql.

I det fall jag arbetar körs servrarna fortfarande på Debian Squeeze, men guiden bör vara helt giltig för andra distributioner ... så låt oss komma direkt till saken och komma igång:

Jag kommer att arbeta som superanvändare. Först och främst krävs följande paket:

PIP -> Verktyg för att installera och hantera paket för Python
aptitude install python-pip

nginx -> Webbserver (vi använder den som en omvänd proxy och för att cache de statiska filerna 'img, js, css') Vi installerar den med:
aptitude install nginx

Supervisord -> Applikation för att hantera och övervaka vår applikation, även om den används för mycket mer. Vi installerar det med:
aptitude install supervisor

virtualenv -> Det hjälper oss att skapa en anpassad virtuell exekveringsmiljö för vår applikation. Vi installerar det med:
aptitude install python-virtualenv

gunicorn -> webbserver för python (vi installerar inte detta ännu)

Jag antar att de redan borde ha installerat och konfigurerat postgresql

psychopg2 -> Postgresql-kontakt för python (vi installerar inte heller än)

Skapa virtuell miljö med virtualenv:

Först ska vi flytta till den arbetskatalog som vi kommer att använda för att sätta i produktion:
cd /var/www/

Sedan skapar vi den virtuella miljön i den här katalogen:
virtualenv ENV-nombreApp

Vi flyttar till katalogen som jag just skapade virtualenv
cd ENV-nombreAPP

Vi kopierar applikationen i den här katalogen och nu fortsätter vi med att aktivera miljön med:
source bin/activate

Prompten ska nu se ut (ENV)usuario@host:

Detta gör att allt vi gör lagras i katalogen / var / www / ENV-appname / utan att påverka systempaket

Nu går vi till applikationskatalogen:
cd nombreApp

Vi fortsätter med att installera listan över applikationsberoenden (om nödvändigt), där de anges i filen requirements.txt:
pip install -r requirements.txt

Vi kan också installera paket individuellt, till exempel för att installera anslutningen till postgresql:
pip install psycopg2

GUnicorn installation och konfiguration:

För att installera det gör vi det på samma sätt:
pip install gunicorn

Nu ska vi konfigurera det, för detta ska vi skapa en fil som heter gunicorn-deploy.py i roten till vår ansökan (även om namnet kan vara vad som helst) med följande innehåll:

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

Övervakningskonfiguration:

Låt oss nu ställa in supervisord, för det genererar vi konfigurationsfilen med

echo_supervisord_conf > /etc/supervisord.conf

Nu redigerar vi konfigurationsfilen:
vim /etc/supervisord.conf

Och vi kommenterar följande rader genom att ta bort; (semikolon):

[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 = falska minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverurl = unix: [program: appnamn] 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

Nu skapar vi skriptet för övervakning för att börja med systemet, för det skapar vi filen:
vim /etc/init.d/supervisord

Och vi lägger till följande innehåll:

 # Supervisord auto-start # # description: Auto-starts supervisord # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 i start) echo -n "Startar överordnad:" $ SUPERVISORD echo ;; stop) echo -n "Stoppar övervakaren:" $ SUPERVISORCTL avstängningseko ;; starta om) echo -n "Stoppar övervakaren:" $ SUPERVISORCTL avstängning echo echo -n "Startar övervakaren:" $ SUPERVISORD echo ;; att C

Och nu ger vi filen körbehörigheter så att den kan börja med systemet:
sudo chmod +x /etc/init.d/supervisord

Vi uppdaterar länkarna för att starta tjänsten:
sudo update-rc.d supervisord defaults

Vi startar tjänsten:
sudo /etc/init.d/supervisord start

Ställa in nginx:

Detta steg är också ganska enkelt, vi skapar följande konfigurationsfil av nginx för vår ansökan:

vim /etc/nginx/sites-enabled/nombreApp

Och vi kommer att lägga till följande innehåll till dig

server {lyssna 9001; # port där de vill att nginx server_name ska lyssna på www.domain.com; # eller 192.168.0.100, adress att vi kommer åt access_log /var/log/nginx/Appname.access.log; # där vi kommer att ha applikationsloggplatsen / {# där nginx kommer att ringa vid åtkomst till www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Värd $ http_host; } plats / statisk / {# där nginx kommer åt när vi anger www.domain.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}

Och vi startar om nginx:
service nginx restart

Ställa in Django:

Låt oss ändra django-konfigurationsfilen:
vim nombreApp/settings.py

Vi letar efter linjen som säger DEBUG = Sant och vi ändrar värdet, återstående DEBUG = Falskt

Vi lägger till DB-parametrarna:

DATABASES = {'default': {'MOTOR': 'django.db.backends.postgresql_psycopg2', # eller mysql, eller vad som helst 'NAME': 'DBName', 'USER': 'DBUser', 'LÖSENORD' använder: 'lösenord DB', 'HOST': 'localhost', # eller det de behöver 'PORT': '', # eller det de använder}}

Vi letar efter linjen ALLOWED_HOSTS = [] och vi lägger till domänen eller adressen som vi kommer åt genom att lämna något liknande ALLOWED_HOSTS = ['www.domän.com']

Vi konfigurerar katalogen för de statiska filerna, vi letar efter raden som säger STATIC_ROOT = ' ' och vi ändrar värdet, placerar den absoluta sökvägen där vi vill att våra statiska filer ska vara, i mitt fall lämnade jag det mer eller mindre så här STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Nästan färdigt utför vi följande kommando:
./manage.py collectstatic

Detta skapar en mapp med namnet 'statik i den sökväg som vi anger i settings.py ', det är där alla våra statiska filer kommer att vara.

Och slutligen startar vi om handledaren för att ta de nya ändringarna:
supervisorctl restart nombreApp

Och det skulle vara allt, i slutändan var det inte så mycket sant? det verkade enkelt för mig 😀

Jag hoppas att det är användbart för dig, hälsningar 😉

GUnicorn-dokumentation

Supervisordokumentation


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   f3niX sade

    Jag förstår att Django-appen inte ska placeras i roten till webbservermappen (/ var / www)? Av säkerhetsskäl vet jag inte om jag har fel.

    Hälsningar.

    1.    urKh sade

      Okej !!! Det var något jag inte kände till, jag kommer att uppdatera posten 😛 och så snart jag återvänder på måndag kommer jag att göra ändringar i xD-applikationen
      tack

  2.   Rodrigo Bravo (goidor) sade

    Epale bror bra handledning. Nyligen var jag också i samma men i Debian 7 var jag tvungen att söka och läsa mer eller mindre. Jag rekommenderar att du skapar den virtuella virtualmiljön i användarens hem i en dold mapp.

    Hälsningar!

  3.   Servera Fenriz sade

    hahaha ctm Jag igår dokumenterade Django och du går redan igenom galaxen 999999 Hälsningar män xD

  4.   daniel2ac sade

    Mycket bra artikel =) för bara en vecka sedan distribuerade jag min django-app men jag gjorde det med uwsgi och nginx, vet du vilken fördel gunicorn har? Jag har sett det nämnts mycket.
    Det är trevligt att se att django blir mycket populär, sanningen är det bästa ramverk jag har sett =)

  5.   ozkar sade

    För STATIC_ROOT definierar jag en global variabel. Något som det här:

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

    Där backend är en app som jag skapade. På det här sättet ser jag till att den globala vägen är densamma där jag distribuerar projektet.

  6.   sgmart sade

    Intressant, jag kommer att försöka i framtiden.

    Förresten, vet någon hur man aktiverar accenter och icke-ascii-karaktärer i en django-applikation?

    Jag har tittat överallt, ingen av följande metoder fungerar för mig:
    sys.setdefaultencoding ('utf-8') # i sites.py

    # - * - kodning: utf-8 - * - # i varje pythonfil

    Att redigera site.py och sätta utf-8 istället för ascii ska fungera, men $ file models.py informerar mig om att min fil fortfarande är en ascii.

    Några förslag?

    1.    sgmart sade

      Det fungerade!!!!

  7.   anime 230 sade

    mycket bra handledning men du kan göra något av hur jag laddar upp min app på en webbserver som redan är i produktion
    Tack