Späť na blog

Nastavenie Django s PostgreSQL, Nginx a Gunicorn na Ubuntu 20.04

Nastavenie Django s PostgreSQL, Nginx a Gunicorn na Ubuntu 20.04

Django je bezplatný a open-source framework pre webové aplikácie, ktorý je vytvorený v jazyku Python . Django je superrýchly, bezpečný a vysoko škálovateľný. V rukách šikovného vývojára dokáže Django rýchlo vytvoriť výkonný web. Dokáže sa bezproblémovo integrovať s populárnymi webovými servermi (Apache, Nginx), a databázami (MySQL, MariaDB, PostgreSQL, Oracle, a SQLite), atď. Django poháňa niektoré z najväčších webových stránok na svete, ako sú Instagram, Mozilla a NASA. Tento návod predvádza nastavenie základnej línie webovej aplikácie pomocou Django s PostgreSQL, Nginx a Gunicorn na Ubuntu 20.04.

Požiadavky

Tento návod vyžaduje, aby ste mali spustený server Ubuntu 20.04 nakonfigurovaný so základným firewallom a používateľom bez oprávnení root s privilégiami sudo. Pozrite si tento podrobný návod na ako nastaviť server Ubuntu. Podľa tohto návodu nakonfigurujte používateľa bez oprávnení root s privilégiami sudo. Môžete tiež nakonfigurovať firewall Iptables podľa krokov v tomto návode.

Django budeme inštalovať vo virtuálnom prostredí. Prostredie špecifické pre projekt umožňuje jednoduchšiu správu viacerých projektov z rovnakého servera. Po nastavení databáz a aplikácií nasadíme aplikačný server Gunicorn. Gunicorn bude aplikačné rozhranie, ktoré prekladá požiadavky klientov z HTTP na volania Pythonu, ktoré môže naša aplikácia využiť. Potom pred Gunicorn nasadíme Nginx kvôli jeho rýchlemu spracovaniu pripojení a ľahko implementovateľným bezpečnostným funkciám.

Inštalácia potrebných balíkov

Najprv začnite inštaláciou všetkých potrebných balíkov. Našťastie sú všetky tieto balíky priamo dostupné z oficiálnych repozitárov balíkov Ubuntu. Otvorte terminál a aktualizujte vyrovnávaciu pamäť balíkov APT:

Zoznam balíkov závisí od toho, či bude webová aplikácia používať Python 2 alebo Python 3. Spustením nasledujúceho príkazu nainštalujete Django s Pythonom 3:

Django 1.11 LTS je posledná verzia Django, ktorá bude podporovať Python 2. Ak plánujete používať Django s Pythonom 2, nainštalujte nasledujúce balíky:

Databáza a používateľ PostgreSQL

Pokiaľ ide o databázové riešenie, budeme používať PostgreSQL. Je to výkonný, open-source objektovo-relačnú databázový systém. PostgreSQL ponúka spoľahlivosť, robustnosť a výkon. Podrobné kroky na nastavenie PostgreSQL nájdete v tomto návode na nastavenie PostgreSQL na serveri Ubuntu. V tomto návode nastavíme vyhradenú databázu a používateľa pre našu aplikáciu Django.

V predvolenom nastavení PostgreSQL implementuje „peer authentication“ ako schému overovania pre lokálne pripojenia. Stručne povedané, „peer authentication“ overí prihlásenie, ak sa používateľské meno v operačnom systéme zhoduje s platným používateľským menom PostgreSQL. Počas inštalácie PostgreSQL nakonfiguroval používateľa operačného systému postgres tak, aby zodpovedal administratívnemu používateľovi PostgreSQL postgres. Prihláste sa do interaktívnej relácie shellu PostgreSQL ako postgres pomocou nasledujúceho príkazu:

Ocitnete sa v príkazovom riadku PostgreSQL. Prvým krokom je vytvorenie vyhradenej databázy pre projekt. Pre účely ukázky sa databáza bude volať viktor_project:

Ďalším krokom je vytvorenie vyhradeného používateľa pre databázu projektu. Používateľ by mal mať silné používateľské meno. Pre účely ukázky bude používateľské meno viktor_project_user:

Teraz upravíme niektoré parametre:

  • Určité parametre pripojenia. Stručne povedané, nebude potrebné dopytovať a nastavovať správne hodnoty pri každom nadviazaní pripojenia. Výrazne to zlepšuje výkon databázy.
  • Predvolené kódovanie na UTF-8. Je to univerzálne kódovanie a Django ho očakáva.
  • Predvolená schéma izolácie transakcií na „read committed“. Blokuje čítanie z nepotvrdených transakcií.
  • Časové pásmo na UTC.

Všetky tieto zmeny parametrov odporúča samotný projekt Django. Ak chcete tieto zmeny implementovať, spustite nasledujúce príkazy. Nezabudnite zmeniť používateľské meno databázy na to správne:

Zmeňte administrátora databázy na vyhradeného databázového používateľa:

Naša práca s PostgreSQL je nateraz hotová. Ukončite interaktívny shell PostgreSQL:

Exit the PostgreSQL interactive shell

Virtuálne prostredie Pythonu

Keď máme databázu pripravenú, môžeme sa teraz zamerať na splnenie zvyšných požiadaviek projektu. Pre jednoduchšiu správu vytvoríme virtuálne prostredie a nainštalujeme tam všetky požiadavky pre Python. Na vygenerovanie virtuálneho prostredia potrebujeme virtualenv. Dá sa jednoducho nainštalovať pomocou pip.

Nasledujúce príkazy aktualizujú pip a nainštalujú virtualenv. Pre Python 3 spustite nasledujúce príkazy:

Pre Python 2 namiesto toho spustite nasledujúce príkazy:

Po nainštalovaní virtualenv je čas vytvoriť virtuálne prostredie. Ďalej vytvorte vyhradený adresár pre virtuálne prostredie:

Potom zmeňte aktuálny aktívny adresár na vyhradený adresár pre virtuálne prostredie:

V rámci adresára spustite nasledujúci príkaz. Nástroj virtualenv vytvorí virtuálne prostredie s názvom projektu:

Vytvorí podadresár s názvom projektu. Podadresár bude obsahovať lokálnu verziu Pythonu a pip. Ponúka flexibilitu na inštaláciu a konfiguráciu izolovaného prostredia Pythonu pre projekt.

Nasledujúci príkaz aktivuje virtuálne prostredie:

activate the virtual environment

Výzva terminálu sa zmení, čo znamená, že pracujete vo virtuálnom prostredí Pythonu. Teraz, keď sme vo virtuálnom prostredí, nainštalujeme potrebné požiadavky pre Python. Potrebujeme Django, Gunicorn a psycopg2 (adaptér pre PostgreSQL). Nasledujúci príkaz prikáže lokálnemu pip nainštalovať tieto komponenty:

Aj keď používate Python 3, pip je správny príkaz. Je to preto, že vo virtuálnom prostredí je pip3 premenovaný na pip.

Nový projekt Django

Keď máme komponenty Pythonu na svojom mieste, môžeme začať pracovať so samotnými súbormi projektu Django.

  • Vytvorenie projektu Django

Adresár projektu je už vytvorený. Povieme Djangu, aby tam nainštaloval svoje súbory. Tento postup vygeneruje adresár druhej úrovne obsahujúci samotné kódy. Adresár bude obsahovať aj riadiaci skript. Kľúčové je, že Djangu explicitne povieme cieľový adresár namiesto toho, aby sme ho nechali rozhodnúť o adresári relatívne k aktuálnemu:

Django podľa toho vytvorí projekt. Tu sú niektoré z dôležitých súborov a adresárov, na ktoré sa zameriame. Názvy adresárov a súborov sú použité podľa ukážky.

  • ~/viktor_project/manage.py: Skript na správu projektu od Django.
  • ~/viktor_project/viktor_project/: Je to balík obsahujúci projekt Django. Mal by obsahovať súbory __init__.py, settings.py, urls.py, asgi.py a wsgi.py.
  • Úprava nastavení projektu

Po vytvorení projektu je prvou vecou úprava jeho konfigurácie. Otvorte settings.py v textovom editore:

Prvá direktíva, ktorú hľadáme, je ALLOWED_HOSTS. Definuje servery alebo názvy domén, ktoré sa môžu pripojiť k inštancii Django. Ak akákoľvek prichádzajúca požiadavka s hlavičkou Host nezodpovedá zoznamu ALLOWED_HOSTS, vyvolá to výnimku. Django to odporúča, aby sa predišlo určitým typom bezpečnostných zraniteľností:

ALLOWED_HOSTS

Ďalšia časť, na ktorú sa zameriame, je DATABASE. Spravuje prístup k databáze. V predvolenom nastavení obsahuje konfiguráciu pre databázový nástroj SQLite. Pre projekt však použijeme databázu PostgreSQL. Django bude na komunikáciu s PostgreSQL používať adaptér psycopg2:

django 1

Teraz prejdite na koniec súboru. Pridajte nasledujúce riadky na označenie umiestnenia statických súborov. Pomáha to Nginx spracovávať požiadavky na tieto položky:

static

Naša práca s settings.py je nateraz hotová. Uložte súbor a zatvorte editor.

  • Dokončenie počiatočného nastavenia projektu

Teraz môžeme migrovať počiatočnú schému databázy do vyhradenej databázy PostgreSQL. Spustite nasledujúci príkaz:

Ďalej musíme pre projekt vytvoriť superpoužívateľa. Ak chcete vygenerovať superpoužívateľa, spustite nasledujúci príkaz:

viktor_project

Zhromaždite všetky statické súbory do umiestnenia, ktoré sme špecifikovali v settings.py. Statické súbory sa zhromaždia v samostatnom adresári s názvom „static“ pod adresárom projektu:

Teraz sa musíme pohrať s firewallom servera. Ak ste postupovali podľa návodu na konfiguráciu servera, už máte UFW nakonfigurovaný a aktivovaný. Vytvoríme výnimku pre port 8000. Toto je predvolený port, ktorý Django používa. Pozrite si túto príručku, kde sa dozviete viac o základoch a používaní firewallu UFW.

Ďalej overte akciu:

Nakoniec môžeme otestovať server v akcii. Spustite vývojový server Django:

Ak konfigurácia prebehla úspešne, vývojový server Django by sa mal spustiť a prijímať prichádzajúce požiadavky. Otvorte prehliadač a prejdite na IP/doménu vášho servera na porte 8000:

django 2

Mali by ste sa dostať na predvolenú indexovú stránku Django. Ak chcete získať prístup k panelu administrátora, pridajte na koniec URL adresy /admin. Panel administrátora je prístupný iba pre superpoužívateľa, ktorého sme vytvorili predtým:

Po prihlásení sa dostanete na predvolené administračné rozhranie Django:

django 3

Pre túto chvíľu sme s testovaním skončili. Ak chcete server zastaviť, stlačte „Ctrl + C“ v okne terminálu.

  • Testovanie Gunicornu

Pred opustením virtuálneho prostredia sa chceme uistiť, že Gunicorn dokáže obsluhovať aplikácie. Spôsob, ako to otestovať, je použiť Gunicorn na načítanie modulu WSGI projektu.

Príkaz Gunicorn sa nachádza v adresári projektu:

Týmto sa spustí Gunicorn na rovnakom rozhraní, na ktorom bežal Django. Aplikáciu môžeme znova otestovať z bežného webového prehliadača. Upozorňujeme, že administračné rozhranie nebude mať aplikované žiadne štýly, pretože Gunicorn stále nevie, ako nájsť statický obsah CSS:

Po dokončení stlačte „Ctrl + C“ v okne terminálu, aby ste zastavili server Gunicorn.

  • Ukončenie virtuálneho prostredia

Konfigurácia aplikácie Django je dokončená. Spustením nasledujúceho príkazu ukončite virtuálne prostredie:

Súbory socketu a služby Gunicorn

Overili sme, že Gunicorn dokáže komunikovať s aplikáciou Django. Potrebujeme však robustnejší spôsob správy aplikačného servera. Tu prichádza na rad systemd. Systemd je jedným z najpopulárnejších init systémov dostupných v systéme Linux. Tu je podrobný návod na ako spravovať služby a jednotky systemd.

Pre Gunicorn môžeme vytvoriť súbory socketu a služby, aby ho systemd mohol spravovať, akoby to bola služba. Pri spúšťaní systému sa vygeneruje socket Gunicorn. Socket bude počúvať prichádzajúce spojenia. Keď dôjde k spojeniu, systemd spustí procesy Gunicorn na spracovanie tohto spojenia.

  • Socket Gunicorn

Začnime vytvorením socketu Gunicorn. Súbor je potrebné vytvoriť s oprávneniami sudo:

Do súboru vložte nasledujúci kód:

Ako môžete vidieť, kód má tri časti.

  • [Unit]: Táto časť popisuje socket.
  • [Socket]: Definuje umiestnenie socketu.
  • [Install]: Táto časť zabezpečuje, že systemd vytvorí socket v správnom čase.

Uložte súbor a zatvorte editor.

  • Služba Gunicorn

Ďalej vytvoríme súbor služby pre Gunicorn. Podobne ako súbor socketu, aj tento musí byť vytvorený s oprávneniami sudo:

Zadajte nasledujúci kód:

Kód obsahuje viacero častí:

  • [Unit]: Táto časť špecifikuje metadáta a závislosti. Popisuje tiež spustenie až po dosiahnutí sieťového cieľa (network target).
  • [Service]: Táto sekcia špecifikuje používateľa a skupinu, pod ktorými bude proces spustený. Vlastníctvo skupiny je nastavené na „www-data“, aby Nginx mohol komunikovať s Gunicornom. Taktiež mapuje pracovné adresáre a špecifikuje spúšťacie príkazy.
  • [Install]: Táto sekcia hovorí systemd, s čím má prepojiť túto službu, ak je povolená pri spúšťaní systému. Mala by sa spustiť po spustení bežného viacpoužívateľského systému.

Potom súbor uložte a zatvorte editor.

  • Povolenie socketu Gunicorn

Socket Gunicorn je pripravený na použitie. Preto môžete spustiť nasledujúce príkazy. Spustia a povolia socket. Súbor socketu sa vytvorí v /run/gunicorn.sock pri spúšťaní systému. Keď sa vytvorí pripojenie k socketu, systemd spustí službu Gunicorn, aby ho spracovala:

Skontrolujte stav socketu Gunicorn:

Teraz skontrolujte existenciu súboru socketu:

Ak stav zo systemctl indikuje chybu alebo sa súbor gunicorn.sock nenašiel, znamená to, že socket nebol vytvorený správne. Pozrite si podrobný log pre nápovedu:

gunicorn.socket

Nezabudnite sa znova pozrieť do súboru gunicorn.socket kvôli potenciálnym chybám.

  • Aktivácia socketu

Doteraz sme spustili gunicorn.socket. Avšak bez akejkoľvek požiadavky na pripojenie sa gunicorn.service neaktivuje. Ďalej overte stav Gunicornu:

Mechanizmus aktivácie socketu môžeme otestovať odoslaním požiadavky na pripojenie pomocou curl:

Mali by ste dostať HTML výstup z aplikácie. To znamená, že Gunicorn sa úspešne spustil a bol schopný obslúžiť aplikáciu Django. Overte aktuálny stav služby Gunicorn:

Ak dôjde k akémukoľvek neočakávanému správaniu alebo výstupu (indikujúcemu chybu), pozrite si podrobné logy pre nápovedu:

Ak boli v súbore gunicorn.service vykonané zmeny, musíte znova načítať démona, aby si znova prečítal definíciu služby. Vyžaduje to tiež reštartovanie služby Gunicorn:

Konfigurácia Nginx

Teraz nakonfigurujeme Nginx tak, aby odovzdával prichádzajúcu prevádzku procesu. Najprv vytvorte nový blok servera v Nginx:

Potom zadajte nasledujúci kód:

 

V konfigurácii je viacero blokov:

  • služba: Tento blok definuje, že server by mal normálne počúvať na porte 80 a mal by odpovedať na doménové meno alebo IP adresu servera.
  • location: Toto je prvý záznam location. Definuje, kde hľadať statické súbory.
  • location: Toto je druhý záznam location. Tento blok definuje štandardné parametre proxy a spôsob, akým sa má prevádzka odovzdávať socketu Gunicorn.

Uložte súbor a zatvorte editor. Prepojte súbor s adresárom „sites-enabled“ na aktiváciu:

Potom otestujte, či v konfigurácii Nginx nie je nejaká syntaktická chyba:

Ak ste nenašli chybu, reštartujte Nginx, aby sa zmena prejavila:

Musíme znova upraviť pravidlá UFW. Prístup k vývojovému serveru už nepotrebujeme, takže môžeme odstrániť výnimku pre port 8000. Okrem toho chceme otvoriť port 80 pre bežnú prevádzku:

Overte tieto zmeny pravidiel brány firewall:

Server by mal byť teraz prístupný z bežného webového prehliadača.

Riešenie problémov

Ak boli všetky kroky správne dodržané, aplikácia Django by mala byť prístupná cez internet. Ak nie, znamená to, že inštalácia neprebehla podľa plánu. Musíme vyriešiť problémy, aby sme zistili zdroj problému.

  • Nginx zobrazuje predvolenú stránku

Ak Nginx zobrazuje predvolenú stránku namiesto proxy aplikácie, zvyčajne to znamená, že server_name bol v bloku servera nakonfigurovaný nesprávne.

V tomto príklade je blok servera uložený na nasledujúcom mieste:

Záznam server_name určuje, ktorý blok servera Nginx použije na odpovedanie na požiadavky. Ak sa zobrazuje predvolená stránka, Nginx pravdepodobne nedokázal priradiť požiadavku k explicitnému bloku servera, takže namiesto toho prechádza na predvolený blok:

Skontrolujte, či má blok servera vášho projektu Django správny server_name.

  • 502 Bad Gateway

Chyba 502 indikuje, že Nginx nedokázal úspešne sprostredkovať požiadavku (proxy). Existuje široká škála možných problémov s konfiguráciou, ktoré môžu viesť k chybe 502, takže na správne vyriešenie problému potrebujeme vodítka.

Primárnym zdrojom vodítok sú chybové protokoly Nginx. Vo všeobecnosti naznačia podmienky, ktoré spôsobili problémy počas proxy. Skontrolujte chybový protokol Nginx pomocou nasledujúceho príkazu:

Po otvorení protokolu sa pokúste znova pristúpiť k serveru. Malo by to vygenerovať novú chybovú správu v protokole. Môže to pomôcť zúžiť problém. Tu je niekoľko možných správ:

  • connect() to unix:/run/gunicorn.sock failed (2: No such file or directory)

To naznačuje, že Nginx nemohol nájsť gunicorn.sock na mieste definovanom v konfigurácii. Umiestnenie je popísané direktívou proxy_pass pod blokom stránky. Skontrolujte, či proxy_pass ukazuje na správne umiestnenie gunicorn.sock vygenerovaného jednotkou systemd gunicorn.socket:

Ak gunicorn.sock nebol nájdený v adresári /run, znamená to, že systemd ho nedokázal vygenerovať. Mali by ste znova skontrolovať kroky konfigurácie súboru soketu Gunicorn.

  • connect() to unix:/run/gunicorn.sock failed (13: Permission denied)

To naznačuje, že Nginx sa nemohol pripojiť k soketu Gunicorn kvôli problémom s povoleniami. Môže sa to stať, ak bol proces vykonaný ako používateľ root namiesto používateľa sudo . Hoci systemd úspešne vygeneroval gunicorn.sock , Nginx ho nemôže použiť.

Jedným z možných vinníkov môžu byť obmedzené oprávnenia medzi koreňovým adresárom (/) a súborom gunicorn.sock . Skontrolujte oprávnenia a vlastníctvo súboru soketu a každého z jeho nadradených adresárov:

Prvý stĺpec popisuje oprávnenia súboru. Druhý stĺpec popisuje vlastníka (používateľa) a tretí stĺpec vlastníka skupiny. Ak ktorýkoľvek z adresárov vedúcich k gunicorn.sock nemá správne oprávnenia na čítanie a spúšťanie, Nginx nebude môcť k soketu pristupovať.

  • Django zobrazuje „could not connect to the server: Connection refused“

To naznačuje, že Django sa nedokázal pripojiť k serveru PostgreSQL. Uistite sa, že server PostgreSQL beží:

Ak nebeží, spustite nasledujúce príkazy na jeho spustenie a povolenie:

sudo systemctl enable postgresql

Ak sa vám táto chyba stále zobrazuje, uistite sa, že prihlasovacie údaje k databáze sú správne definované v settings.py:

Ďalšie riešenie problémov

Pre ďalšie riešenie problémov sú k dispozícii rôzne záznamy (logy). Tieto záznamy môžu pomôcť zúžiť zdroje problémov.

Tu je zoznam záznamov, ktoré môžu pomôcť:

  • Záznamy Nginx
  • Prístupové záznamy Nginx
  • Chybové záznamy Nginx
  •  Aplikačné záznamy Gunicorn
  •  Záznamy socketu Gunicorn
Po vykonaní akejkoľvek aktualizácie konfigurácie alebo aplikácie môže byť potrebné reštartovať procesy, aby sa zmeny prejavili. Ak bola aktualizovaná aplikácia Django, reštartujte proces Gunicorn, aby sa zmeny načítali:
V prípade, že dôjde k zmenám v súboroch socketu alebo služby Gunicorn, znova načítajte démona a reštartujte procesy:
Ak boli vykonané zmeny v konfigurácii bloku servera Nginx, pred uvedením do prevádzky sa musia otestovať. Vyžaduje to tiež reštartovanie Nginx:

Záverečné myšlienky

Tento návod úspešne demonštruje, ako položiť základy pre Django. Django poskytuje mnoho bežných komponentov webovej aplikácie, čo vám umožňuje sústrediť sa na jedinečné prvky. Projekt Django bude fungovať vo virtuálnom prostredí. Gunicorn spravuje komunikáciu medzi požiadavkami klientov a Django. Na záver, Nginx funguje ako reverzný proxy server na spracovanie klientskych pripojení.

Príjemnú prácu s počítačom!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.