Apuntes de sistema: Servidor Linux, servidor web (parte 3)

linux ubuntu server nginx php apuntes de sistema

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.

Índice

¿NGINX o Apache? ¿Da lo mismo?

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í.

Instalar NGINX

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

Servicio de NGINX corriendo

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:

Página de bienvenida de NGINX

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.

Instalar PHP-FPM

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

Instalacion de PHP

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*

Servicio de PHP corriendo

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.

Conectar NGINX con PHP-FPM

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

Archivo de NGINX 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;

NGINX con correcciones

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

sudo nginx -t

Prueba del archivo de configuracion de NGINX

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)

Probar que todo funciona

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.

PHP Info funcionando

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

Tip: permisos y carpeta web

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 ser root /web;, root /home/usuario/pagina;. Recuerda tener los permisos con chown y chmod)


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.


Glosario

  • Apache: Servidor web de código abierto, uno de los más usados históricamente. Alternativa a NGINX.
  • FastCGI: Protocolo que permite a un servidor web comunicarse con programas externos (como PHP) de forma eficiente.
  • FPM (FastCGI Process Manager): Implementación de FastCGI para PHP. Gestiona los procesos que interpretan el código PHP.
  • NGINX: Servidor web liviano y de alto rendimiento. También puede actuar como proxy inverso o balanceador de carga.
  • PHP: Lenguaje de programación del lado del servidor, muy usado en desarrollo web.
  • Puerto 80: Puerto estándar para tráfico HTTP (web sin cifrar).
  • Socket: Archivo especial que permite la comunicación entre procesos en el mismo sistema. PHP-FPM y NGINX se comunican a través de un socket Unix.
  • Virtual host: Configuración que permite a NGINX servir múltiples sitios web desde un mismo servidor.
  • www-data: Usuario del sistema con el que corre NGINX en Ubuntu. Necesita permisos de lectura sobre los archivos del sitio.