Comencem pel principi, què és Django?
Django és un framework web que t'ajuda a fer que una aplicació Python o el teu lloc web despegui. Django inclou un servidor de desenvolupament simplificat per provar el codi localment, però per a qualsevol servei en producció es necessita un servidor web més segur i potent.
En aquest post et contarem com instal·lar i configurar alguns components a Ubuntu 24.04 per donar suport i servir aplicacions Django. Per 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 proxy 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 és una mica de feina, però ja veuràs com un cop fet, estaràs molt satisfet amb el resultat 🙂
Requisits
- Un servidor VPS Cloud funcionant amb Ubuntu 24.04.
- Un usuari que no sigui root, amb privilegis de “sudo” i permisos 751 al directori home d'aquest usuari. En aquest exemple usem un usuari amb privilegis de "sudo" anomenat finn.
Instal·lar els paquets dels repositoris d'Ubuntu.
Per començar el procés, hauràs de descarregar i instal·lar tots els elements que necessites dels repositoris d'Ubuntu. Després utilitzarem també el gestor de paquets pip de Python per instal·lar components addicionals.
Per això, hauràs d'actualitzar l'índex de paquets i després descarregar i instal·lar els paquets necessaris.
$ sudo apt update
$ sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx -y
Això instal·larà pip, els arxius de desenvolupament Python necessaris per instal·lar Gunicorn més endavant, el sistema de base de dades Postgres, i les llibreries necessàries per interactuar amb ell, i el servidor web Nginx.
Crear la base de dades PostgreSQL i usuaris.
Ara anem a crear la base de dades i l'usuari de la base de dades, per a la nostra aplicació de 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 sessió sense autenticació addicional.
Durant la instal·lació de Postgres, es crea un usuari del sistema operatiu anomenat postgres per correspondre a l'usuari administratiu de PostgreSQL. Has d'utilitzar aquest usuari per realitzar tasques administratives. Pots usar “sudo” i entrar al nom d'usuari amb l'opció “-u”.
Inicia sessió en una sessió interactiva de Postgres escrivint:
$ sudo -u postgres psql
Ara et apareixerà un prompt de PostgreSQL, on podràs configurar els teus requisits.
Primer, crea una base de dades per al teu projecte:
postgres=# CREATE DATABASE miproyecto;
postgres=# 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 base de dades perquè els valors correctes no hagin de ser consultats i configurats cada vegada que es faci una connexió.
Has d'establir la codificació per defecte a UTF-8, que és la que espera Django. També has d'establir el règim d'aïllament de les transaccions de “read committed”, el qual bloqueja la lectura de transaccions no confirmades. Per últim, hauràs d'establir la zona horària.
De manera predeterminada, els projectes de Django s'estableixen per utilitzar UTC. Aquestes són totes les recomanacions del propi projecte de Django:
postgres=# ALTER ROLE usuariomiproyecto SET client_encoding TO 'utf8';
postgres=# ALTER ROLE usuariomiproyecto SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE usuariomiproyecto SET timezone TO 'UTC';
Ara li pots donar accés al teu nou usuari per administrar la teva nova base de dades:
postgres=# ALTER DATABASE miproyecto OWNER TO usuariomiproyecto;
Quan hagis acabat, surt del prompt de PostgreSQL escrivint “\q”
Crear un entorn virtual de Python per al teu projecte
Ara que ja tens la teva base de dades, pots treballar en la resta de requisits necessaris per deixar el projecte llest. Anem a instal·lar els requisits del nostre Python dins d'un entorn virtual per facilitar la gestió.
En primer lloc, instal·la el paquet d'entorn virtual de Python amb la següent comanda:
$ sudo apt install python3-venv -y
Crea ara el directori on guardar els arxius del teu projecte, i accedeix a ell:
$ mkdir ~/miproyecto
$ cd ~/miproyecto
Dins del directori del projecte, crea un entorn virtual de Python amb la comanda:
$ python3 -m venv venv
Després, activa l'entorn virtual amb la comanda que veus a continuació:
$ source venv/bin/activate
El prompt hauria de canviar per indicar que ara estàs operant dins d'un entorn virtual de Python. Hauria de veure's més o menys així:
(venv)user@host:~/miproyecto$
Amb l'entorn virtual actiu, instal·laràs Django, Gunicorn i l'adaptador psycopg2 de PostgreSQL amb la instància local de pip:
(venv)user@host:~/miproyecto$ pip install django gunicorn psycopg2
Crear i configurar un nou projecte de Django
Amb els components de Python instal·lats, pots crear els fitxers del projecte de Django. Com ja tens un directori del projecte, has de dir-li a Django que instal·li els arxius al mateix. 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.
(venv)user@host:~/miproyecto$ django-admin startproject miproyecto .
El punt final indica a django-admin que creï el projecte al directori actual.
Ajustar les configuracions del projecte
El primer que has de fer amb els teus arxius de projecte recentment creats és ajustar les configuracions. Obre l'arxiu de configuració amb un editor de text:
(venv)user@host:~/miproyecto$ nano miproyecto/settings.py
Primerament has de trobar la secció que configura l'accés a la base de dades. Aquesta començarà per DATABASES. La configuració a l'arxiu és per a una base de dades SQLite. Ja hem creat una base de dades PostgreSQL per al nostre projecte, per la qual cosa cal 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 es troba en local. Pots deixar el punt PORT com una cadena buida, per exemple miproyecto/miproyecto/settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'miproyecto',
'USER': 'usuariomiproyecto',
'PASSWORD': 'contrasenya',
'HOST': 'localhost',
'PORT': '',
}
}
A ALLOWED_HOSTS necessitaràs afegir la llista d'adreces IP o noms de domini que tindran permís per accedir a la instància de Django.
ALLOWED_HOSTS = ['IP_o_nom_del_servidor', 'IP_o_nom_del_servidor_dos, ...]
El següent serà anar a la part final de l'arxiu i afegir el valor on s'han de guardar els arxius estàtics. Això és necessari perquè Nginx pugui gestionar les peticions per aquests objectes. La línia següent li diu a Django que els posi en un directori anomenat “static”, al directori base del projecte:
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'static/'
Desa i tanca l'arxiu quan hagis acabat els canvis.
Completar la configuració inicial del projecte
Ara, podem migrar l'esquema de base de dades inicial a la nostra base de dades PostgreSQL utilitzant el script de gestió:
(venv)user@host:~/miproyecto$ cd ~/miproyecto
(venv)user@host:~/miproyecto$ ./manage.py makemigrations
(venv)user@host:~/miproyecto$ ./manage.py migrate
Crea un usuari administrador per al projecte escrivint:
(venv)user@host:~/miproyecto$ ./manage.py createsuperuser
Haureu de seleccionar un nom d'usuari, proporcionar una adreça de correu electrònic, i seleccionar i confirmar una contrasenya.
Podràs recollir tot el contingut estàtic a la ubicació del directori que has configurat escrivint:
(venv)user@host:~/miproyecto$ ./manage.py collectstatic
Els fitxers estàtics es guardaran en un directori anomenat “static” dins del directori del projecte.
Per poder fer ara les proves, serà necessari que el port 8000 estigui obert al teu servidor. Comprova si el port ja està obert per al teu servidor, i en cas que no sigui així, obre'l seguint aquest altre article de la nostra base de coneixement:
Administrar normes d'un perfil de tallafocs del panell de client
Un cop el port estigui obert, podràs provar el projecte iniciant el servidor de desenvolupament de Django amb el comandament:
(venv)user@host:~/miproyecto$ ./manage.py runserver 0.0.0.0:8000
Ara, per comprovar-ho has d'accedir a través de qualsevol navegador al teu domini, o a la IP del teu 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'adreça URL a la barra d'adreces, podràs accedir amb el nom d'usuari administrador i la contrasenya que vas crear abans amb el comandament “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, fes “CTRL+C” a la finestra de la consola del teu servidor per aturar el servidor de desenvolupament.
Provar la capacitat de Gunicorn per 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ó. Podem fer-ho fàcilment escrivint:
$ cd ~/miproyecto
$ gunicorn –b 0.0.0.0:8000 miproyecto.wsgi:application
Això iniciarà Gunicorn en la mateixa interfície que en la qual el servidor de desenvolupament de Django s'executa. 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 a Gunicorn un mòdul mitjançant la especificació de la ruta relativa del fitxer wsgi.py de Django, que és el punt d'entrada a la nostra aplicació, utilitzant la sintaxi del mòdul 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, fes “CTRL-C” a la finestra de la consola del teu 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 un fitxer de servei de systemd per a Gunicorn amb un editor de text:
$ sudo vi /etc/systemd/system/gunicorn.service
Comença amb la secció [Unit], que s'utilitza per especificar metadades i dependències. Posa una descripció del teu servei aquí i indica al sistema init que només iniciï això després que el destí de xarxa hagi estat aconseguit:
[Unit]
Description=gunicorn daemon
After=network.target
El següent serà obrir la secció [Service]. En ella especificarem l'usuari i grup en el qual volem que corri el procés. Has d'indicar el teu usuari d'accés regular, ja que és el propietari de tots els fitxers rellevants. Per grup, indica “www-data” perquè Nginx pugui comunicar-se fàcilment amb Gunicorn.
A continuació hauràs de mapar el directori de treball i especificar el comandament que utilitzaràs per iniciar el servei. En aquest cas, has d'especificar la ruta completa al executable de Gunicorn, que està instal·lat dins del entorn virtual. Has de vincular-lo al socket de 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 qualsevol ajust opcional de Gunicorn aquí. Per exemple, a continuació hem especificat 3 processos de treball:
[Unit]
Description=gunicorn daemon
After=networking.target
[Service]
User=finn
Group=www-data
WorkingDirectory=/home/finn/miproyecto
ExecStart=/home/finn/miproyecto/venv/bin/gunicorn --workers 3 --bind unix:/home/finn/miproyecto/miproyecto.sock miproyecto.wsgi:application
Finalment, has d'afegir la secció [Install], indicant que s'ha de iniciar quan el sistema multi-usuari regular estigui en marxa. El fitxer complet quedaria així:
[Unit]
Description=gunicorn daemon
After=networking.target
[Service]
User=finn
Group=www-data
WorkingDirectory=/home/finn/miproyecto
ExecStart=/home/finn/miproyecto/venv/bin/gunicorn --workers 3 --bind unix:/home/finn/miproyecto/miproyecto.sock miproyecto.wsgi:application
[Install]
WantedBy=multi-user.target
Amb això, el teu 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ï en l'arrencada:
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
Configurar 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 nou bloc de servidor al directori sites-available de Nginx:
$ sudo vi /etc/nginx/sites-available/miproyecto
Dins del fitxer, obre un nou bloc de servidor. Comença especificant que aquest bloc ha de escoltar el 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 trobant un 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”, per la qual cosa pots crear un bloc de localització per coincidir amb aquestes sol·licituds:
server {
listen 80;
server_name server_domain_or_IP;
bash
Copiar código
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 nostres altres sol·licituds. Dins d'aquesta localització, inclourem el fitxer estàndard de proxy_params inclòs amb la instal·lació de Nginx, i llavors passarem el trànsit al socket que el nostre procés de Gunicorn ha creat:
server {
listen 80;
server_name server_domain_or_IP;
ruby
Copiar código
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-enabled
Prova la teva configuració de Nginx per buscar errors de sintaxi amb el comandament:
$ sudo nginx -t
Si no apareix cap error, reinicia Nginx:
$ sudo systemctl restart nginx
Finalment, és necessari obrir el tallafocs del servidor per al trànsit regular al port 80 si això 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 l'IP del teu servidor, i veure la teva aplicació.
Esperem haver-te ajudat amb aquest article. Ho has provat? Deixa'ns els teus comentaris! 🙂
Recorda, si tens consultes sobre aquesta o qualsevol altra qüestió relacionada amb els teus servidors a Clouding, no dubtis a escriure a suport@clouding.io ¡Estem al teu costat per al que necessitis!