Salta el contingut

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

# Per Python 3
sudo apt-get update
sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3

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

sudo apt-get update
sudo apt-get install python3 python3-pip apache2 libapache2-mod-wsgi-py3

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

projecte_flask/
├── app.py
├── wsgi.py
├── requirements.txt
└── venv/

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ó

sudo a2ensite flask-app.conf
sudo systemctl reload apache2

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ó

sudo apt-get update
sudo apt-get install python3 python3-pip apache2

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:

sudo a2enmod proxy proxy_http

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):

pip install a2wsgi

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

sudo chown -R www-data:www-data /ruta/al/projecte
sudo chmod -R 755 /ruta/al/projecte

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:

# Afegir a /etc/apache2/envvars
export LANG='en_US.UTF-8'
export LC_ALL='en_US.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

Flask

FastAPI


Document creat per a alumnes de Cicles Formatius de Grau Superior en Informàtica (ASIR/DAW)

Última actualització: Octubre 2025