Å distribuere Django til et produksjonsmiljø for første gang kan være en skremmende oppgave. Ofte vil utviklere starte en Linux-forekomst på skyen for deres produksjonsmiljø.
I denne opplæringen viser vi deg hvordan du starter Django i produksjon ved hjelp av en fersk Ubuntu-forekomst.
Vi antar at all redigering er gjort på serveren, og at du kjører kommandoene som root.
For denne opplæringen bruker vi Ubuntu 18.04.2 LTS
Opprette en bruker for prosjektet
Vi oppretter en ny bruker, django, for å kjøre applikasjonen vår. Dette gir en liten sikkerhetsfordel.
Slik oppretter du den nye brukeren:
useradd -m djangoDe -m flagg
oppretter en ny hjemmekatalog: / hjem / django.
Sette opp Python-miljøet
Første ting først: oppdater pakkelistene dine med apt-get oppdatering
Ubuntu 18.04 leveres med Python 3.6, men den leveres ikke med pip, som du må installere avhengighetene dine.
apt-get installer python3-pipNå som vi har pip, la oss lage et virtuelt miljø. Virtuelle miljøer hjelper til med å unngå konflikter med Python-pakker som brukes av Linux.
pip3 installer virtualenvcd / home / django
virtualenv env
Nå har du opprettet en virtuell Python 3.6 miljø i / hjem / django / env
mappe som kan aktiveres med følgende kommando: Nå som vi har pip, la oss lage et virtuelt miljø. Virtuelle miljøer hjelper til med å unngå konflikter med Python-pakker som brukes av Linux.
Sette opp Django-prosjektet
For denne opplæringen oppretter vi et midlertidig Django-prosjekt. Hvis du distribuerer din egen kode, må du laste den opp til serveren i stedet. Vi opererer i hjemmekatalogen / home / django.Sette opp Django-prosjektet
La oss lage Django-prosjektet:
cd / home / djangokilde env / bin / aktivere
pip installere django
django-admin startprosjektopplæring
Bekreft at ting fungerer ved å kjøre:
cd tutorialpython administrere.py runserver 0.0.0.0:80
Vår Ubuntu-forekomst kjører 178.128.229.34 så vi kobler til http: // 178.128.229.34.Bekreft at ting fungerer ved å kjøre:
Du vil sannsynligvis se noe sånt som dette:
For å fikse dette, redigerer vi / home / django / tutorial / tutorial / settings.py
. Finne ALLOWED_HOSTS = []
og sett den til:
178.128.229.34 '# erstatt dette med serverens IP-adresse
eller domenenavnet du bruker for å koble til
]
La oss nå gå tilbake til http: // 178.128.229.34:
Flott! Vi er online!
Sette opp PostgreSQL, databasen
Som standard bruker Django en SQLite3-database. Dessverre tillater ikke SQLite3 samtidige skrivinger. Hvis nettstedet ditt bare har én bruker som redigerer data, og resten av de besøkende bare leser sider, kan dette være aktuelt. Men hvis du har flere personer som redigerer data samtidig, vil du sannsynligvis bruke en annen backend.
Vanlige valg er PostgreSQL og Mysql. Vi går med PostgreSQL for denne opplæringen.
Start med å installere PostgreSQL:
apt-get install postgresqlStart deretter psql, et databaskall. Som standard er det bare postgres-brukeren som kan koble til databasen, så vi må først godkjenne som brukeren:
su - postgrespsql
Deretter trenger vi en database og en bruker for å få tilgang til den databasen:
lage databaseopplæring;lage brukeropplæringsbruker med kryptert passord 'opplæringspassord';
gi alle rettigheter i opplæringen til databasen til tutorial_user;
Skriv nå exit eller trykk Ctrl-D to ganger: en gang for å avslutte psql, og en gang for å logge av skallet til postgresuseren.
Flott! Nå har vi satt opp vår database og bruker. La oss bekrefte at vi kan logge på databasen vår.
Vi prøver å åpne et databaskall, denne gangen logger vi oss på databasen vi opprettet med brukeren vi opprettet:
psql -Ututorial_user -veiledning -h127.0.0.1 -WSkriv inn passordet vi opprettet ved ledeteksten: tutorial_password.
Hvis du ser et databaskall, har du lykkes. Hvis du ser noen feil, må du gå tilbake og finne ut hva som er galt.
Koble Django til databasen
For å få Django koblet til databasen, må vi først installere Python PostgreSQL-adapteren:
pip installer psycopg2-binærLa oss åpne oss / home / django / tutorial / tutorial / settings.py
og konfigurer tilkoblingen.
Finn din nåværende databaseforbindelse; hvis du ikke endret det, kan det se ut slik:
DATABASER ='standard':
'MOTOR': 'django.db.backends.sqlite3 ',
'NAVN': os.sti.bli med (BASE_DIR, 'db.sqlite3 '),
For å koble til PostgreSQL erstatter vi den med følgende:
DATABASER ='standard':
'MOTOR': 'django.db.backends.postgresql_psycopg2 ',
'NAME': 'tutorial',
'USER': 'tutorial_user',
'PASSWORD': 'tutorial_password',
'VERT': '127.0.0.1',
'PORT': '5432',
La oss teste forbindelsen:
cd / home / django / tutorialpython administrere.py runserver 0.0.0.0:80
Du bør igjen kunne besøke nettstedet ditt (for oss på http: // 178.128.229.34 /, men erstatt det med IP eller vertsnavn).
Hvis alt er bra, kan vi fortsette.
Sette opp nginx, webserveren
Når du løper python administrere.py runserver
, du bruker Djangos utviklingsserver. Dette er flott for lokal utvikling, men som med SQLite3, er det ikke veldig egnet for produksjon.
Vanlige valg for produksjonsservere er nginx og Apache. For denne opplæringen bruker vi nginx.
Installer nginx ved å bruke følgende:
apt-get install nginxNå, hvis alt har fungert bra, bør nginx kjøre på port 80. Gå videre og sjekk ut nettstedet ditt; du bør se:
Flott, så nginx er i gang! Deretter må vi konfigurere den til å kommunisere med Django. Åpne opp nginx-konfigurasjonsfilen, lokalisert på / etc / nginx / sites-available / default. La oss erstatte filen med følgende:
oppstrøms djangoserver 127.0.0.1: 8000;
server
hør 80;
plassering /
try_files $ uri @send_to_django;
location @send_to_django
proxy_set_header Vert $ http_host;
proxy_redirect av;
proxy_pass http: // django;
Test konfigurasjonsfilen ved å kjøre nginx -t. Hvis alt er ok, kan vi laste inn på nytt ved å kjøre nginx -s reload.
Nå, hvis du besøker nettstedet ditt, vil du se følgende:
Når du ser dette, betyr det at nginx ikke klarte å overføre forespørselen til oppstrømsprosessen. For øyeblikket er det fordi det prøver å overføre forespørselen til 127.0.0.1: 8000, men det er ingen prosesslytting på den adressen.
La oss starte Django-utviklingsserveren og prøve igjen:
cd / home / django / tutorialpython administrere.py runserver 127.0.0.1: 8000
og besøk igjen nettstedet ditt. Du bør se Django-applikasjonen din.
Montering av Django på Gunicorn
Husk at vi ikke vil bruke utviklingsserveren vår til Django i produksjonen. I stedet bruker vi en Web Server Gateway Interface (WSGI) -server til å kjøre Django. Nginx vil sende forespørselen til WSGI-serveren, som kjører Django.
Vanlige valg for en WSGI-server er Gunicorn og uWSGI. For denne opplæringen bruker vi Gunicorn.
La oss installere Gunicorn:
pip installere gunicornDeretter kan vi starte gunicorn som følger:
cd / home / django / tutorialgunicorn tutorial.wsgi
Nå skal du kunne besøke nettstedet ditt og se at applikasjonen kjører ordentlig.
Kjører Gunicorn som en tjeneste
Det er noen problemer med å kjøre gunicorn som dette:
- Hvis vi lukker SSH-økten, stopper gunicorn-prosessen.
- Hvis serveren starter på nytt, starter ikke gunicorn-prosessen.
- Prosessen kjører som rot. Hvis hackere finner en utnyttelse i appens kode, vil de kunne kjøre kommandoer som root. Vi ønsker ikke dette; men det er derfor vi opprettet djangouseren!
For å løse disse problemene skal vi kjøre Gunicorn som en systemd-tjeneste.
cd / home / djangomkdir bin
cd / home / django / bin
berør startserver.sh
I startserver.sh:
cd / home / djangokilde env / bin / aktivere
cd tutorial
gunicorn tutorial.wsgi
Nå kan du teste skriptet:
cd / home / django / binbash start-server.sh
# besøk nettstedet ditt, det skal kjøre
Nå oppretter vi systemtjenesten for Gunicorn. Opprett / etc / systemd / system / gunicorn.serviceas følger:
[Enhet]Beskrivelse = Gunicorn
Etter = nettverk.mål
[Service]
Type = enkel
Bruker = django
ExecStart = / home / django / bin / start-server.sh
Start på nytt = på feil
[Installere]
WantedBy = flerbruker.mål
La oss nå aktivere tjenesten og starte den
systemctl aktivere gunicornsystemctl start gunicorn
Du bør kunne se nettstedet ditt for øyeblikket.
Vi kan slå av gunicorn som følger:
systemctl stopp gunicornOg du bør se en 502 Bad Gateway.
Til slutt, la oss sjekke oppstartssyklusen:
systemctl start gunicornstarte på nytt nå
Når maskinen kommer tilbake på nettet, bør du se at nettstedet ditt er oppe.
Statiske filer
Hvis du besøker Django adminpanel på nettstedet ditt på / admin / (for oss er det http: // 178.128.229.34 / admin /), vil du merke at statiske filer ikke lastes inn ordentlig.
Vi må lage en ny mappe for statiske filer:
cd / home / djangomkdir statisk
Deretter forteller vi Django at det er der den skal plassere de statiske filene ved å redigere / home / django / tutorial / tutorial / settings.py, og legger til:
STATIC_ROOT = '/ hjem / django / statisk /'Nå kan vi samle de statiske filene:
cd / home / djangokilde env / bin / aktivere
cd tutorial
python administrere.py collectstatic
Til slutt må vi fortelle nginx å betjene de statiske filene.
La oss åpne / etc / nginx / sites-available / default og legge til følgende rett over din plassering / blokk:
plassering / statisk /rot / hjem / django;
try_files $ uri = 404;
Hele filen skal nå se slik ut:
oppstrøms djangoserver 127.0.0.1: 8000;
server
hør 80;
plassering / statisk /
rot / hjem / django;
try_files $ uri = 404;
plassering /
try_files $ uri @send_to_django;
location @send_to_django
proxy_set_header Vert $ http_host;
proxy_redirect av;
proxy_pass http: // django;
Vi kan laste filen på nytt ved å bruke nginx -s på nytt
Og voila! Dine statiske filer vil nå fungere fullt ut.
Konklusjon
På dette tidspunktet fungerer Django-appen din ordentlig. Hvis du har noen spesielle krav, må du kanskje sette opp en cache som Redis eller en meldingskø som Rabbit MQ. Det kan også være lurt å konfigurere kontinuerlig distribusjon ettersom distribusjonsprosedyren kan ta en stund.
Et annet viktig skritt er å ta passende skritt for å sikre Ubuntu-maskinen din. Ellers kan det hende at serveren din oppfører seg feil!
Lykke til!