Django je všestranný, výkonný, efektivní a neustále se vyvíjející rámec webových aplikací založený na pythonu, který můžete použít k uvedení své webové aplikace do provozu. Je to populární webový rámec a obvykle je dodáván s vývojovým serverem používaným pro místní testování vašeho kódu. Pokud máte v úmyslu přesunout své aplikace do produkce, bude vyžadováno robustnější a bezpečnější nastavení webového serveru.
V této příručce vás provedeme uměním profesionálního nasazení a konfigurace Django účinnějším a odolnějším způsobem. Nainstalujeme a nakonfigurujeme PostgreSQL databázi na místo SQLite databáze a integrujeme aplikační server Gunicorn, který bude rozhraní s aplikacemi. Později budeme pokračovat v nastavení webového serveru NGINX, který bude poskytovat reverzní proxy kanál serveru Gunicorn, čímž nám poskytne požadované výkonové a bezpečnostní komponenty pro obsluhu našich aplikací.
Předpoklady
Než začneme, proveďte rychlou kontrolu letu a ujistěte se, že máme následující
- Nová instance serveru Ubuntu 18.04
- Uživatel bez oprávnění root s právy sudo. V této příručce budeme používat
james
- Přístup SSH k serveru
Cíle
Zde je stručný návod, čeho chceme dosáhnout. Chystáme se nainstalovat Django ve virtuálním prostředí. To umožňuje, aby projekty byly zpracovávány odděleně od hostitelského prostředí. Poté se pustíme do instalace a konfigurace aplikačního serveru Gunicorn, který vytvoří rozhraní aplikace a přeloží požadavky v protokolu HTTP na volání Pythonu, která naše aplikace dokáže zpracovat. Nakonec nastavíme Nginx, což je vysoce výkonný webový server s nesčetným množstvím bezpečnostních komponent, které zvýší bezpečnost našich aplikací.
Začínáme
Pro začátek začneme aktualizací našich repozitářů Ubuntu
$ sudo apt-get update
Dále si stáhneme a nainstalujeme potřebné softwarové balíčky pro všechny aplikace, které budeme konfigurovat. Budou zahrnovat správce balíčků pip, PostgreSQL a Nginx.
Pokud používáte Django s Python3, syntaxe bude
$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx
Pokud váš systém používá Python2, příkaz bude:
$ sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx
Ukázkový výstup
Příkaz nainstaluje správce balíčků pip, všechny potřebné vývojové soubory Pythonu potřebné k sestavení Gunicornu, webový server Nginx, databázi Postgres a klíčové knihovny potřebné pro interakci s databázovým strojem.
Po úspěšné instalaci všech požadovaných softwarových balíčků je čas vytvořit databázi a uživatele pro webovou aplikaci Django
Vytvoření databáze PostgreSQL a uživatele databáze
Pojďme teď rovnou skočit a vytvořit databázi a uživatele pro aplikaci Django
Přihlaste se do Postgres a spusťte příkaz
$ sudo -u postgres psql
Přejdete na výzvu Postgres, jak je vidět ve výstupu
Vytvořte databázi pro svůj projekt. V tomto případě je název databáze „projekt“.
postgres=# CREATE DATABASE project;
Ukázkový výstup
POZNÁMKA! Všechny příkazy v PostgreSQL musí být ukončeny středníkem.
Po úspěšném vytvoření databáze vytvořte uživatele pro projekt Django a nezapomeňte přiřadit bezpečné heslo. V tomto případě je uživatel uživatel projektu
Nahraďte atribut ‘heslo’ svým vlastním silným heslem.
postgres=# CREATE USER projectuser WITH PASSWORD 'password';
Ukázkový výstup
Abychom potvrdili Django nastavené parametry pro připojení k databázi, přejdeme na:
- Nastavit výchozí kódování na UTF-8
- Nastavte schéma izolace na hodnotu „přečtení potvrzeno“
- Nastavit časové pásmo na UTC
Chcete-li splnit požadavky na nastavení
, proveďte níže uvedené příkazy
postgres=# ALTER ROLE projectuser SET client_encoding TO 'utf8';
postgres=# ALTER ROLE projectuser SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE projectuser SET timezone TO 'UTC';
Nyní udělme přístup k databázi našemu nově vytvořenému uživateli
postgres=# GRANT ALL PRIVILEGES ON DATABASE project TO projectuser;
Ukázkový výstup
Nyní můžete opustit prostředí Postgres.
postgres=# \q
Vytvoření virtuálního prostředí Python pro váš projekt Django
Pro snazší správu naší aplikace nainstalujeme požadované předpoklady Pythonu do virtuálního prostředí.
Nejprve však nainstalujme virtuální prostředí
Pokud váš systém používá Python3, upgradujte pip spuštěním
$ sudo -H pip3 install --upgrade pip
Pro systém běžící na Pythonu2 spusťte
$ sudo -H pip install --upgrade pip
Ukázkový výstup
Poté nainstalujte virtuální prostředí pomocí pip
$ sudo -H pip install virtualenv
Ukázkový výstup
S naším virtuálním prostředím ho nyní vytvoříme a přesuneme se do něj
$ mkdir ~/project
$ cd ~/project
Nyní vytvořte virtuální prostředí Pythonu
virtualenv projectenv
Ukázkový výstup
Tím se vytvoří adresář s názvem projectenv
v adresáři projektu.
Před instalací požadavků Pythonu aktivujte virtuální prostředí
$ source projectenv/bin/activate
Ukázkový výstup
Všimněte si, jak se výzva změní na (projectenv)james@ubuntu: ~/project$
S aktivním virtuálním prostředím nainstalujme adaptér Gunicorn, Django a Psycopg2 Postgres pomocí pip.
$ pip install django gunicorn psycopg2-binary
Ukázkový výstup
Vytvoření a konfigurace nového projektu Django
V tomto okamžiku dáme Django pokyn, aby nainstaloval soubory projektu do adresáře projektu, který jsme již vytvořili. Vedle řídícího skriptu bude vytvořen adresář druhé úrovně.
Toho dosáhnete provedením příkazu níže.
$ django-admin.py startproject project ~/project
Náš adresář projektu, v tomto případě ~/project
by měl mít následující obsah
manage.py - Django’s Python management script
project - directory containing Django’s project package
projectenv - Virtual environment directory that was earlier created
Ukázkový výstup
Úprava konfigurace souborů projektu
Otevřeme soubor nastavení
vim ~/project/settings.py
Přejděte dolů a hledejte atribut „POVOLENÍ HOSTÉ“. V hranatých závorkách zadejte IP adresu serveru a připojte atribut ‘localhost’.
Ukázkový výstup
Dále vyhledejte sekci „DATABÁZE“. Upravte nastavení tak, aby odpovídala informacím databáze PostgreSQL. To zahrnuje název databáze, uživatele a heslo uživatele.
Ukázkový výstup
Dále přejděte dolů a zadejte umístění statických souborů. To je důležité, aby Nginx mohl hladce zpracovávat požadavky na tyto položky. Z úryvku níže budou statické soubory umístěny do adresáře s názvem ‚static‘
Uložit a ukončit.
Dokončení počátečního nastavení projektu
Pojďme nyní migrovat schéma databáze do naší databáze PostgreSQL
~/project/manage.py makemigrations
Ukázkový výstup
~/project/manage.py migrate
Ukázkový výstup
Dále vytvoříme superuživatele pro projekt Django spuštěním následujícího příkazu
~/project/manage.py createsuperuser
Budete vyzváni k zadání uživatelského jména, e-mailu a hesla, jak je uvedeno níže
Ukázkový výstup
Po úspěšném vytvoření superuživatele můžeme nyní shromažďovat statický obsah do umístění adresáře
~/project/manage.py collectstatic
Ukázkový výstup
Tyto statické soubory budou umístěny do ‘static’
adresář ve složce projektu.
Pro testování vývojového serveru povolíme port, v tomto případě port 8000, který bude použit pro přístup k aplikaci přes webový prohlížeč.
Pro otevření portu provedeme
sudo ufw allow 8000
Nakonec spusťte vývojový server Django ve virtuálním prostředí spuštěním
~/project/manage.py runserver 0.0.0.0:8000
Otevřete webový prohlížeč a navštivte adresu svého serveru
V tomto případě je adresa našeho serveru
https://38.76.11.180/
Měli byste vidět následující stránku indexu Django
Ukázkový výstup
Nyní přidáme /admin na konec adresy URL, abychom se dostali na přihlašovací stránku
https://38.76.11.180/admin
Ukázkový výstup
Zadejte přihlašovací údaje, které jste poskytli při vytváření účtu superuživatele, a klikněte na „Přihlásit“
Tím se dostaneme na panel administrátorů Django
Ukázkový výstup
Skvělý! Nyní, když jsme potvrdili, že Django je v provozu, stiskněte CTRL + C
na terminálu pro ukončení aplikace
Potvrzení schopnosti Gunicorna testovat projekt
Před opuštěním virtuálního prostředí ověřte, že náš aplikační server Gunicorn může obsluhovat Django.
Zatímco jsme stále v adresáři projektu, načtěte modul WSGI
gunicorn --bind 0.0.0.0:8000 project.wsgi
Tím se spustí Gunicorn na stejném rozhraní a portu, na kterém běžel server Django. Můžete se vrátit a ověřit, že aplikace Django běží ve webovém prohlížeči.
Poté stiskněte CTRL + C pro zastavení aplikace a spuštěním příkazu deactivate opusťte virtuální prostředí.
Poté, co jsme otestovali, že aplikační server Gunicorn může sloužit naší aplikaci Django, je čas implementovat robustnější způsob spouštění a zastavování aplikačního serveru.
Vytvoříme servisní soubor systemd s Gunicornem pomocí následujícího příkazu
$ sudo vim /etc/systemd/system/gunicorn.service
Začněte sekcí [Jednotka] a vložte následující obsah
[Unit]
Description=gunicorn daemon
After=network.target
Tato část specifikuje závislosti a metadata
Dále vytvořte [service]
sekce.
V této části uvedeme uživatele a skupinu, pod kterými má proces běžet. V tomto případě je uživatel root a skupina je www-data. Skupina je specifikována jako www-data, takže Nginx může bezproblémově komunikovat s Gunicornem.
Poté bude uvedena úplná cesta ke spustitelnému souboru Gunicorn. Protože je Nginx nainstalován na stejném serveru, připojíme jej k Unixovému soketu.
Vložte následující obsah
[Service]
User=james
Group=www-data
WorkingDirectory=/home/james/project
ExecStart=/home/james/project/projectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/james/project/project.sock project.wsgi:application
Nakonec vytvořte sekci [Install] a připojte následující řádky
[Install]
WantedBy=multi-user.target
Skvělý! Nyní je náš soubor služby systemd kompletní.
Uložte a zavřete textový editor. Restartujte službu Gunicorn a povolte její spuštění při startu
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
Chcete-li zkontrolovat stav běhu gunicorn
$ systemctl status gunicorn
Ukázkový výstup
Ověřte přítomnost souboru Gunicorn Socket
Nyní, když jsme ověřili, že Nginx je v provozu, ověřte existenci souboru project.sock v našem adresáři projektu
$ ls -l /home/james/project
Ukázkový výstup
POZNÁMKA:
Pokud soubor project.sock chybí, je to indikátor, že se gunicorn nepodařilo správně spustit.
Navíc můžete zkontrolovat protokoly gunicorn provedením příkazu níže
$ sudo journalctl -u gunicorn
Existuje řada důvodů, proč Nginx nemohl vytvořit soubor project.sock. Některé zahrnují
- Soubory projektu vlastní uživatel root namísto uživatele sudo
- Pracovní adresář v
/etc/systemd/system/gunicorn.service
neukazuje na adresář projektu. - Nesprávné konfigurace v direktivě ExecStart
Pokud jsou všechny konfigurace v pořádku, neměly by se po spuštění objevit žádné chyby
$ sudo journalctl -u gunicorn
Jakmile provedete změny v /etc/systemd/system/gunicorn.service
soubor, ujistěte se, že znovu načtete službu démona, aby se změny projevily
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
Konfigurace Nginx pro přesměrování provozu na Gunicorn
Poslední fází této příručky je konfigurace webového serveru Nginx pro směrování webového provozu do služby Gunicorn
Vytvoříme a otevřeme nový blok serveru v sites-available
adresář
$ sudo vim /etc/nginx/sites-available/project
Začněte zadáním, že tento blok by měl naslouchat portu 80 a měl by odpovídat na IP adresu serveru.
server {
listen 80;
server_name server_domain_or_IP;
}
Dále dáme pokyn Nginx, aby ignoroval jakékoli problémy s umístěním favicon. Navíc mu řekneme, kde má najít statická aktiva shromážděná v ~/project/static
adresář
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/james/project;
}
Nakonec vytvoříme umístění bloku / { }
který bude odpovídat zbytku požadavků.
V tomto umístění definujeme soubor proxy_params a později přímý provoz do soketu vytvořeného procesem Gunicorn
location / {
include proxy_params;
proxy_pass https://unix:/home/james/project/project.sock;
}
Konečný konfigurační soubor by měl vypadat nějak takto
Uložte a ukončete konfigurační soubor
Pojďme soubor povolit tím, že jej propojíme s adresářem site-enabled
$ sudo ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled
Dále otestujeme naši konfiguraci na případné chyby
$ sudo nginx -t
Pokud vše proběhlo v pořádku, výstup by měl být takový, jak je uvedeno níže
Po otestování konfigurace Nginx
$ sudo systemctl restart nginx
Nyní, když již nepotřebujeme přístup k vývojovému serveru na portu 8000, odeberme pravidlo na firewallu.
$ sudo ufw delete allow 8000
Povolme také port 80
$ sudo ufw allow 'Nginx Full'
Nyní byste měli být schopni přejít na doménu nebo IP adresu vašeho serveru a zobrazit aplikaci bez zadání portu 8000
Tipy při potížích
1. Server zobrazuje výchozí stránku Nginx
Pokud Nginx zobrazuje výchozí stránku namísto připojení k aplikaci Django, musíte zkontrolovat /etc/nginx/sites-available/project
a ujistěte se, že je správně uvedena IP nebo název domény vašeho serveru. Výchozí stránka znamená, že Nginx nebyl schopen vyhovět vašemu požadavku a místo toho se vrátil na /etc/nginx/sites-available/default
2. 502 Chyba špatné brány místo aplikace Django
Chyba 502 je známkou toho, že webový server Nginx nebyl schopen úspěšně proxy požadavek. Chcete-li problém přesně vyřešit, prohlédněte si protokoly v souboru protokolu chyb, jak je znázorněno, a to vám může poskytnout vodítko, co by mohlo být špatně.
$ sudo tail -F /var/log/nginx/error.log
3. “Nelze se připojit k serveru” Připojení odmítnuto
Chyba, na kterou můžete narazit při pokusu o přístup k některým určitým komponentám ve vašem webovém prohlížeči, je
OperationalError at /admin/login/
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
To ukazuje, že aplikace Django se nemůže připojit k databázi Postgres
Ujistěte se, že Postgres běží spuštěním
$ sudo systemctl status postgresql
Pokud neběží, spusťte jej a povolte jeho spuštění při spouštění
$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql
Pokud problémy přetrvávají, ujistěte se, že nastavení databáze v ~/myproject/myproject/settings.py
jsou správné.
Pro další odstraňování problémů prozkoumejte následující protokoly
Nginx process logs sudo journalctl -u nginx
Nginx access logs sudo tail -f /var/log/nginx/access.log
Nginx error logs sudo less /var/log/nginx/error.log
Gunicorn Application logs sudo journalctl -u gunicorn
Při provádění změn v konfiguračních souborech se ujistěte, že je restartujete, aby se změny projevily.
Pokud se rozhodnete provést změny v servisním souboru gunicorn systemd, nezapomeňte znovu načíst démona a restartovat gunicorn
$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn
Když provedete změny v konfiguraci bloku serveru Nginx, otestujte config
$ sudo nginx -t && sudo systemctl restart nginx
Závěr
Děkujeme, že jste si našli čas na tento článek. V tomto článku jsme nastavili projekt Django ve virtuálním prostředí a nastavili Gunicorn tak, aby překládal požadavky klientů a Nginx na proxy provoz do naší aplikace Django.