Microordenadores - Desarrollos modernos para sistemas retro

Como usar la Raspberry Pi para generar sitios estáticos
8 de Agosto de 2017

Como convertir un sitio dinámico en PHP o en cualquier otro lenguaje a un sitio estático HTML con las ventajas que ello conlleva. Es válido para cualquier sistema tipo Unix ya que las herramientas utilizadas son find, sed y wget.

¿Por qué la Raspberry Pi? porque en caso de que trabajes desde un ordenador Windows, allí no tienes las herramientas de Unix necesarias para esta forma de trabajar. En este caso accederías a la Raspberry Pi mediante SSH y allí generarías los archivos estáticos y los subirías al servidor mediante unos scripts. La función de la Raspberry sería hacer de servidor y de "compilador" web.

Este método no es el más eficiente pero para sitios pequeños puede funcionar muy bien y hace muy cómodo publicar y sobre todo mantener webs.

Diferencias entre sitios web estáticos y dinámicos

Un sitio web dinámico es aquel que es generado en el servidor cuando un cliente consulta una de sus páginas. Por el contrario, un sitio estático es solamente un puñado de archivos HTML, CSS y Javascript que no cambian, lo que simplifica enormemente la infraestructura en el lado del servidor. Los sitios estáticos tienen una serie de ventajas:

  • Seguridad: el mejor código es el que no se ejecuta. Además al no estar en el servidor es más difícil que te lo roben.
  • Velocidad: tiempos de respuesta más rápidos y mejor escalabilidad.
  • Precio: más barato de alojar (gratis en Github y menor consumo de recursos.
  • Estabilidad: menos código ejecutándose significa una menor probabilidad de que algo se rompa.

Contrariamente a la creencia popular, Unix es amigable con el usuario. Simplemente resulta ser muy selectivo sobre quienes son sus amigos.

-- Desconocido

Hay un montón de generadores de sitios estáticos, aunque después de probar unos cuantos, ninguno me da plena flexibilidad ni la sencillez que busco.

Como funciona

Con esta configuración tengo mi sitio en el ordenador local, donde lo desarrollo, y eventualmente lo compilo en un puñado de archivos estáticos y los subo al servidor de forma automatizada. Haciendo esto ya no tengo que preocuparme de fallos de seguridad en el código PHP ya que no se ejecutará en el servidor, a la vez que puedo aprovechar una parte de la potencia y flexibilidad de este lenguaje.

Script de compilación

Asumo que la aplicación PHP tiene URLs bonitas, todas ellas terminadas en el carácter / (slash) y que la web hace uso de base href y rutas relativas. Los dos directorios necesarios son los siguientes:

  • www.example.com contiene la aplicación PHP.
  • www.example.casa es el directorio donde se guarda la versión estática del sitio PHP.

Primero de todo pon una entrada para www.example.casa en /etc/hosts apuntando a 127.0.0.1 si trabajas directamente desde la Raspberry en local o la IP de red de la Raspberry si usas otro ordenador. También es necesario añadir configurar el Virtual Host www.example.casa en Nginx que apunte al directorio www.example.com.

Una vez que la aplicación PHP está funcionando en http://www.example.casa, haz una descarga recursiva usando wget con las opciones -r y --adjust-extension. Este comando descargará el sitio completo creando un directorio para cada página con su index.html. Borraré previamente la compilación anterior y después reemplazaré el valor de la etiqueta base href con sed para cada archivo HTML encontrado:

#!/bin/sh
rm -rf www.example.casa
wget -r --adjust-extension http://www.example.casa
for i in `find www.example.casa -name "*html"`; do sed -i 's/example.casa/example.com/g' $i; done

Si usas certificado SSL el bucle for cambia:

for i in `find www.example.casa -name "*html"`; do sed -i 's/http:\/\/example.sandbox\//https:\/\/www.example.com\//g' $i ; done

Script para subir el sitio

Después de comprobar que la compilación ha sido correcta cargando example.sandbox en el navegador, y comprobando que no hay enlaces rotos usando alguna herramienta como linkchecker puedes subir el sitio al servidor usando este script, asumiendo que /htdocs/example.com es el directorio donde está la web:

#!/bin/sh
rsync -czrpgoD --rsh="ssh" www.example.casa/* server:/htdocs/example.com

Usando rsync sólo se suben los cambios; de esta forma se suben los archivos a través de ssh con lo que no es necesario tener rsyncd corriendo en el servidor. Otra opción es usar unison para mantener los archivos y directorios sincronizados.

Conclusión

Con esto tienes un sistema básico para generar sitios estáticos que funciona de esta forma:

  • Desde tu ordenador cargas http://www.example.casa y aparece la web en tu red.
  • Haces los cambios y modificaciones necesarias.
  • Cuando ves que todo está correcto, ejecutas el script para compilar y subir y la web y cargará la nueva versión en http://www.example.com

Contenido relacionado: