Introducción: por qué VPS es la solución ideal para un proyecto PHP
\nDesarrollar una aplicación PHP es solo la mitad del trabajo. La segunda parte, igualmente importante, es un despliegue adecuado en el servidor. Un Servidor Privado Virtual (VPS) ofrece flexibilidad, control y rendimiento que no están disponibles con el hosting compartido. Obtienes acceso root, la posibilidad de ajustar finamente el entorno y un aislamiento completo de recursos.
\nEn esta guía, recorreremos el camino desde la compra del servidor hasta la aplicación en funcionamiento, usando como ejemplo PHP 8.x, Nginx, MySQL y Git. Todos los pasos están descritos para el sistema operativo Ubuntu 22.04 LTS, la distribución más popular para servidores web.
\n\n1. Configuración inicial del VPS y conexión
\n\n1.1. Elección y compra del VPS
\nPara una aplicación PHP, los requisitos mínimos son: 1 vCPU, 1 GB de RAM, 20 GB SSD. Recomendamos proveedores con buena reputación: DigitalOcean, Linode, Vultr o los locales Timeweb, Beget.
\nDespués de la compra, recibirás una dirección IP, una contraseña de root (o una clave SSH).
\n\n1.2. Conexión por SSH y creación de usuario
\nNos conectamos al servidor (reemplaza 192.168.1.1 con tu IP):
ssh root@192.168.1.1\nCreamos un usuario no privilegiado para el trabajo diario:
\nadduser deployer\nusermod -aG sudo deployer\nConfiguramos las claves SSH para un inicio de sesión seguro:
\nmkdir -p /home/deployer/.ssh\ncp ~/.ssh/authorized_keys /home/deployer/.ssh/\nchown -R deployer:deployer /home/deployer/.ssh\nchmod 700 /home/deployer/.ssh\nchmod 600 /home/deployer/.ssh/authorized_keys\nDeshabilitamos el inicio de sesión root con contraseña, editamos /etc/ssh/sshd_config:
PermitRootLogin prohibit-password\nPasswordAuthentication no\nReiniciamos SSH: systemctl restart sshd
1.3. Seguridad básica del servidor
\n- \n
- Actualizamos paquetes:
apt update && apt upgrade -y\n - Instalamos fail2ban:
apt install fail2ban -y\n - Configuramos UFW (cortafuegos): \n
ufw allow OpenSSH\nufw allow 'Nginx Full'\nufw enable\n\n2. Instalación y configuración del stack LEMP (Linux, Nginx, MySQL, PHP)
\n\n2.1. Instalación de Nginx
\napt install nginx -y\nsystemctl enable nginx\nsystemctl start nginx\nVerifica su funcionamiento abriendo la dirección IP del servidor en el navegador. Deberías ver la página de bienvenida de Nginx.
\n\n2.2. Instalación de PHP 8.x y PHP-FPM
\nAñadimos el repositorio para la versión actual de PHP:
\napt install software-properties-common -y\nadd-apt-repository ppa:ondrej/php -y\napt update\napt install php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl php8.2-mbstring php8.2-zip php8.2-gd -y\nVerificamos el estado de PHP-FPM:
\nsystemctl status php8.2-fpm\n\n2.3. Instalación de MySQL (MariaDB)
\napt install mariadb-server -y\nsystemctl enable mariadb\nsystemctl start mariadb\nEjecutamos el script de seguridad:
\nmysql_secure_installation\nCreamos la base de datos y el usuario para la aplicación:
\nmysql -u root -p\nCREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\nCREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'strong_password';\nGRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost';\nFLUSH PRIVILEGES;\nEXIT;\n\n2.4. Configuración del host virtual de Nginx
\nCreamos el archivo de configuración para nuestro dominio (por ejemplo, myapp.com):
nano /etc/nginx/sites-available/myapp\nContenido del archivo:
\nserver {\n listen 80;\n server_name myapp.com www.myapp.com;\n root /var/www/myapp/public;\n index index.php index.html;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_pass unix: