Guia Detallada de Desplegament d'Aplicacions Python (Django, Flask, FastAPI) sobre Apache
Aquesta és una guia completa per desplegar aplicacions Python utilitzant el servidor web Apache. Cobriré els tres frameworks més populars amb exemples pràctics i referències oficials.
1. Desplegament de Django amb Apache i mod_wsgi
Django amb Apache és una configuració provada i fiable per a entorns de producció.
1.1 Instal·lació de Components Necessaris
Referència: Django funciona amb qualsevol versió d'Apache que suporti mod_wsgi, que és un mòdul d'Apache que pot allotjar qualsevol aplicació Python WSGI, inclòs Django.
Font: Django Documentation - mod_wsgi
1.2 Estructura del Projecte Django
Suposem que el teu projecte Django està ubicat a /home/usuari/projecte_django/:
projecte_django/
├── manage.py
├── projecte_django/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── app1/
1.3 Configuració del Fitxer WSGI
Des de Django versió 1.4, startproject crea automàticament un fitxer wsgi.py. El fitxer wsgi.py típic té aquest aspecte:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projecte_django.settings')
application = get_wsgi_application()
Font: Django Documentation - WSGI
1.4 Configuració d'Apache
Crea un fitxer de configuració de VirtualHost a /etc/apache2/sites-available/django-app.conf:
<VirtualHost *:80>
ServerName el-teu-domini.com
ServerAdmin admin@el-teu-domini.com
# Configuració d'arxius estàtics
Alias /static /home/usuari/projecte_django/static
<Directory /home/usuari/projecte_django/static>
Require all granted
</Directory>
Alias /media /home/usuari/projecte_django/media
<Directory /home/usuari/projecte_django/media>
Require all granted
</Directory>
# Configuració WSGI
WSGIDaemonProcess projecte_django python-home=/home/usuari/projecte_django/venv python-path=/home/usuari/projecte_django
WSGIProcessGroup projecte_django
WSGIScriptAlias / /home/usuari/projecte_django/projecte_django/wsgi.py
<Directory /home/usuari/projecte_django/projecte_django>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
ErrorLog ${APACHE_LOG_DIR}/django_error.log
CustomLog ${APACHE_LOG_DIR}/django_access.log combined
</VirtualHost>
Nota important: La directiva WSGIDaemonProcess configura el mode daemon, que és la configuració recomanada, i permet especificar el python-home per al virtual environment.
Font: DigitalOcean - Django with Apache
1.5 Configuració de settings.py
Modifica el fitxer settings.py:
DEBUG = False
ALLOWED_HOSTS = ['el-teu-domini.com', 'www.el-teu-domini.com']
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
1.6 Recollida d'Arxius Estàtics i Activació
# Recollir arxius estàtics
python manage.py collectstatic
# Activar el lloc
sudo a2ensite django-app.conf
sudo systemctl reload apache2
Referència oficial: Documentació Django - Desplegament amb Apache i mod_wsgi
2. Desplegament de Flask amb Apache i mod_wsgi
Flask també utilitza mod_wsgi però requereix crear manualment el fitxer WSGI.
2.1 Instal·lació de Components
Referència: mod_wsgi és un mòdul del servidor HTTP Apache que proporciona una interfície compatible amb WSGI per allotjar aplicacions web basades en Python sota Apache.
Font: OpenSourceForYou - Deploying Flask with Apache
2.2 Estructura del Projecte Flask
2.3 Exemple d'Aplicació Flask (app.py)
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hola món des de Flask!"
if __name__ == '__main__':
app.run()
2.4 Creació del Fitxer WSGI
Crea wsgi.py:
#!/usr/bin/python3
import sys
import logging
# Configurar logging
logging.basicConfig(stream=sys.stderr)
# Afegir el directori del projecte al path
sys.path.insert(0, '/var/www/projecte_flask')
# Importar l'aplicació Flask
from app import app as application
# Configurar secret key
application.secret_key = 'clau_secreta_segura'
Nota: El fitxer WSGI ha d'afegir el directori del projecte al sys.path i importar l'aplicació Flask com a application.
Font: Codementor - Flask with Apache
2.5 Configuració d'Apache
Crea /etc/apache2/sites-available/flask-app.conf:
<VirtualHost *:80>
ServerName el-teu-domini.com
ServerAdmin admin@el-teu-domini.com
WSGIDaemonProcess flask_app user=www-data group=www-data threads=5 python-home=/var/www/projecte_flask/venv
WSGIScriptAlias / /var/www/projecte_flask/wsgi.py
<Directory /var/www/projecte_flask>
WSGIProcessGroup flask_app
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
# Arxius estàtics
Alias /static /var/www/projecte_flask/static
<Directory /var/www/projecte_flask/static>
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/flask_error.log
CustomLog ${APACHE_LOG_DIR}/flask_access.log combined
</VirtualHost>
Important: La directiva WSGIApplicationGroup %{GLOBAL} força que totes les aplicacions WSGI s'executin en el primer intèrpret creat pel procés, prevenint problemes amb extensions C de Python.
Font: Oxford Protein Informatics - Multiple Flask Apps
2.6 Activació
Referències: - Documentació oficial Flask - mod_wsgi - Tutorial Flask amb Apache
3. Desplegament de FastAPI amb Apache
Important: FastAPI només funciona amb servidors ASGI, no amb servidors WSGI com mod_wsgi directament. Hi ha dues opcions principals:
Font: Stack Overflow - FastAPI Apache Error
Opció 1: Apache com a Reverse Proxy (RECOMANAT)
Aquesta és la millor opció per a producció.
3.1 Instal·lació
3.2 Crear un Servei Systemd per Uvicorn
Crea /etc/systemd/system/fastapi.service:
[Unit]
Description=FastAPI Application
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/fastapi_app
Environment="PATH=/var/www/fastapi_app/venv/bin"
ExecStart=/var/www/fastapi_app/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 4
[Install]
WantedBy=multi-user.target
3.3 Aplicació FastAPI (main.py)
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hola món des de FastAPI!"}
3.4 Configuració d'Apache com a Reverse Proxy
Activa els mòduls necessaris:
Crea /etc/apache2/sites-available/fastapi-app.conf:
<VirtualHost *:80>
ServerName el-teu-domini.com
ServerAdmin admin@el-teu-domini.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
ErrorLog ${APACHE_LOG_DIR}/fastapi_error.log
CustomLog ${APACHE_LOG_DIR}/fastapi_access.log combined
</VirtualHost>
Referència: Per executar FastAPI en Apache2, es pot utilitzar una configuració de reverse proxy, on Apache2 actua com a porta d'enllaç per reenviar peticions a l'aplicació FastAPI utilitzant la directiva ProxyPass.
Font: TopMiniSite - FastAPI on Apache2
3.5 Activació
# Iniciar servei FastAPI
sudo systemctl daemon-reload
sudo systemctl start fastapi
sudo systemctl enable fastapi
# Activar lloc Apache
sudo a2ensite fastapi-app.conf
sudo systemctl reload apache2
Opció 2: Utilitzar a2wsgi (NO RECOMANAT per producció)
És possible utilitzar adaptadors com a2wsgi per convertir aplicacions ASGI a WSGI, però això elimina els beneficis de l'async de FastAPI i no és recomanable.
Font: Stack Overflow - FastAPI on Shared Hosting
Si necessites utilitzar-ho (per exemple, en hosting compartit):
Crea wsgi.py:
from fastapi import FastAPI
from a2wsgi import ASGIMiddleware
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hola món!"}
application = ASGIMiddleware(app)
Referències: - Exemple FastAPI amb Apache i mod_wsgi - Guia WSGI per a FastAPI
4. Consells Generals i Resolució de Problemes
4.1 Permisos
4.2 Errors Comuns
Si obtens un UnicodeEncodeError quan puges arxius amb noms que contenen caràcters no-ASCII, assegura't que Apache està configurat per suportar codificació UTF-8:
Font: Django Documentation
4.3 Visualitzar Logs
# Errors d'Apache
sudo tail -f /var/log/apache2/error.log
# Logs específics de l'aplicació
sudo tail -f /var/log/apache2/nom_app_error.log
4.4 Comprovar Configuració
# Verificar sintaxi
sudo apache2ctl configtest
# Verificar mòduls carregats
sudo apache2ctl -M | grep wsgi
5. Resum de Recomanacions
| Framework | Mètode Recomanat | Dificultat | Rendiment |
|---|---|---|---|
| Django | mod_wsgi directe | Baixa | Excel·lent |
| Flask | mod_wsgi directe | Baixa | Excel·lent |
| FastAPI | Reverse Proxy + Uvicorn | Mitjana | Excel·lent |
Conclusió: Per Django i Flask, mod_wsgi és la solució estàndard i ben documentada. Per FastAPI, utilitza sempre Apache com a reverse proxy amb Uvicorn executant-se com a servei systemd.
Referències Completes
Django
- Documentació oficial Django - mod_wsgi
- DigitalOcean - Django with Apache
- StudyGyaan - Django with Apache
Flask
- Documentació oficial Flask - mod_wsgi
- OpenSourceForYou - Flask with Apache
- Oxford Protein Informatics - Multiple Flask Apps
FastAPI
- GitHub - FastAPI with Apache example
- Medium - Running FastAPI with WSGI
- Stack Overflow - FastAPI on Apache2
Document creat per a alumnes de Cicles Formatius de Grau Superior en Informàtica (ASIR/DAW)
Última actualització: Octubre 2025