Comencem pel principi: què és Django?
Django és un framework web que et pot ajudar a fer que una aplicació Python o el teu lloc web s'enlairi. Django inclou un servidor de desenvolupament simplificat per provar el codi localment, però per a qualsevol servei en producció cal un servidor web més segur i potent.
En aquest article t'explicarem com instal·lar i configurar alguns components a Ubuntu 16.04 per donar suport a aplicacions Django i servir-les. D'una banda, crearem una base de dades PostgreSQL i configurarem el servidor d'aplicacions Gunicorn per interactuar amb les nostres aplicacions. Després, configurarem Nginx com a servidor intermediari invers per a Gunicorn, cosa que ens donarà accés a les seves característiques de seguretat i rendiment per servir les nostres aplicacions.
Sí, ja sabem que comporta una mica de feina, però ja veuràs que, un cop fet, estaràs molt satisfet amb el resultat 🙂
El primer requisit perquè aquest article et sigui útil és que el teu servidor VPS ha de ser una instal·lació neta, és a dir, ha d'estar acabat d'instal·lar només amb Ubuntu 16.04, i tenir un usuari que no sigui root, amb privilegis de “sudo”.
Instal·lar els paquets dels repositoris d'Ubuntu.
Per començar el procés, hauràs de baixar i instal·lar tots els elements que necessites dels repositoris d'Ubuntu. Després també utilitzarem el gestor de paquets pip de Python per instal·lar components addicionals.
Per fer-ho, hauràs d'actualitzar l'índex de paquets apt local i després baixar i instal·lar els paquets. Els paquets que instal·lis dependran de la versió de Python que utilitzi el teu projecte.
Si utilitzes Python 2, hauràs d'executar les ordres:
# sudo apt-get update
# sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginxSi, en canvi, utilitzes Django amb Python 3, hauràs d'introduir:
# sudo apt-get update
# sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginxAixò instal·larà pip, els fitxers de desenvolupament de Python necessaris per instal·lar Gunicorn més endavant, el sistema de bases de dades Postgres i les biblioteques necessàries per interactuar-hi, i el servidor web Nginx.
Crear la base de dades PostgreSQL i els usuaris.
Ara crearem la base de dades i l'usuari de la base de dades per a la nostra aplicació Django.
Per defecte, PostgreSQL utilitza un esquema d'autenticació anomenat “peer authentication” per a connexions locals. Bàsicament, això significa que, si el nom d'usuari del sistema operatiu coincideix amb un nom d'usuari Postgres vàlid, aquest usuari pot iniciar la sessió sense autenticació addicional.
Durant la instal·lació de Postgres, es crea un usuari del sistema operatiu anomenat postgres que correspon a l'usuari administratiu de PostgreSQL. Has d'utilitzar aquest usuari per fer tasques administratives. Pots utilitzar “sudo” i introduir el nom d'usuari amb l'opció “-u”.
Inicia una sessió interactiva de Postgres escrivint:
# sudo -u postgres psqlAra apareixerà un indicador d'ordres de PostgreSQL, on podràs configurar els teus requisits.
Primer, crea una base de dades per al teu projecte:
CREATE DATABASE miproyecto;
CREATE USER usuariomiproyecto WITH PASSWORD ‘contraseña’;
A continuació, has de modificar alguns dels paràmetres de connexió per a l'usuari que acabes de crear. Això accelerarà les operacions de la base de dades perquè no calgui consultar i configurar els valors correctes cada vegada que s'estableixi una connexió.
Has d'establir la codificació per defecte a UTF-8, que és la que Django espera. També has d'establir el nivell d'aïllament de les transaccions a “read committed”, que bloqueja la lectura de transaccions no confirmades. Finalment, hauràs d'establir la zona horària.
Per defecte, els projectes Django es configuraran per utilitzar UTC. Aquestes són totes les recomanacions del mateix projecte Django:
ALTER ROLE usuariomiproyecto SET client_encoding TO ‘utf8’;
ALTER ROLE usuariomiproyecto SET default_transaction_isolation TO ‘read committed’;
ALTER ROLE usuariomiproyecto SET timezone TO ‘UTC’;Ara pots donar accés al nou usuari per administrar la nova base de dades:
GRANT ALL PRIVILEGES ON DATABASE miproyecto TO usuariomiproyecto;Quan hagis acabat, surt de l'indicador d'ordres de PostgreSQL escrivint “\q”
Crear un entorn virtual de Python per al teu projecte
Ara que ja tens la base de dades, pots treballar en la resta de requisits necessaris per deixar el projecte a punt. Instal·larem els requisits del nostre Python dins d'un entorn virtual per facilitar-ne la gestió.
Per fer-ho, el primer que necessites és accés a l'ordre virtualenv. La pots instal·lar amb pip.
Si utilitzes Python 2, hauràs d'utilitzar l'ordre:
# sudo pip install virtualenvSi utilitzes Python 3, serà:
# sudo pip3 install virtualenvAmb virtualenv instal·lat, pots començar a donar forma al projecte. Crea el directori on desar els fitxers del projecte i accedeix-hi:
# mkdir ~/miproyecto
# cd ~/miproyectoDins del directori del projecte, crea un entorn virtual de Python amb l'ordre:
# virtualenv miproyectoentornoAixò crearà un directori anomenat “miproyectoentorno” dins del directori “miproyecto”. A dins, hi instal·larà una versió local de Python i una versió local de pip. Pots utilitzar-ho per instal·lar i configurar un entorn aïllat per al projecte.
Abans d'instal·lar els requisits de Python per al projecte, haurem d'activar l'entorn virtual. Ho pots fer escrivint:
# source miproyectoentorno/bin/activateL'indicador d'ordres hauria de canviar per indicar que ara treballes dins d'un entorn virtual de Python. Hauria de tenir més o menys aquest aspecte:
(miproyectoentorno)user@host:~/miproyecto$.Amb l'entorn virtual actiu, instal·larem Django, Gunicorn i l'adaptador psycopg2 de PostgreSQL amb la instància local de pip:
# pip install django gunicorn psycopg2Independentment de la versió de Python que utilitzis, quan s'activa l'entorn virtual, s'ha d'utilitzar l'ordre pip (no PIP3)
Crear i configurar un projecte Django nou
Amb els components de Python instal·lats, pots crear els fitxers del nostre projecte Django.
Crear el projecte Django
Com que ja tens un directori del projecte, has de dir a Django que hi instal·li els fitxers. Això crearà un altre directori dins del principal amb el codi real, cosa que és normal, i col·locarà un script de gestió en aquest directori.
# django-admin.py startproject miproyectoAjustar la configuració del projecte
El primer que has de fer amb els fitxers del projecte acabats de crear és ajustar la configuració. Obre el fitxer de configuració amb un editor de text:
# nano miproyecto/settings.pyPrimer has de trobar la secció que configura l'accés a la base de dades. Començarà per DATABASES. La configuració del fitxer és per a una base de dades SQLite. Ja hem creat una base de dades PostgreSQL per al nostre projecte, de manera que hem d'ajustar la configuració.
Canvia la configuració amb la informació de la base de dades PostgreSQL. Després has de dir a Django que utilitzi l'adaptador psycopg2adaptor que has instal·lat amb pip. Has de proporcionar el nom, l'usuari i la contrasenya de la base de dades, i després indicar que la base de dades és local. Pots deixar PORT com una cadena buida, per exemple ~/miproyecto/miproyecto/settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'miproyecto',
'USER': 'usuariomiproyecto',
'PASSWORD': 'contraseña',
'HOST': 'localhost',
'PORT': '',
}
} El pas següent serà anar al final del fitxer i afegir el valor que indica on s'han de desar els fitxers estàtics. Això és necessari perquè NGINX pugui gestionar les peticions d'aquests objectes. La línia següent diu a Django que els posi en un directori anomenat “static”, al directori base del projecte:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')Desa i tanca el fitxer quan hagis acabat els canvis.
Completar la configuració inicial del projecte
Ara podem migrar l'esquema inicial de la base de dades a la nostra base de dades PostgreSQL utilitzant l'script de gestió:
# cd ~/miproyecto
# ./manage.py makemigrations
# ./manage.py migrateCrea un usuari administratiu per al projecte escrivint:
# ./manage.py createsuperuserHauràs de seleccionar un nom d'usuari, proporcionar una adreça electrònica i seleccionar i confirmar una contrasenya.
Podràs recollir tot el contingut estàtic a la ubicació del directori que has configurat escrivint:
# ./manage.py collectstaticHauràs de confirmar aquesta operació. Els fitxers estàtics es desaran en un directori anomenat “static” dins del directori del projecte.
Per poder fer les proves ara, caldrà que el port 8000 estigui obert al servidor. Comprova si el port ja està obert per al teu servidor i, si no és així, obre'l seguint aquest altre article de la nostra base de coneixement:
Administrar regles d'un perfil de tallafoc del tauler de client
Un cop el port estigui obert, podràs provar el projecte iniciant el servidor de desenvolupament de Django amb l'ordre:
# ./manage.py runserver 0.0.0.0:8000Ara, per comprovar-ho, has d'accedir des de qualsevol navegador al teu domini o a la IP del servidor, seguit del port 8000: http://IP.DE.TU.SERVIDOR:8000
Hauries de veure la pàgina per defecte de Django:
Si afegeixes /admin al final de l'URL a la barra d'adreces, podràs accedir-hi amb el nom d'usuari administratiu i la contrasenya que has creat amb l'ordre “createsuperuser”
Després d'autenticar-te, podràs accedir a la interfície d'administració per defecte de Django:
Quan hagis acabat d'explorar la interfície, prem “CTRL+C” a la finestra de la consola del servidor per aturar el servidor de desenvolupament.
Provar la capacitat de Gunicorn de servir el projecte
L'última cosa que volem fer abans de sortir de l'entorn virtual és provar Gunicorn per assegurar-nos que pot servir l'aplicació. Ho podem fer fàcilment escrivint:
# cd ~/miproyecto
# gunicorn -bind 0.0.0.0:8000 miproyecto.wsgi:applicationAixò iniciarà Gunicorn a la mateixa interfície en què s'executa el servidor de desenvolupament de Django. Pots tornar enrere i provar l'aplicació de nou. Tingues en compte que la interfície d'administració no tindrà cap estil aplicat, ja que Gunicorn no coneix el contingut estàtic responsable d'això.
Has passat un mòdul a Gunicorn especificant el camí relatiu del fitxer wsgi.py de Django, que és el punt d'entrada a la nostra aplicació, utilitzant la sintaxi de mòduls de Python. Dins d'aquest fitxer es defineix una funció anomenada “application”, que s'utilitza per comunicar-se amb l'aplicació.
Quan hagis acabat la prova, prem “CTRL-C” a la finestra de la consola del servidor per aturar Gunicorn.
Ara ja has acabat la configuració de l'aplicació Django. Pots sortir de l'entorn virtual escrivint: “deactivate”
Crear un fitxer de servei de systemd per a Gunicorn
Ja has provat que Gunicorn pot interactuar amb l'aplicació Django, però cal implementar una manera més robusta d'iniciar i aturar el servidor de l'aplicació. Per aconseguir-ho, has de crear un fitxer de servei de systemd.
Crea i obre un fitxer de servei de systemd per a Gunicorn amb privilegis sudo en un editor de text:
# sudo vi /etc/systemd/system/gunicorn.serviceComença amb la secció [Unit], que s'utilitza per especificar metadades i dependències. Posa-hi una descripció del servei i indica al sistema d'inicialització que només l'iniciï després que s'hagi assolit l'objectiu de xarxa:
[Unit]
Description=gunicorn daemon
After=network.targetEl pas següent serà obrir la secció [Service]. Hi especificarem l'usuari i el grup amb què volem que s'executi el procés. Has d'indicar el teu usuari d'accés habitual, ja que és el propietari de tots els fitxers rellevants. Com a grup, indica “www-data” perquè Nginx es pugui comunicar fàcilment amb Gunicorn.
A continuació hauràs de mapar el directori de treball i especificar l'ordre que utilitzaràs per iniciar el servei. En aquest cas, has d'especificar el camí complet a l'executable de Gunicorn, que està instal·lat dins de l'entorn virtual. L'has de vincular al sòcol Unix dins del directori del projecte, ja que Nginx està instal·lat al mateix servidor. Això és més segur i ràpid que utilitzar un port de xarxa. També és possible especificar aquí qualsevol ajust opcional de Gunicorn. Per exemple, a continuació hem especificat 3 processos de treball:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=finn
Group=www-data
WorkingDirectory=/home/finn/miproyecto
ExecStart=/home/finn/miproyecto/miproyectoentorno/bin/gunicorn --workers 3 --bind unix:/home/finn/miproyecto/miproyecto.sock miproyecto.wsgi:applicationFinalment, has d'afegir la secció [Install]. Això indicarà al sistema a què ha de vincular el servei si el pots iniciar durant l'arrencada. Aquest servei s'ha d'iniciar quan el sistema multiusuari habitual estigui engegat i en funcionament:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=finn
Group=www-data
WorkingDirectory=/home/finn/miproyecto
ExecStart=/home/finn/miproyecto/miproyectoentorno/bin/gunicorn --workers 3 --bind unix:/home/finn/miproyecto/miproyecto.sock miproyecto.wsgi:application
[Install]
WantedBy=multi-user.targetAmb això, el fitxer de servei de systemd estarà complet. Desa'l i tanca'l. Ara pots iniciar el servei de Gunicorn que has creat i habilitat perquè s'iniciï durant l'arrencada:
# sudo systemctl start gunicorn && sudo systemctl enable gunicornConfigurar Nginx en Proxy Pass per a Gunicorn
Ara que Gunicorn està configurat, hauràs de configurar Nginx per passar trànsit al procés.
Comença creant i obrint un bloc de servidor nou al directori sites-available de Nginx:
# sudo vi /etc/nginx/sites-available/miproyectoDins del fitxer has d'obrir un bloc de servidor nou. Comença especificant que aquest bloc ha d'escoltar al port 80 i que ha de respondre al nom de domini del nostre servidor o a l'adreça IP:
server {
listen 80;
server_name server_domain_or_IP;
}A continuació, has de dir a Nginx que ignori qualsevol problema per trobar una favicon. També has d'indicar on trobar els fitxers estàtics que has desat al directori ~/miproyecto/static. Tots aquests fitxers tenen un prefix URI estàndard “/static”, de manera que pots crear un bloc d'ubicació que coincideixi amb aquestes peticions:
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/finn/miproyecto;
}
}Per acabar, has de crear un bloc location / {} , perquè coincideixi amb totes les altres sol·licituds. Dins d'aquesta ubicació, inclourem el fitxer estàndard proxy_params inclòs amb la instal·lació de Nginx, i després passarem el trànsit al sòcol que ha creat el nostre procés de Gunicorn:
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/finn/miproyecto;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/finn/miproyecto/miproyecto.sock;
}
}Desa i tanca el fitxer quan hagis acabat. Ara pots habilitar el fitxer enllaçant-lo al directori sites-enabled:
# sudo ln -s /etc/nginx/sites-available/miproyecto /etc/nginx/sites-enabledProva la configuració de Nginx per cercar errors de sintaxi amb l'ordre:
# sudo nginx -tSi no apareix cap error, reinicia Nginx:
# sudo systemctl restart nginxFinalment, cal obrir el tallafoc del servidor per al trànsit habitual al port 80 si encara no s'ha fet. Com que ja no necessitem accés al servidor de desenvolupament, pots eliminar la regla del port 8000 que havies creat abans.
Ara hauries de poder anar al teu domini o a la IP del servidor i veure la teva aplicació.