Zpět na blog

Nastavení Django s PostgreSQL, Nginx a Gunicorn na Ubuntu 20.04

Nastavení Django s PostgreSQL, Nginx a Gunicorn na Ubuntu 20.04

Django je bezplatný a open-source framework pro webové aplikace, který je postaven v jazyce Python programovacím jazyce. Django je super rychlý, bezpečný a vysoce škálovatelný. V rukou zkušeného vývojáře dokáže Django rychle vytvořit výkonný web. Lze jej bezproblémově integrovat s populárními webovými servery (Apache, Nginx), a databázemi (MySQL, MariaDB, PostgreSQL, Oracle, a SQLite), atd. Django pohání některé z největších světových webů, jako je Instagram, Mozilla a NASA. Tento návod ukazuje nastavení základu webové aplikace s pomocí Django s PostgreSQL, Nginx a Gunicorn na Ubuntu 20.04.

Požadavky

Tento návod vyžaduje, abyste měli spuštěný server Ubuntu 20.04 nakonfigurovaný se základním firewallem a uživatelem bez oprávnění root s právy sudo. Podívejte se na tento podrobný návod na jak nastavit server Ubuntu. Podle tohoto návodu nakonfigurujte uživatele bez oprávnění root s právy sudo. Můžete také nakonfigurovat firewall Iptables podle kroků v tomto návodu.

Django budeme instalovat ve virtuálním prostředí. Prostředí specifické pro projekt umožňuje snadnější správu více projektů ze stejného serveru. Jakmile budou databáze a aplikace na svém místě, nasadíme aplikační server Gunicorn. Gunicorn bude aplikační rozhraní, které překládá požadavky klientů z HTTP na volání Pythonu, která naše aplikace může využít. Poté před Gunicorn nasadíme Nginx pro jeho rychlé zpracování připojení a snadno implementovatelné bezpečnostní funkce.

Instalace potřebných balíčků

Nejprve začněte instalací všech potřebných balíčků. Naštěstí jsou všechny tyto balíčky přímo dostupné z oficiálních repozitářů balíčků Ubuntu. Otevřete terminál a aktualizujte mezipaměť balíčků APT:

Seznam balíčků závisí na tom, zda bude webová aplikace používat Python 2 nebo Python 3. Spuštěním následujícího příkazu nainstalujete Django s Pythonem 3:

Django 1.11 LTS je poslední verzí Django, která bude podporovat Python 2. Pokud hodláte používat Django s Pythonem 2, nainstalujte následující balíčky:

Databáze a uživatel PostgreSQL

Pokud jde o databázové řešení, budeme používat PostgreSQL. Je to výkonný, open-source objektově-relační databázový systém. PostgreSQL nabízí spolehlivost, robustnost a výkon. Podrobné kroky k nastavení PostgreSQL naleznete v tomto návodu na nastavení PostgreSQL na serveru Ubuntu. V tomto návodu nastavíme vyhrazenou databázi a uživatele pro naši aplikaci Django.

Ve výchozím nastavení PostgreSQL implementuje „peer authentication“ jako schéma ověřování pro lokální připojení. Stručně řečeno, „peer authentication“ ověří přihlášení, pokud se uživatelské jméno v operačním systému shoduje s platným uživatelským jménem PostgreSQL. Během instalace PostgreSQL nakonfiguroval uživatele operačního systému postgres tak, aby odpovídal postgres administrátorskému uživateli PostgreSQL. Přihlaste se do interaktivní relace shellu PostgreSQL jako postgres pomocí následujícího příkazu:

Ocitnete se v příkazovém řádku PostgreSQL. Prvním krokem je vytvoření vyhrazené databáze pro projekt. Pro účely ukázky se databáze bude jmenovat viktor_project:

Dalším krokem je vytvoření vyhrazeného uživatele pro projektovou databázi. Uživatel by měl mít silné uživatelské jméno. Pro účely ukázky bude uživatelské jméno viktor_project_user:

Nyní upravíme některé parametry:

  • Určité parametry připojení. Stručně řečeno, nebude nutné dotazovat a nastavovat správné hodnoty při každém navázání připojení. To výrazně zlepšuje výkon databáze.
  • Výchozí kódování na UTF-8. Je to univerzální kódování a Django ho očekává.
  • Výchozí schéma izolace transakcí na „read committed“. Blokuje čtení z nepotvrzených transakcí.
  • Časové pásmo na UTC.

Všechny tyto změny parametrů jsou doporučeny samotným projektem Django. Chcete-li tyto změny implementovat, spusťte následující příkazy. Nezapomeňte změnit uživatelské jméno databáze na to správné:

Změňte administrátora databáze na vyhrazeného databázového uživatele:

Naše práce s PostgreSQL je prozatím hotová. Ukončete interaktivní shell PostgreSQL:

Exit the PostgreSQL interactive shell

Virtuální prostředí Pythonu

S připravenou databází se nyní můžeme zaměřit na nastavení zbývajících požadavků projektu. Pro snazší správu vytvoříme virtuální prostředí a nainstalujeme do něj všechny požadavky Pythonu. K vygenerování virtuálního prostředí potřebujeme virtualenv. Lze jej snadno nainstalovat pomocí pip.

Následující příkazy aktualizují pip a nainstalují virtualenv. Pro Python 3 spusťte následující příkazy:

Pro Python 2 místo toho spusťte následující příkazy:

Jakmile je virtualenv nainstalován, je čas vytvořit virtuální prostředí. Dále vytvořte vyhrazený adresář pro virtuální prostředí:

Poté změňte aktuální aktivní adresář na vyhrazený adresář pro virtuální prostředí:

V tomto adresáři spusťte následující příkaz. Nástroj virtualenv vytvoří virtuální prostředí s názvem projektu:

Vytvoří podadresář s názvem projektu. Tento podadresář bude obsahovat lokální verzi Pythonu a pip. To nabízí flexibilitu pro instalaci a konfiguraci izolovaného prostředí Pythonu pro daný projekt.

Následující příkaz aktivuje virtuální prostředí:

activate the virtual environment

Výzva terminálu se změní, což indikuje, že pracujete ve virtuálním prostředí Pythonu. Nyní, když jsme ve virtuálním prostředí, nainstalujeme potřebné požadavky Pythonu. Potřebujeme Django, Gunicorn a psycopg2 (adaptér pro PostgreSQL). Následující příkaz nařídí lokálnímu pipu nainstalovat tyto komponenty:

I když používáte Python 3, pip je správný příkaz. Je to proto, že ve virtuálním prostředí je pip3 přejmenován na pip.

Nový projekt Django

S připravenými komponentami Pythonu můžeme začít pracovat se samotnými soubory projektu Django.

  • Vytvoření projektu Django

Adresář projektu je již vytvořen. Řekneme Djangu, aby tam nainstalovalo své soubory. Tento postup vygeneruje adresář druhé úrovně obsahující samotný kód. Adresář bude také obsahovat spouštěcí skript pro správu. Klíčové je, že Djangu explicitně sdělujeme cílový adresář, místo abychom ho nechali rozhodnout o adresáři relativně k aktuálnímu:

Django podle toho vytvoří projekt. Zde jsou některé z důležitých souborů a adresářů, na které se zaměříme. Názvy adresářů a souborů jsou použity podle ukázky.

  • ~/viktor_project/manage.py: Skript pro správu projektu od Django.
  • ~/viktor_project/viktor_project/: Je to balíček obsahující projekt Django. Měl by obsahovat soubory __init__.py, settings.py, urls.py, asgi.py a wsgi.py.
  • Úprava nastavení projektu

Po vytvoření projektu je prvním krokem úprava jeho konfigurace. Otevřete settings.py v textovém editoru:

První direktiva, kterou hledáme, je ALLOWED_HOSTS. Definuje servery nebo doménová jména, která se mohou připojit k instanci Django. Pokud jakýkoli příchozí požadavek s hlavičkou Host neodpovídá seznamu ALLOWED_HOSTS, vyvolá to výjimku. Django to doporučuje, aby se předešlo určitým typům bezpečnostních zranitelností:

ALLOWED_HOSTS

Další sekce, na kterou se zaměříme, je DATABASE. Spravuje přístup k databázi. Ve výchozím nastavení obsahuje konfiguraci pro databázový stroj SQLite. Pro projekt však použijeme databázi PostgreSQL. Django bude pro komunikaci s PostgreSQL používat adaptér psycopg2:

django 1

Nyní přejděte na konec souboru. Přidejte následující řádky, které určují umístění statických souborů. To pomůže Nginx zpracovávat požadavky na tyto položky:

static

Naše práce s settings.py je prozatím hotová. Soubor uložte a zavřete editor.

  • Dokončení počátečního nastavení projektu

Nyní můžeme migrovat počáteční schéma databáze do vyhrazené databáze PostgreSQL. Spusťte následující příkaz:

Dále musíme pro projekt vytvořit superuživatele. Chcete-li vygenerovat superuživatele, spusťte následující příkaz:

viktor_project

Shromážděte všechny statické soubory do umístění, které jsme určili v settings.py. Statické soubory budou shromážděny v samostatném adresáři s názvem „static“ v adresáři projektu:

Nyní si musíme pohrát s firewallem serveru. Pokud jste postupovali podle návodu ke konfiguraci serveru, máte již UFW nakonfigurovaný a aktivovaný. Vytvoříme výjimku pro port 8000. To je výchozí port, který Django používá. Podívejte se na tento návod, kde se dozvíte více o základech a použití firewallu UFW.

Next, verify the action:

Nakonec můžeme otestovat server v akci. Spusťte vývojový server Django:

Pokud konfigurace proběhla úspěšně, vývojový server Django by se měl spustit a přijímat příchozí požadavky. Otevřete prohlížeč a přejděte na IP/doménu vašeho serveru na portu 8000:

django 2

Měli byste se dostat na výchozí indexovou stránku Django. Pro přístup do administračního panelu přidejte na konec URL /admin. Administrační panel je přístupný pouze pro superuživatele, kterého jsme vytvořili dříve:

Po přihlášení se ocitnete na výchozím administračním rozhraní Django:

django 3

Prozatím jsme s testováním skončili. Chcete-li server zastavit, stiskněte v okně terminálu „Ctrl + C“.

  • Testování Gunicornu

Před opuštěním virtuálního prostředí se chceme ujistit, že Gunicorn dokáže aplikace obsluhovat. Způsob, jak to otestovat, je použít Gunicorn k načtení modulu WSGI projektu.

Příkaz Gunicorn se nachází v adresáři projektu:

Tím se spustí Gunicorn na stejném rozhraní, na kterém běžel Django. Aplikaci můžeme znovu otestovat z běžného webového prohlížeče. Upozorňujeme, že administrační rozhraní nebude mít aplikované žádné styly, protože Gunicorn stále neví, jak najít statický obsah CSS:

Po dokončení stiskněte v okně terminálu „Ctrl + C“ pro zastavení serveru Gunicorn.

  • Ukončení virtuálního prostředí

Konfigurace aplikace Django je dokončena. Spuštěním následujícího příkazu ukončíte virtuální prostředí:

Soubory soketu a služby Gunicorn

Ověřili jsme, že Gunicorn dokáže s aplikací Django komunikovat. Potřebujeme však robustnější způsob správy aplikačního serveru. Zde přichází na řadu systemd. Systemd je jedním z nejpopulárnějších init systémů dostupných v Linuxu. Zde je podrobný návod na jak spravovat služby a jednotky systemd.

Můžeme vytvořit soubory soketu a služby pro Gunicorn, aby jej systemd mohl spravovat, jako by to byla služba. Při spuštění se vygeneruje soket Gunicorn. Soket bude naslouchat příchozím připojením. Jakmile dojde k připojení, systemd spustí procesy Gunicorn pro zpracování tohoto připojení.

  • Soket Gunicorn

Začněme vytvořením soketu Gunicorn. Soubor je nutné vytvořit s oprávněním sudo:

Do souboru vložte následující kód:

Jak vidíte, kód se skládá ze tří částí.

  • [Unit]: Tato část popisuje soket.
  • [Socket]: Definuje umístění soketu.
  • [Install]: Tato část zajišťuje, že systemd vytvoří soket ve správný čas.

Uložte soubor a zavřete editor.

  • Služba Gunicorn

Dále vytvoříme soubor služby pro Gunicorn. Podobně jako soubor soketu musí být i tento vytvořen s oprávněním sudo:

Vložte následující kód:

Kód obsahuje několik částí:

  • [Unit]: Tato část specifikuje metadata a závislosti. Popisuje také spuštění až po dosažení síťového cíle.
  • [Service]: Tato sekce určuje uživatele a skupinu, pod kterými bude proces spuštěn. Vlastnictví skupiny je nastaveno na „www-data“, aby Nginx mohl komunikovat s Gunicornem. Mapuje také pracovní adresáře a specifikuje spouštěcí příkazy.
  • [Install]: Tato sekce říká systemd, s čím má tuto službu propojit, pokud je povolena při spuštění. Měla by se spustit poté, co začne běžet běžný víceuživatelský systém.

Dále soubor uložte a zavřete editor.

  • Povolení socketu Gunicorn

Socket Gunicorn je připraven k použití. Proto můžete spustit následující příkazy. Spustí a povolí socket. Soubor socketu bude vytvořen v /run/gunicorn.sock při spuštění. Jakmile dojde k připojení k socketu, systemd spustí službu Gunicorn, aby jej obsloužila:

Zkontrolujte stav socketu Gunicorn:

Nyní zkontrolujte existenci souboru socketu:

Pokud stav ze systemctl ukazuje chybu nebo soubor gunicorn.sock nebyl nalezen, znamená to, že socket nebyl vytvořen správně. Podívejte se na podrobný protokol pro nápovědu:

gunicorn.socket

Nezapomeňte se znovu podívat na soubor gunicorn.socket kvůli potenciálním chybám.

  • Aktivace socketu

Zatím jsme spustili gunicorn.socket . Bez jakéhokoli požadavku na připojení se však gunicorn.service neaktivuje. Dále ověřte stav Gunicornu:

Mechanismus aktivace socketu můžeme otestovat odesláním požadavku na připojení pomocí curl:

Měli byste obdržet HTML výstup z aplikace. To znamená, že Gunicorn se úspěšně spustil a byl schopen obsloužit aplikaci Django. Ověřte aktuální stav služby Gunicorn:

Pokud dojde k neočekávanému chování nebo výstupu (indikujícímu chybu), podívejte se na podrobné protokoly pro nápovědu:

Pokud byly v souboru gunicorn.service provedeny změny, musíte znovu načíst démona, aby znovu přečetl definici služby. Vyžaduje to také restartování služby Gunicorn:

Konfigurace Nginx

Nyní nakonfigurujeme Nginx tak, aby předával příchozí provoz procesu. Nejprve vytvořte nový blok serveru v Nginx:

Poté zadejte následující kód:

 

Zde je několik bloků v konfiguraci:

  • service: Tento blok definuje, že server by měl normálně naslouchat na portu 80 a měl by odpovídat na doménové jméno nebo IP adresu serveru.
  • location: Toto je první položka location. Definuje, kde hledat statické soubory.
  • location: Toto je druhá položka location. Tento blok definuje standardní parametry proxy a způsob předávání provozu do socketu Gunicorn.

Uložte soubor a zavřete editor. Pro aktivaci propojte soubor s adresářem „sites-enabled“:

Poté otestujte, zda v konfiguraci Nginx není nějaká syntaktická chyba:

Pokud jste nenašli chybu, restartujte Nginx, aby se změna projevila:

Musíme znovu upravit pravidla UFW. Přístup k vývojovému serveru již nepotřebujeme, takže můžeme odebrat výjimku pro port 8000. Kromě toho chceme otevřít port 80 pro běžný provoz:

Ověřte tyto změny pravidel firewallu:

Server by nyní měl být přístupný z běžného webového prohlížeče.

Postupy při odstraňování problémů

Pokud byly všechny kroky správně dodrženy, měla by být aplikace Django přístupná přes internet. Pokud tomu tak není, znamená to, že instalace neproběhla podle plánu. Musíme provést diagnostiku, abychom zjistili zdroj problému.

  • Nginx zobrazuje výchozí stránku

Pokud Nginx zobrazuje výchozí stránku namísto proxy aplikace, obvykle to znamená, že server_name byl v bloku serveru nakonfigurován špatně.

V tomto příkladu je blok serveru uložen na následujícím místě:

Záznam server_name určuje, který blok serveru Nginx použije k odpovídání na požadavky. Pokud se zobrazuje výchozí stránka, pak Nginx pravděpodobně nedokázal přiřadit požadavek k explicitnímu bloku serveru, takže se místo toho vrací k výchozímu bloku:

Zkontrolujte, zda má blok serveru vašeho projektu Django správný server_name.

  • 502 Bad Gateway

Chyba 502 značí, že Nginx nedokázal úspěšně předat požadavek přes proxy. Existuje široká škála možných problémů s konfigurací, které mohou vést k chybě 502, takže k řádnému vyřešení problému potřebujeme vodítka.

Hlavním zdrojem vodítek jsou chybové protokoly Nginx. Obecně napoví, jaké podmínky způsobily problémy během proxy. Zkontrolujte chybový protokol Nginx pomocí následujícího příkazu:

Jakmile se protokol otevře, zkuste k serveru přistoupit znovu. Mělo by to v protokolu vygenerovat novou chybovou zprávu. To může pomoci zúžit problém. Zde je několik možných zpráv:

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

To znamená, že Nginx nemohl najít gunicorn.sock na místě definovaném v konfiguraci. Umístění je popsáno direktivou proxy_pass v bloku webu. Zkontrolujte, zda proxy_pass ukazuje na správné umístění gunicorn.sock vygenerovaného jednotkou systemd gunicorn.socket:

Pokud gunicorn.sock nebyl nalezen v adresáři /run, znamená to, že jej systemd nemohl vygenerovat. Měli byste znovu zkontrolovat kroky konfigurace souboru soketu Gunicorn.

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

To znamená, že se Nginx nemohl připojit k soketu Gunicorn kvůli problémům s oprávněními. To se může stát, pokud byl proces proveden jako uživatel root namísto uživatele sudo uživatele. Přestože systemd úspěšně vygeneroval gunicorn.sock, Nginx jej nemůže použít.

Jedním z možných viníků mohou být omezená oprávnění mezi kořenovým adresářem (/) a souborem gunicorn.sock . Zkontrolujte oprávnění a vlastnictví souboru soketu a každého z jeho nadřazených adresářů:

První sloupec popisuje oprávnění k souboru. Druhý sloupec popisuje vlastníka (uživatele) a třetí sloupec vlastníka (skupinu). Pokud jakýkoli z adresářů vedoucích k gunicorn.sock nemá správná oprávnění pro čtení a spouštění, Nginx k soketu nebude moci přistoupit.

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

To znamená, že se Django nedokázal připojit k serveru PostgreSQL. Ujistěte se, že server PostgreSQL běží:

Pokud neběží, spusťte následující příkazy pro jeho spuštění a povolení:

sudo systemctl enable postgresql

Pokud se tato chyba stále zobrazuje, ujistěte se, že jsou přihlašovací údaje k databázi správně definovány v settings.py:

Další řešení problémů

Pro další řešení problémů jsou k dispozici různé protokoly. Tyto protokoly mohou pomoci zúžit zdroje problémů.

Zde je seznam protokolů, které mohou pomoci:

  • Protokoly Nginx
  • Přístupové protokoly Nginx
  • Chybové protokoly Nginx
  •  Aplikační protokoly Gunicorn
  •  Protokoly socketu Gunicorn
Po provedení jakékoli aktualizace konfigurace nebo aplikace může být nutné restartovat procesy, aby se změny projevily. Pokud byla aktualizována aplikace Django, restartujte proces Gunicorn, aby se změny načetly:
V případě, že dojde ke změnám v souborech socketu nebo služby Gunicorn, znovu načtěte démona a restartujte procesy:
Pokud byly provedeny změny v konfiguraci bloku serveru Nginx, musí být před uvedením do provozu otestovány. Vyžaduje to také restartování Nginx:

Závěrečné myšlenky

Tato příručka úspěšně ukazuje, jak položit základy Django. Django poskytuje mnoho běžných komponent webové aplikace, což vám umožňuje soustředit se na jedinečné prvky. Projekt Django bude fungovat ve virtuálním prostředí. Gunicorn spravuje komunikaci mezi požadavky klientů a Django. Nginx nakonec funguje jako reverzní proxy pro zpracování klientských připojení.

Příjemnou práci!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.