Tabla de contenido

Tienes tu aplicación PHP funcionando en local y llega el momento de subirla al mundo real. El proceso puede parecer intimidante la primera vez, pero siguiendo estos pasos lo harás sin contratiempos.

¿Qué necesitas para desplegar?

  • Un servidor web: puede ser un hosting compartido, un VPS (servidor privado virtual) o una plataforma cloud
  • PHP instalado en el servidor (generalmente PHP 8.1+)
  • MySQL si tu aplicación usa base de datos
  • FTP o SSH para subir los archivos

Las opciones más comunes para proyectos PHP son:

  • Hostinger, SiteGround, NameCheap: hosting compartido económico, bueno para empezar
  • DigitalOcean, Linode, Vultr: VPS con más control
  • AWS, Google Cloud: para aplicaciones de mayor escala

Opción 1: Hosting compartido con cPanel y FTP

Esta es la opción más sencilla para empezar.

Paso 1: Accede a cPanel desde tu proveedor de hosting y busca “File Manager” o “Administrador de Archivos”.

Paso 2: Sube tus archivos a la carpeta public_html. Esta es la carpeta raíz de tu dominio.

Paso 3: Crea la base de datos en cPanel → MySQL Databases:

  1. Crea una nueva base de datos
  2. Crea un usuario MySQL
  3. Asigna el usuario a la base de datos con todos los privilegios
  4. Importa tu archivo .sql desde phpMyAdmin

Paso 4: Actualiza las variables de conexión en tu db.php o .env con los datos del servidor:

$host = 'localhost';
$db   = 'tuusuario_nombrebd';  // formato del hosting
$user = 'tuusuario_dbuser';
$pass = 'TuPasswordSeguro123';

Con FTP (alternativa a File Manager):

Usa FileZilla o Cyberduck. Conéctate con:

  • Host: ftp.tudominio.com
  • Usuario y contraseña: los del cPanel
  • Puerto: 21

Opción 2: VPS con SSH

Un VPS te da más control. Primero conéctate por SSH:

ssh usuario@ip-de-tu-servidor

Instalar Apache, PHP y MySQL:

sudo apt update
sudo apt install apache2 php8.1 libapache2-mod-php8.1 mysql-server
sudo apt install php8.1-mysql php8.1-mbstring php8.1-xml php8.1-curl

Subir tu proyecto:

Opción A — Con Git (recomendado):

cd /var/www/html
git clone https://github.com/tuusuario/mi-proyecto.git

Opción B — Con SCP desde tu máquina local:

scp -r ./mi-proyecto usuario@ip:/var/www/html/

Permisos:

sudo chown -R www-data:www-data /var/www/html/mi-proyecto
sudo chmod -R 755 /var/www/html/mi-proyecto

Configurar Apache para PHP

Crea un archivo de configuración para tu sitio:

sudo nano /etc/apache2/sites-available/mi-proyecto.conf
<VirtualHost *:80>
    ServerName mi-dominio.com
    ServerAlias www.mi-dominio.com
    DocumentRoot /var/www/html/mi-proyecto/public
    
    <Directory /var/www/html/mi-proyecto/public>
        AllowOverride All
        Require all granted
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/mi-proyecto-error.log
    CustomLog ${APACHE_LOG_DIR}/mi-proyecto-access.log combined
</VirtualHost>

Activa el sitio:

sudo a2ensite mi-proyecto.conf
sudo a2enmod rewrite
sudo systemctl restart apache2

Manejar variables de entorno en producción

Nunca subas tu archivo .env a Git (ya debe estar en .gitignore). En producción, crea el .env manualmente:

nano /var/www/html/mi-proyecto/.env
APP_ENV=production
APP_DEBUG=false
DB_HOST=localhost
DB_DATABASE=mi_base_datos
DB_USERNAME=mi_usuario
DB_PASSWORD=MiPasswordMuySeguro123

En PHP, para leer estas variables puedes usar la librería vlucas/phpdotenv (con Composer) o configurarlas directamente en Apache:

# En la configuración de Apache:
SetEnv DB_PASSWORD "MiPasswordMuySeguro123"

Errores comunes al desplegar

Error 500 (Internal Server Error):

  • Revisa los logs: tail -f /var/log/apache2/error.log
  • Verifica que APP_DEBUG=false en producción (los errores no se muestran al público)
  • Comprueba los permisos de archivos

Página en blanco:

  • Activa temporalmente display_errors en php.ini para ver el error
  • Verifica que la ruta al archivo principal es correcta

Error de base de datos:

  • Confirma que el usuario MySQL tiene los permisos correctos
  • Verifica host, nombre de BD, usuario y contraseña

Imágenes o CSS no cargan:

  • Revisa que las rutas son absolutas o relativas correctas en producción
  • Confirma los permisos de la carpeta de assets

Lista de verificación antes de ir a producción

Antes de apuntar tu dominio al servidor, verifica:

  • APP_DEBUG=false — nunca mostrar errores al usuario
  • Contraseñas seguras en la base de datos de producción
  • .env en .gitignore y no en el repositorio
  • Backups configurados para la base de datos
  • Certificado SSL instalado (HTTPS) — con Let’s Encrypt es gratuito
  • Sentencias preparadas en todos los queries (sin SQL injection)
  • Sanitización de inputs del usuario
  • Logs de errores configurados
# Instalar SSL gratuito con Certbot
sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d mi-dominio.com

El despliegue puede parecer complejo al principio, pero con práctica se vuelve parte natural del flujo de trabajo. Muchos equipos automatizan este proceso con CI/CD (GitHub Actions, por ejemplo), que ejecuta el despliegue automáticamente cada vez que haces push a la rama principal.