Revista Tecnología

Mini servidor web con Bash y netcat para páginas en mantenimiento

Publicado el 04 marzo 2015 por Gaspar Fernández Moreno @gaspar_fm

Mini servidor web con Bash y netcat para páginas en mantenimientoFoto: MTSOfan (Flickr CC-by)

Cuando estamos trabajando en un servidor web, sobre todo si ya está siendo usado y hay páginas alojadas en él, y necesitamos irremediablemente pararlo todo para trabajar no podemos dejarlo todo tirado esperando que los usuarios no se enfaden (y peor, esperando que los buscadores no se enfaden, porque la ley de Murphy dice que aunque pares el servidor 10 minutos, va a venir Google a rastrear la página y colocar en tu resumen un precioso:

Mini servidor web con Bash y netcat para páginas en mantenimiento

...y cargarse todo el SEO de la página.

Montar un pequeño servidor para servir una página

A veces no podemos utilizar nuestro servidor principal, ya que estamos cambiándolo, actualizándolo, peleándonos con dependencias o trabajando en configuración o plug-ins. Por lo que necesitamos algo para reemplazarlo momentáneamente.

Tampoco queremos algo demasiado grande porque es para un apaño. Tal vez no tengamos nodeJs instalado, o python en los que nos podemos crear un servidor web con pocas líneas. Y tampoco queremos tener que instalar demasiadas cosas.

Mi propuesta es, usar netcat (viene instalado por defecto en muchas distribuciones, de todas formas, no tiene dependencias apenas.

Sólo tenemos que ejecutar lo siguiente:

Sin sudo y con usuario root si no disponemos de él en el sistema. Con esto, vamos a poner constantemente en escucha el puerto 80 y procesando todas las peticiones de la misma forma, devolviendo los contenidos de respuesta.html.

Recordad, las pruebas podemos hacerlas como un usuario normal (no root) si utilizamos un puerto mayor de 1024, por ejemplo el 8000, 8080, 1234, etc:

Como la respuesta debe ser muy rápida, en principio no tenemos necesidad de algo más complicado (esperemos que no vengan demasiadas visitas mientras trabajamos). Pero este sistema no soportará usuarios concurrentes, recordemos que es sólo un servidor temporal y puede que a algún usuario le dé algún problema en conectar. Podemos guardar un registro de todo lo que ha pasado con:

o como usuario

Creando respuesta.html

Como habrás podido ver respuesta.html no es un archivo HTML normal, en realidad aquí hay que poner toda la respuesta completa (con cabeceras incluidas), podemos hacer algo sencillo primero:

La página a partir de la etiqueta <html>, podemos poner el código HTML que queramos. Aunque ahora estaremos contestando con un código de salida exitoso, lo que significa que los usuarios no se cabrearán (bueno sí, pero al menos verán una explicación), pero los buscadores y robots sí que la tomarán con nosotros, porque se creerán que ésta es la página buena, es más todas las páginas del servidor responderán lo mismo.

Respondiendo para que los buscadores no nos tengan en cuenta

Para ello tenemos que poner en nuestra cabecera un error 503 (Servicio no disponible). Esto será bueno porque no devolveremos un 200 (OK) para las páginas temporales, ni devolveremos un 404 (Not found / No encontrado) para el resto de páginas que no estén en nuestro servidor pero si deberán estar y el buscador de turno lo sabe (esto último sería horrible para nuestro posicionamiento, porque el buscador se creería que esas páginas ya no existen y las desindexará).

Para ello, nuestro archivo de respuesta.html será el siguiente:

Además, añadiremos Retry-After para que vuelvan dentro de un rato a ver si todo está bien. No se garantiza que los buscadores vuelvan dentro de una hora (3600 segundos), pero es normal que vuelvan cuando tengan un rato después de una hora.

Queremos complicarnos la vida

Si has llegado hasta aquí, eres de los que le gustan complicarse la vida e inventar cosas (como yo), así que, para dejar un poco a la imaginación y para hacer un servidor web un poco más completo (sin salirnos de esta base).
Vamos a crear un script que procesará la petición HTTP que se realice (tenemos que recordar que cuantas más cosas metamos, más vulnerable será nuestro sistema, y un script aquí es tremendamente vulnerable.

dispatcher.sh

Ahora tenemos 3 respuestas posibles:

  • Una para una imagen que llamaremos a través de http://nuestroservidor/logo.jpg y que llamará a la imagen my-logo-file.jpg
  • Otra que llamará al programa fortune, para que nos devuelva una frase aleatoria.
  • Otra que atenderá todas las demás peticiones (*) y servirá el archivo respuesta.html

Para hacer que netcat utilice este archivo, depende de la versión, por un lado podemos llamar a:

como usuario,

Aunque en muchas versiones de GNU/Linux viene otra versión instalada que no soporta -c, pero no todo está perdido:

como usuario,

No debemos olvidar borrar la pipe /tmp/bashwebtmp cuando terminemos de usar el programa.

Una cosa más, no debemos abusar de este script y no debemos enviar contenidos muy grandes, por ejemplo, no abusar de las imágenes (yo recomiendo enlazarlas de otro servidor que sí funcione, para ir más rápido aún), como decía antes, sólo soporta una conexión, si hacemos que esta conexión se extienda en el tiempo perderemos capacidad de atender más conexiones.


Volver a la Portada de Logo Paperblog