GNU/Linux >> Znalost Linux >  >> Linux

Nastavte Django s Postgres, Nginx a Gunicorn na Ubuntu 18.04

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:

  1. Nastavit výchozí kódování na UTF-8
  2. Nastavte schéma izolace na hodnotu „přečtení potvrzeno“
  3. 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í

  1. Soubory projektu vlastní uživatel root namísto uživatele sudo
  2. Pracovní adresář v /etc/systemd/system/gunicorn.service neukazuje na adresář projektu.
  3. 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.


Linux
  1. Nginx s libmodsecurity a OWASP ModSecurity Core Rule Set na Ubuntu 16.04

  2. Nainstalujte Django CMS na Ubuntu 12.04 s MariaDB, Gunicorn a Nginx

  3. Nainstalujte WordPress s Varnish a Nginx na Ubuntu

  1. Jak nasadit aplikaci Flask s Nginx a Gunicorn na Ubuntu 20.04

  2. Jak nastavit Django s Postgres, Nginx a Gunicorn na Ubuntu 20.04

  3. Jak nastavit Apache pomocí události MPM a PHP-FPM na Ubuntu 20.04

  1. Jak nastavit vysokou dostupnost Nginx pomocí Pacemaker, Corosync a Crmsh na Ubuntu 16.04

  2. Filtrujte a optimalizujte požadavky na statické soubory pomocí NGINX na Ubuntu 18.04

  3. Jak nainstalovat Node.js s NVM a Nginx na Ubuntu 22.04