Ya tenemos Ubuntu Server instalado, configurado, actualizado, con SSH funcionando. Hicimos la pega básica en las partes 1 y 2. Ahora toca ponerle algo útil encima.
Si alguna vez quisiste montar un sitio web, una intranet, o simplemente alojar algo en tu propio servidor, necesitas dos ingredientes clave: un servidor web y un intérprete de PHP. Y para eso usaremos NGINX y PHP-FPM.
Antes de seguir: se asume que ya tienes Ubuntu Server con los básicos del post anterior. Si llegaste aquí de rebote, no es obligatorio, pero te puede costar más el contexto.
No exactamente. Si has dado vuelta en internet, te habras pillado estos dos conceptos. Los dos son servidores web y los dos sirven para lo mismo, pero tienen diferencias que importan según el uso:
Apache: lleva más tiempo, es muy maduro, y tiene una forma de configurar por carpeta (.htaccess) que puede ser muy cómoda. El problema: consume más recursos, especialmente con muchas conexiones simultáneas.
NGINX: (se pronuncia "engine-ex", no "en-jinks", dato para no quedar en ridículo) está pensado para ser liviano y eficiente. Maneja muchas conexiones con poco RAM, lo que lo hace ideal para un servidor modesto, una Raspberry Pi, o un VPS de gama baja. Por eso lo usamos aquí.
Abrimos nuestra sesión SSH (o nos sentamos frente a la máquina si eres de los clásicos) y ejecutamos:
sudo apt-get install nginx -y
Para verificar que está corriendo, dos cosas:
sudo systemctl status nginx

Si todo está bien, verás una línea que dice Active: active (running) (imagen de arriba). El servicio corre perfecto.
Ahora, desde cualquier navegador en tu red local, entra a la IP del servidor. Deberias ver algo como esto:

Esta es la página de bienvenida de NGINX. ¿Ambos pasos OK? ¡Bien! Tienes ya disponible un servidor web NGINX corriendo.
Minidato: Si no recuerdas la IP local (o no la seteaste en la instalación), puedes escribir en consola
ifconfig.
Ya con esto podemos entregar webs estáticas, como en los tiempos del GeoCities (se me cayó el carné con esa referencia). ¿Queremos ir un paso mas allá? Instalemos PHP.
PHP es lo que convierte un servidor web en algo vivo: en lugar de entregar un archivo "tal cual", genera la página al momento de la petición, consultando bases de datos, procesando formularios, manejando sesiones. Lo que ves es siempre HTML, pero construido al vuelo, lo que puede dar resultado a webs mas "dinámicas".
Se usa en casi todo lo que implica contenido dinámico: WordPress y Drupal para sitios web, Magento para e-commerce, phpBB para foros, Nextcloud para almacenamiento en la nube.
Hasta Facebook arrancó con PHP.
NGINX por sí solo no sabe interpretar PHP. Para eso existe PHP-FPM (FastCGI Process Manager), que actúa como intermediario: NGINX recibe la petición, se la pasa a PHP-FPM, este la procesa, y devuelve el resultado.
Instalaremos PHP y algunos módulos que suelen ser necesarios para la mayoría de proyectos:
sudo apt-get install php-fpm -y
sudo apt-get install php-mysql php-curl php-json php-mbstring php-xml php-zip php-yaml -y

No tienes que instalar todos los módulos si no los vas a usar. Estos son los más comunes. Si después te falta alguno (un CMS suele decirte exactamente qué necesita), se instala con
sudo apt-get install php-<nombre>.
Verificamos que PHP-FPM esté activo:
sudo systemctl status php*

El * es porque el nombre exacto del servicio cambia según la versión de PHP instalada (puede ser php8.1-fpm, php8.3-fpm, etc.). Anota qué versión tienes, la vamos a necesitar en el siguiente paso.
Por defecto, NGINX sirve archivos estáticos sin problema. Para que procese PHP, hay que tocar su configuración.
El archivo de configuración del sitio por defecto está en:
sudo nano /etc/nginx/sites-available/default

Busca el bloque location ~ \.php$ — que probablemente está comentado. Descoméntalo y déjalo así (ajusta la versión de PHP según la tuya):
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Recuerda, aqui hay que escribir la versión correspondiente de PHP que está instalada.
También asegúrate de añadir index.php en unas líneas mas arriba:
index index.php index.html index.htm;

Guardamos con Ctrl+O, salimos con Ctrl+X, y verificamos que la configuración no tenga errores:
sudo nginx -t

Si dice syntax is ok y test is successful, recargamos NGINX:
sudo systemctl reload nginx
Si dice [emerg] ... Checar bien si quedó todo bien escrito en el paso anterior. (El cierre de los corchetes { } suele ser uno de los detalles mas comunes)
La forma clásica de verificar que PHP está funcionando es crear un archivo info.php en la carpeta web:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Entra desde el navegador a http://[IP-del-servidor]/info.php. Si ves la página azul enorme con toda la información de PHP como en la imagen que viene, todo está perfecto.

IMPORTANTE: una vez que verificaste que funciona, ELIMINA ESTE ARCHIVO. Deja la configuración de tu servidor expuesta para cualquiera que sepa la URL.
sudo rm /var/www/html/info.php
La carpeta donde van los archivos del sitio es /var/www/html/. Por defecto, pertenece a root, lo que significa que cada vez que quieras subir o modificar algo, necesitarás sudo.
Para hacerlo más cómodo, puedes cambiar el propietario al usuario con el que trabajas (reemplaza juan por el tuyo):
sudo chown -R juan:www-data /var/www/html/
sudo chmod -R 755 /var/www/html/
O, también, agregar tu usuario al grupo www-data:
sudo usermod -a -G www-data juan
sudo chown -R www-data:www-data /var/www/html/
sudo chmod -R 775 /var/www/html/
Con esto, tu usuario puede escribir en la carpeta, y NGINX (que corre como www-data) puede leer los archivos sin problema.
Esta carpeta se puede cambiar si lo quieres, en el archivo de configuración que vimos anteriormente, se cambia la línea que comienza con (originalmente)
root /var/www/html/;por la carpeta que hayas creado antes, y consideres mas cómoda (puede serroot /web;,root /home/usuario/pagina;. Recuerda tener los permisos conchownychmod)
Y listo, ya tienes NGINX sirviendo páginas y PHP-FPM interpretándolas. La dupla clásica para montar casi cualquier cosa: Un CMS como Grav, una app dinámica con PHP, algo con HTML+JS, etc.