Django és un entorn de treball que et pot ajudar a fer que una aplicació Python o el teu lloc web arrenqui. A més, Django inclou un servidor de desenvolupament simplificat per provar el codi localment, però qualsevol servei en producció requereix un servidor web més segur i potent.
En aquest article t'expliquem com instal·lar i configurar alguns components en un VPS amb la imatge de HestiaCP(Ubuntu 20.04) per donar suport a les aplicacions Django i servir-les. Primer, crearàs una base de dades Mysql i configuraràs el servidor d'aplicacions Gunicorn perquè interactuï amb les aplicacions. Després, crearàs unes plantilles a HestiaCP per configurar Nginx com a servidor intermediari invers per a Gunicorn, cosa que et permetrà aprofitar les seves característiques de seguretat i rendiment per servir les aplicacions.
Instal·lar els paquets necessaris
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é utilitzaràs el gestor de paquets pip de Python per instal·lar components addicionals.
Per fer-ho, hauràs d'executar les ordres següents:
# apt update && apt upgrade -y
# apt install -y python3-pip python3-dev libmysqlclient-dev pkg-configAixò instal·larà pip, els fitxers de desenvolupament de Python necessaris per instal·lar Gunicorn més endavant i les biblioteques per poder interactuar amb Mysql.
Crear la base de dades Mysql
Accedeix al tauler d'administració d'HestiaCP a l'URL https://ip_pública:8083, ves a "DB" i fes clic a "Add Databases".
A la finestra nova, estableix un nom de base de dades, un nom d'usuari i una contrasenya i fes clic a save.
Amb això ja tindràs la base de dades preparada.
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·la els requisits de Python dins d'un entorn virtual per facilitar-ne la gestió.
Per fer-ho, primer necessites accés a l'ordre virtualenv. La pots instal·lar amb pip.
# pip3 install virtualenvAmb virtualenv instal·lat, pots començar a preparar el projecte. Crea el directori on desaràs els fitxers del projecte dins de la carpeta del teu domini i accedeix-hi:
# cd /home/nombre_usuario/web/nombre_dominio/public_html
# 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. Ho pots utilitzar per instal·lar i configurar un entorn aïllat per al projecte.
Abans d'instal·lar els requisits de Python per al teu projecte, has d'activar l'entorn virtual. Ho pots fer executant:
# 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 un aspecte semblant a aquest:
(miproyectoentorno)user@host:~/miproyecto$.Amb l'entorn virtual actiu, instal·la Django, Gunicorn i l'adaptador mysqlclient de Mysql amb la instància local de pip:
# pip install django gunicorn mysqlclientIndependentment 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 nou de Django
Com que ja tens un directori del projecte, has d'indicar 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 startproject miproyectoAjustar la configuració del projecte
El primer que has de fer un cop creats els fitxers és ajustar la configuració. Obre el fitxer de configuració amb un editor de text:
# vi miproyecto/miproyecto/settings.pyPrimer has de trobar la secció que configura l'accés a la base de dades. Comença per DATABASES. La configuració del fitxer és per a una base de dades SQLite. Ja hem creat una base de dades Mysql per al projecte, de manera que has d'ajustar la configuració.
Canvia la configuració amb la informació de la base de dades Mysql. Després has d'indicar a Django que utilitzi l'adaptador Mysqlclient 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, com en aquest exemple de "miproyecto/miproyecto/settings.py":
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'admin_django',
'USER': 'admin_app',
'PASSWORD': 'contraseña',
'HOST': 'localhost',
'PORT': '',
}
} NAME i USER han de coincidir amb el nom i l'usuari que HestiaCP va assignar internament quan vas crear la base de dades anteriorment:
Ves al final del fitxer i afegeix 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 indica a Django que els col·loqui en un directori anomenat “static”, dins del directori base del projecte:
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')Al principi del document també has d'afegir:
import os
Finalment, hauràs de permetre totes les connexions a "Allowed Host" o indicar quines IP es poden connectar:
ALLOWED_HOSTS = ['*',]Desa i tanca el fitxer quan hagis acabat els canvis.
Ara pots migrar l'esquema inicial de la base de dades a la base de dades MySQL amb l'script de gestió:
# cd miproyecto
# ./manage.py makemigrations
# ./manage.py migrateCrea un usuari administrador per al projecte escrivint:
# ./manage.py createsuperuserHauràs de triar un nom d'usuari, proporcionar una adreça electrònica i triar i confirmar una contrasenya.
Pots 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, cal que el port 8000 estigui obert al servidor i al tauler d'HestiaCP. Comprova si el port ja està obert per al teu servidor i, si no ho està, obre'l seguint aquest altre article de la nostra base de coneixement:
Administrar regles d'un perfil de tallafoc del tauler de client
A HestiaCP, ves a Configuración -> Firewall -> Add rule i crea una regla com la següent:
Un cop hagis obert el port, 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, accedeix des de qualsevol navegador al teu domini o a la IP del servidor, seguida 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 administrador 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.
Comprovar si Gunicorn pot servir el projecte
L'últim que has de fer abans de sortir de l'entorn virtual és provar Gunicorn per assegurar-te que pot servir l'aplicació. Ho pots fer fàcilment escrivint:
# cd miproyecto
# gunicorn --bind 0.0.0.0:8000 miproyecto.wsgi:applicationAixò iniciarà Gunicorn a la mateixa interfície on 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 gestiona el contingut estàtic que se n'encarrega.
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ó, amb 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 comprovat 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 amb un editor de text:
# vi /etc/systemd/system/gunicorn.serviceComença amb la secció [Unit], que s'utilitza per especificar metadades i dependències. Afegeix-hi una descripció del servei i indica al sistema d'inicialització que només l'iniciï un cop s'hagi assolit l'objectiu de xarxa:
[Unit]
Description=gunicorn daemon
After=network.targetEl pas següent és obrir la secció [Service]. Especifica-hi l'usuari i el grup amb què vols 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 d'establir el directori de treball i especificar l'ordre que utilitzaràs per iniciar el servei. En aquest cas, has d'especificar el camí complet de 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. Aquí també pots especificar qualsevol ajust opcional de Gunicorn. Per exemple, a continuació hem especificat 3 processos de treball:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/home/admin/web/c5ce05be-dedd-4994-9169-14ba6ed0218e.clouding.host/public_html/miproyecto/miproyecto
ExecStart=/home/admin/web/c5ce05be-dedd-4994-9169-14ba6ed0218e.clouding.host/public_html/miproyecto/miproyectoentorno/bin/gunicorn --workers 3 --bind unix:/home/admin/web/c5ce05be-dedd-4994-9169-14ba6ed0218e.clouding.host/public_html/miproyecto/miproyecto.sock miproyecto.wsgi:applicationFinalment, has d'afegir la secció [Install]. Això indicarà al sistema a què ha de vincular el servei si l'habilites perquè s'iniciï durant l'arrencada. Aquest servei s'ha d'iniciar quan el sistema multiusuari habitual estigui en funcionament:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/home/admin/web/c5ce05be-dedd-4994-9169-14ba6ed0218e.clouding.host/public_html/miproyecto/miproyecto
ExecStart=/home/admin/web/c5ce05be-dedd-4994-9169-14ba6ed0218e.clouding.host/public_html/miproyecto/miproyectoentorno/bin/gunicorn --workers 3 --bind unix:/home/admin/web/c5ce05be-dedd-4994-9169-14ba6ed0218e.clouding.host/public_html/miproyecto/miproyecto.sock miproyecto.wsgi:application
[Install]
WantedBy=multi-user.target
Amb 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 habilitar-lo perquè s'iniciï durant l'arrencada:
# sudo systemctl start gunicorn
# sudo systemctl enable gunicornConfigurar Nginx amb Proxy Pass per a Gunicorn
Ara que Gunicorn està configurat, hauràs de configurar Nginx perquè reenviï el trànsit al procés. Com que treballem a HestiaCP, ho fem creant una plantilla per a Django. Per fer-ho, crearem els fitxers següents:
# touch /usr/local/hestia/data/templates/web/nginx/django.tpl
# touch /usr/local/hestia/data/templates/web/nginx/django.stpl
# chmod 755 /usr/local/hestia/data/templates/web/nginx/django.tpl
# chmod 755 /usr/local/hestia/data/templates/web/nginx/django.stpl
Afegeix el codi següent al fitxer django.tpl:
#=======================================================================#
# Plantilla per defecte de domini web #
# NO MODIFIQUIS AQUEST FITXER! ELS CANVIS ES PERDRAN EN RECONSTRUIR ELS DOMINIS #
#=======================================================================#
server {
listen %ip%:%proxy_port%;
server_name %domain_idn% %alias_idn%;
include %home%/%user%/conf/web/%domain%/nginx.forcessl.conf*;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root %home%/%user%/web/%domain%/public_html/miproyecto/miproyecto;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For %proxy_add_x_forwarded_for%;
proxy_set_header X-Forwarded-Proto %scheme%;
proxy_pass http://unix:%home%/%user%/web/%domain%/public_html/miproyecto/miproyecto.sock;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include %home%/%user%/conf/web/%domain%/nginx.conf_*;
}Afegeix el codi següent al fitxer django.stpl:
#=======================================================================#
# Plantilla per defecte de domini web #
# NO MODIFIQUIS AQUEST FITXER! ELS CANVIS ES PERDRAN EN RECONSTRUIR ELS DOMINIS #
#=======================================================================#
server {
listen %ip%:%proxy_ssl_port% ssl http2;
server_name %domain_idn% %alias_idn%;
ssl_certificate %ssl_pem%;
ssl_certificate_key %ssl_key%;
ssl_stapling on;
ssl_stapling_verify on;
error_log /var/log/%web_system%/domains/%domain%.error.log error;
include %home%/%user%/conf/web/%domain%/nginx.hsts.conf*;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root %home%/%user%/web/%domain%/public_html/miproyecto/miproyecto;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For %proxy_add_x_forwarded_for%;
proxy_set_header X-Forwarded-Proto %scheme%;
proxy_pass http://unix:%home%/%user%/web/%domain%/public_html/miproyecto/miproyecto.sock;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}Utilitzar les plantilles creades al tauler d'HestiaCP
Accedeix al tauler d'HestiaCP https://nombre_host:8083 amb l'usuari "admin" i la contrasenya que pots veure al tauler de client.
Dins del tauler d'Hestia, ves a "WEB" i després fes clic al domini on vulguis utilitzar la plantilla de Django.
A l'apartat "Soporte Proxy NGINX", fes clic al desplegable que per defecte mostra "default" i selecciona "django".
Finalment, cal obrir el port 80 si encara no està obert. 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 accedir al teu domini i veure l'aplicació.