Ghost con Varnish 4

A la hora de decidir usar el sistema de blogging Ghost hay que tener en cuenta que ya incluye su propio servidor web. Al estar basado en node.js no necesita apoyarse de un Apache o Nginx para servir las páginas que genere.

En un entorno ideal, la puesta en marcha de Ghost sería tan sencilla como configurar su puerto de escucha (80, típicamente) y arrancarlo con:

    npm start --production

Aunque actualmente desplegar nuevos servidores dedicados no es un gran problema, es posible que queramos reaprovechar un servidor que ya tiene el puerto 80 ocupado por Apache. Instalar Ghost en ese entorno requiere una serie de pasos extra, que básicamente se resumen en configurar Ghost para que escuche en otro puerto, y configurar Apache para que haga de proxy entre el puerto 80 y el puerto interno de Ghost.

Navegador --> Apache (p:80) --> Ghost (p:2368)

En mi caso es lo que iba a hacer, hasta que he recordado que en el servidor también teníamos instalado Varnish. Varnish es un caché web que actúa de proxy inverso HTTP. Simplificando mucho, Varnish se encarga de escuchar en el puerto 80 y redirige las peticiones a Apache, que escucha en un puerto interno. Por el camino, Varnish cachea las respuestas de Apache para evitar volver a consultarle.

Navegador --> Varnish (p:80) --> Apache (p:8080)

Añadir Ghost en este entorno es sencillo, en teoría bastaría con configurar todo así:

Navegador --> Varnish (p:80) --> Apache (p:8080) --> Ghost (p:2368)

Para configurarlo, deberíamos crear un host virtual en Apache que redirigiese a Ghost bajo determinadas circustancias. Funcionaría sin problemas, pero estamos dando un paso extra.

 Nos saltamos un paso

En la configuración anterior, estaríamos usando 2 proxys: Varnish y apache. No podemos prescindir de ninguno de los dos, ya que Varnish viene bien para cachear las respuestas y necesitamos Apache para servir contenido "tradicional", no gestionado por Ghost.

Pero para el contenido gestionado por Ghost, sí que podemos obviar Apache. Su única función para Ghost es actuar como proxy HTTP. Y eso lo puede hacer perfectamente Varnish. Lo podemos configurar para que haga esto:

                               |--> Apache (p:8080)
Navegador --> Varnish (p:80) --|
                               |--> Ghost (p:2368)  

De esta forma Varnish redirigirá a Apache o a Ghost dependiendo de lo que se solicite. La idea es que si se pide la url del blog, Varnish la redirigirá a Ghost. Cualquier otra url se reenviará a Apache para que la gestione.

Uno de los conceptos clave de la configuración de Varnish es el backend. Un backend es básicamente la URL a la que Varnish reenviará las peticiones. Si ya tenemos Varnish configurado y corriendo, ya tendremos definido un backend.

Los backend se definen en el fichero de configuración de Varnish, que por defecto es /etc/varnish/default.tcl. En mi caso lo tengo definido así:

    #apache
    backend default {
        .host = "127.0.0.1";
        .port = "8080";
    }

Añadir otro es tan sencillo como replicar la estructura anterior. De la siguiente manera:

    #apache
    backend default {
        .host = "127.0.0.1";
        .port = "8080";
    }

    #ghost
    backend ghost {
        .host = "127.0.0.1";
        .port = "2368";
    }

Con esta configuración le estamos diciendo a Varnish que tenemos a Apache escuchando en el puerto 8080 y a Ghost escuchando en el 2368.

Para que Varnish decida que backend usar en función a la url de entrada, habría que añadir dentro de sub vcl_recv lo siguiente:

    set req.backend_hint = default;
    if (req.http.host ~ "miblog.com") {
        set req.backend_hint = ghost;
    }

Es decir, por defecto usa el backend default, pero si la url coincide con la url del blog, usará el backend ghost.

De esta forma conseguiremos tener un sistema sirviendo todo tipo de contenidos y estaremos utilizando cada software para lo que mejor sabe hacer: Varnish dirigiendo y cacheando el tráfico, Apache sirviendo páginas php y html convencionales, y Ghost sirviendo el blog.