Aplicaciones Web en Apache

Resumen de una línea

Ejecutar aplicaciones dinámicas: mod_php (integrado, prefork), PHP-FPM (separado, worker), Python/WSGI, alternativas modernas.

Información

mod_php (Integrado)

PHP ejecutado dentro del proceso Apache (módulo):

# Instalar
apt install apache2 php libapache2-mod-php
 
# Configura automáticamente
# /etc/apache2/mods-available/php.conf
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

Características:

  • PHP corre en procesos Apache (www-data)
  • $_SERVER['PHP_SELF'] contiene path
  • Acceso directo a ficheros (sin socket)
  • Require MPM prefork (threads no compatibles)

Ventajas:

  • Simple configuración
  • Sin socket (rápido)
  • Adecuado hosting compartido

Desventajas:

  • MPM prefork solo (ineficiente)
  • PHP con fallo mata proceso Apache
  • Memoria por request (cada proceso duplica PHP)

PHP-FPM (Recomendado)

PHP corre en proceso separado (FastCGI Process Manager):

Cliente → Apache → Socket/TCP → PHP-FPM
                     (proxy)

Instalación

# Instalar FPM
apt install php-fpm
 
# Socket unix (recomendado)
# /run/php/php7.4-fpm.sock (escucha socket)
 
# O puerto TCP
# localhost:9000

Configuración Apache

# Activar módulos
a2enmod proxy_fcgi
a2enmod setenvif
 
# /etc/apache2/sites-available/ejemplo.conf
<VirtualHost *:80>
    ServerName ejemplo.com
    DocumentRoot /var/www/ejemplo
    
    <FilesMatch ".+\.php$">
        SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

O con ProxyPassMatch:

<VirtualHost *:80>
    DocumentRoot /var/www/ejemplo
    
    ProxyPassMatch ^/(.+\.php)$ unix:/run/php/php7.4-fpm.sock|fcgi://localhost
</VirtualHost>

Ventajas:

  • MPM worker/event posible (eficiente)
  • PHP separado (fallo aislado)
  • Múltiples versiones PHP simultáneas
  • Escalable (múltiples FPM pools)

Desventajas:

  • Configuración más compleja
  • Socket/TCP overhead
  • Requiere módulos proxy

Configuración PHP

Directorios config PHP:

# Configuración global
/etc/php/7.4/cli/php.ini           # Línea de comandos
/etc/php/7.4/fpm/php.ini           # FPM
/etc/php/7.4/apache2/php.ini       # mod_php (si aplica)
 
# Extensiones
/etc/php/7.4/fpm/conf.d/           # Configuración adicional
/usr/lib/php/extensions/           # Módulos .so

Python + WSGI

Python requiere servidor WSGI separado (como Flask, Django):

# Instalar herramientas
apt install python3 python3-venv
 
# Crear entorno virtual
python3 -m venv /opt/myapp
source /opt/myapp/bin/activate
pip install flask
 
# Crear app Flask
# /opt/myapp/app.py
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello():
    return 'Hola'
 
if __name__ == '__main__':
    app.run()

Servir con Apache + gunicorn (WSGI server)

# Instalar gunicorn
pip install gunicorn
 
# Ejecutar en background
gunicorn -b 127.0.0.1:8000 app:app
 
# Systemd unit para auto-start
# /etc/systemd/system/myapp.service
[Unit]
Description=Flask App
After=network.target
 
[Service]
Type=notify
User=www-data
ExecStart=/opt/myapp/bin/gunicorn -b 127.0.0.1:8000 app:app
WorkingDirectory=/opt/myapp
 
[Install]
WantedBy=multi-user.target

Configuración Apache (proxy)

# /etc/apache2/sites-available/ejemplo.conf
<VirtualHost *:80>
    ServerName ejemplo.com
    
    ProxyPass / http://127.0.0.1:8000/
    ProxyPassReverse / http://127.0.0.1:8000/
</VirtualHost>
 
# Habilitar módulos
a2enmod proxy_http

Node.js / Express

Similar a Python, requiere servidor Node separado:

# Instalar Node
apt install nodejs npm
 
# Crear app Express
npm init
npm install express
 
# /opt/myapp/server.js
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hola Node'));
app.listen(3000);

Configuración Apache

# Apache proxy a Node en puerto 3000
<VirtualHost *:80>
    ServerName ejemplo.com
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>

Comparación Métodos

MétodoVentajaDesventajaMPM
mod_phpSimpleLento, inflexibleprefork
PHP-FPMEficiente, escalableConfig complejaworker/event
Python + GunicornEscalable, stagingOverhead proxyany
Node.jsModernoMemoriaany

Relaciones

Conecta con

Fuentes