lighttpd + WordPressMU (español)

Para el que no lo conozca, lighttpd es una caña de servidor web: pequeño, eficiente, extensible, potente… una joya. Pero como todas las cosas que son “lo mismo pero distinto”, a veces cuesta acostumbrarse o hay que buscarse la vida para hacer algo que con “lo de siempre” hubieran sido dos patás.

En concreto, un tema que es distinto en lighttpd a Apache es el “mod_rewrite”: lighttpd tiene un módulo para reescribir URLs, si, por supuesto con una sintaxis algo distinta aunque suficientemente parecida para que no sea difícil usarla… peeero NO soporta comprobar si un fichero o directorio existe y actuar en consecuencia (-f y -d en Apache). Y WPMU depende de ésto. Por suerte lighttpd tiene una herramienta infinitamente más potente que mod_rewrite: mod_magnet.

mod_magnet es un módulo con el que podemos hacer LO QUE NOS DE LA GANA con cada petición que llega al servidor web, antes de pasársela al resto de módulos (php, etc.), en el lenguage de programación LUA. Inicialmente mod_cml, éste módulo se usaba únicamente como una gestión avanzada de caché, pero en versiones recientes (>=1.4.12) ha evolucionado a una forma de meterle mano al servidor por dentro.

Menos rollete y vamos a lo práctico. ;-) El .htaccess para Apache de éste blog tendría esta pinta:

[code lang=”apache”]RewriteEngine On
RewriteBase /

#uploaded files
RewriteRule ^(.*/)?files/$ index.php [L]
RewriteRule ^(.*/)?files/(.*)
wp-content/blogs.php?file=$2 [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . – [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-.*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*.php)$ $2 [L]
RewriteRule . index.php [L]
[/code]
En realidad tenemos dos problemas:

  • Las líneas ya mencionadas:
    [code lang=”apache”]RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d[/code]
  • LUA parece que no soporta capturas con el modificador de 0 ó 1 repeticiones (…..)?, así que hay que buscar otra expresión regular para “quitar” el primer “subdirectorio”.

Para el segundo problema, la expresión regular ganadora :-P ha sido:

[code]”^/?([^/]*/?)files/$”[/code]

Para el primero, podéis ver el script LUA aquí: wpmu.lua. Para configurarlo, añadir algo tal que así al lighttpd.conf:

[code]$HTTP[“host”] =~ “blogs.dominio.com” {
magnet.attract-physical-path-to = ( “/PATH/wpmu.lua” )
}[/code]

Estoy seguro de que se puede mejorar. Ni me acaba de gustar esa expresión regular ni el código LUA, pero por ahora parece que todo funciona. :)

[code lang=”lua”]
if (not lighty.stat(lighty.env[“physical.path”])) then
if (string.match(lighty.env[“uri.path”], “^(/?[^/]*/)files/$”)) then
lighty.env[“physical.rel-path”] = “index.php”
else
n, a = string.match(lighty.env[“uri.path”], “^(/?[^/]*/)files/(.+)”)
if a then
lighty.env[“physical.rel-path”] = “wp-content/blogs.php”
lighty.env[“uri.query”] = “file=” .. a
else
n, a = string.match(lighty.env[“uri.path”], “^(/?[^/]*/)(wp-.*)”)
if a then
lighty.env[“physical.rel-path”] = a;
else
n, a = string.match(lighty.env[“uri.path”], “^(/?[^/]*/)(.*.php)$”)
if a then
lighty.env[“physical.rel-path”] = a
else
lighty.env[“physical.rel-path”] = “index.php”
end
end
end
end
lighty.env[“physical.path”] = lighty.env[“physical.doc-root”] .. lighty.env[“physical.rel-path”]
end
[/code]

ACTUALIZADO 20070411:

  • Arreglado un bug al acceder a imágenes (/file/AÑO/MES/…)
  • Modificadas ligeramente las expresiones regulares

Por favor, probarlo y comentarme qué tal os va. Soy nuevo con WPMU así que voy encontrando fallos según voy usando más y más opciones… :)

18 comentarios sobre “lighttpd + WordPressMU (español)”

  1. Felicidades por el artículo, pero sin embargo, me surge un problema que considero importante remarcar.

    Permite que cite diréctamente de la documentación del módulo mod_magnet:
    “Keep in mind that the magnet is executed in the core of lighty. EVERY long-running operation is blocking ALL connections in the server. You are warned. For time-consuming or blocking scripts use mod_fastcgi and friends.”

    Por lo que puede causar problemas en caso de que existan otros virtual host con mucha carga (mi caso).

    Ahora voy a probar con otro script que encontré en la página de WPMU ( http://mu.wordpress.org/forums/topic.php?id=1961&page )

    $HTTP[“host”] =~ “^www.(.*)$” {
    url.redirect = (“^/(.*)” => “http://%1/$1”)
    url.rewrite-once = (“^/(.*)?/?files/(.*)” => “wp-content/blogs.php?file=$2”, “^/(wp-.*)$” => “$1”, “^/([_0-9a-zA-Z-]+/)?(wp-.*)” => “$2”, “^/([_0-9a-zA-Z-]+/)?(.*.php)$” => “$2”, “.” => “index.php”)
    }

    Try it by yourself.

    Ahí queda dicho.

  2. Hola Guillermo. Gracias por el comentario. :)

    Los rewrites que comentas los probé en su día y daban problemas. No recuerdo ahora exactamente qué, pero mirándolo así por encima, p.ej. como redirige al final todo el tráfico a index.php, no sería capaz de servir ficheros que subas tú por tu cuenta (si por lo que sea quieres una estructura de directorios propia para las descargas), o ficheros que genere algún plugin. P.ej. hay un plugin de sitemaps que te genera ficheros sitemaps.xml en el raíz de la instalación, al no coincidir con ninguna de esas reglas se irían en la última al index.php y no podrías servir el fichero. Si, podrías añadir más reglas para tratar éstos casos especiales. :)

    Por otra parte, no tengo claro que tal cual están definidas esas reglas, se respete en todos los casos las variables que se pasen por query string, con lo que algunos plugins que las necesiten cascarían (jLanguage).

    No digo que mi solución sea perfecta, ojo. :) Sólo es en mi opinión la “menos mala” de las que he probado por ahora. ;) Desde luego preferiría encontrar un juego de rewrites que hiciera lo mismo, pero hasta ahora ninguno me acaba de apañar. Tengo varios hosts virtuales con ésta configuración sin problemas, eso si, no tienen demasiado tráfico y tal vez por eso no se ven afectados por lo que comentas. Aunque por otra parte, habla de “long-running operations”. El script LUA que hace las veces del htaccess es bastante pequeño y son cuatro o cinco ifs anidados, que según el caso sólo se ejecutarían uno o dos. No creo que llegue nunca a ser muy “long-running”. ;)

    Pero vaya, si lo has probado y en la práctica con hosts con mucha carga da problemas, no te lo puedo negar. :) Si encuentras una solución mejor y me dejas un comentario, te lo agradeceré. :)

    PD: ¿Has probado con ésta otra solución? Tampoco me acaba de gustar, de hecho después de tenerla unos días en marcha volví al script LUA con mod_magnet:

    http://www.bisente.com/blog/2007/09/28/lighttpd-and-wordpress-mu-revisited/

  3. se me ha ido en ingles el comentario anterior jejeje

    A ver, mejor en spanish, yo tengo una pagina diferente en la raiz del dominio q no es el wpmu.

    Yo kiero:

    “www.domain.com” – Pagina principal de mi dominio, nada q ver con wpmu
    “domain.com/blogs/” – indice de wpmu
    “testblog.domain.com/blogs/” – blogs wpmu

    Que modificaciones tengo q hacer a la solucion q das??
    Si lo pongo exactamente como lo has puesto, la pagina principal de mi dominio me la redirige tambien al wpmu…

    G R A C I A S !!!!

  4. En principio te diría que dos cambios (sin haberlo probado, ojo):

    – en todas las expresiones regulares, ponerles delante “blogs”: “^(/blablabla)” ->”^/blogs(/blablabla)”

    – en las asignaciones de un fichero determinado a “physical.rel-path”, igual: “wp-content/blogs.php” -> “blogs/wp-content/blogs.php”

    O si no algo parecido. Prueba y comenta por aquí si lo consigues solucionar. :)

  5. Buenas bisente.

    Tengo que probar a usar el método que se utiliza para rails. En caso de que una página venga con una url, lighttpd buscará su recurso en el disco duro. Al no encontrarla, mostrará la página de error. En rails+lighttpd, el programa principal se configura como página 404, por lo que toda url que no esté en disco, es gestionada por el … dispatcher… ¿Despachador? de rails. Esto puede ser una solución bastante efectiva para este caso, pero no se si funciona. Probaré y si resulta exitoso, intentaré dejarte otro comment.

    Un Saludo.

  6. Lo q me ha costado y lo facil q era… al final lo he hecho con directorios, bajo la url: blogs.dominio.org

    Explico lo q he hecho:

    1. Descomprimir el tar.gz en un directorio.
    2. Decirle al lighttpd q ese subdominio apunta al directorio donde esta el wpmu y decirle q ejecute tu script:

    $HTTP[“host”] =~ “blogs.dominio.org” {
    server.document-root = “/var/www/dominio/blogs/”
    magnet.attract-physical-path-to = ( “/var/www/dominio/blogs/wpmu.lua” )
    }

    3. Abrir en el navegador blogs.dominio.org e instalar el wpmu (importante abrirlo desde aki y no desde dominio.org/blogs!!)
    4. A DISFRUTAR xD

    MUCHAS GRACIAS POR LA AYUDA!! ;)

  7. Hhola amigos, me estoy quedando sin neuronas intentando configurar virtual hosts, lo unico que deseo es que en mi ordenador, que esta conectado a internet con ip fija, kubuntu y lighttpd, se alojen mis archivos de varias urls, es decir, que si alguien tipea http://www.ejemplo1.com.ar vea mi index.html en /var/www/ejemplo1; y si tipea http://www.ejemplo2.com.ar, vea la index.html de /var/www/ejemplo2/index.html
    Esto deberia ser “facil”; pero hace 5 días que estoy sudando sangre casi sin dormir y no consigo nada, de hecho he editado el archivo lighttpd.conf de mil maneras, copiando cosas de internet y no he lograda nada mas que mensajes de “no se encuentra el servidor”; creí que era algun problema del dns o del registro del dominio, pero si pongo mi index directamente en /var/www funciona, tipeando http://www.lagartorojo.com.ar (la primer url que registre y delegue con un servidor DNS) o mi IP, indistintamente, al agregar algo al lighttpd.conf, hasta esto deja de funcionar, igualmente, tener un solo url no me sirve, asi que necesito los virtualhosts funcionando, ya se me terminan las ideas y como he vuelto a Linux y a los servidores despues de 8 años, estoy muy desactualizado, AYUDA POR FAVORRRRRRRRRRR

  8. Hola

    Lo más sencillo es con el módulo simple_vhost. Verifica que lo tengas instalado (que venga con tu distribución, o si has compilado desde el fuente que esté, etc.) y añade ésto al lighttpd.conf:

    —-
    ## Simple name-based virtual hosting
    ##
    ## Documentation: /usr/share/doc/lighttpd-doc/simple-vhost.txt
    ## http://www.lighttpd.net/documentation/simple-vhost.html

    server.modules += ( “mod_simple_vhost” )

    ## The document root of a virtual host isdocument-root =
    ## simple-vhost.server-root + $HTTP[“host”] + simple-vhost.document-root
    simple-vhost.server-root = “/var/www”
    simple-vhost.document-root = “/”

    ## the default host if no host is sent
    simple-vhost.default-host = “www.example.com”
    —-

    Con eso cualquier dominio irá a /var/www/DOMINIO (el dominio tal cual le llegue al servidor, con http://www.XXX.com) y si se directorio (ese dominio) no existe, iría a http://www.example.com.

    Por otra parte, verifica como dices los DNS, haz un ping, que resuelva correctamente tu IP, etc.

    Espero que te sea de ayuda.

  9. Hola amigo Bisente:
    He estado aguardando, pero no has publicado mi ultimo post, la solución que propones para crear multiples hosts en lighttpd basada en nombres, es la que figura en la documentación, y no ha funcionado, el problema es este:
    los directorios donde se alojan los ficheros de cada sitio estan asi:
    en /var/www/ejemplo1; var/www/ejemplo2 ; var/www/ejemplo3 ; si dejamos el archivo lighttpd tal como se instala sólo leera la index.html en /var/www ; ahora bien, colocando al final del fichero /etc/lighttpd/lighttpd.conf el código:
    server.modules += ( “mod_simple_vhost” )

    ## The document root of a virtual host isdocument-root =
    ## simple-vhost.server-root + $HTTP[”host”] + simple-vhost.document-root
    simple-vhost.server-root = “/var/www”
    simple-vhost.document-root = “/”

    ## the default host if no host is sent
    simple-vhost.default-host = “www.ejemplo1.com”
    accederemos a /var/www/ejemplo1/index.html
    pero si agregamos más porciones de este bloque de código, para acceder a ejemplo2, ejemplo3, etc, no funciona,
    en definitiva, ¿qué se debe hacer para lograr que cualquier internauta, tipeando ejemplo1.com.ar o ejemplo2.com.ar; etc, acceda a las index.html alojadas respectivamente en /var/www/ejemplo1; /var/www/ejemplo2/index.html y asi a cada uno de los sites que creamos?
    quedo al aguardo de tu respuesta.
    Juan

  10. Amigo Bisente:
    He estado entrando a tu blog cada media hora mas o menos a ver si encuentro alguna respuesta a el tema de multiples dominios, veo que has publicado mi ultimo post, pero nadie ha respondido ¿no es evidente que deberia ser muy facil tener varios sites en un mismo server? ¿será realmente que me equivoco y es muy dificil? igualmente supongo que la mayoria de los sites se internet no se alojan en servers dedicados, AYUDA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  11. El principal problema parece ser que esto sea realmente multi-hosting; he probado mil o dosmil cosas, en un momento logre que tipeando http://www.lagartorojo.com.ar, se acceda a /var/www/lagartorojo/index.html y tipeando mi IP se acceda a /var/www/index.html; luego no podia agregar lo necesario para que tipeando http://www.webdehistoria.com.ar se accediera a /var/www/webdehistoria/index.html; y de tanto tocar y retocar lighttpd.conf, termine por volver a tener el archivo como viene, y poniendo la IP o http://www.lagartorojo.com.ar, se accede solo a /var/www/index.html; lo cual obviamente no sirve. Ya realmente no se que probar ¿esto es TAN dificil realmente?

  12. Hola: Luego de luchar días con el lighttpd, he vuelto a instalar el Apache2 ; en realidad he vuelto a instalar todo el Kubuntu, porque había creado tantos archivos y directorios ensayando las locas soluciones que proponen los pseudogurús de internet que ya no encontraba nada.Mi buen PenDrive resguardo los ficheros de mis webs.
    En definitiva, aún no he podido crear virtual hosts, ni en lighttpd ni en Apache, proximamente os escribire desde un manicomio si esto sigue asi, ¿ninguno sabe como configurar esto?
    resumo el tema (otra vez): tenemos digamos dos, webs, uno en /var/www/lagartorojo y otro en var/www/webdehistoria . ¿qué debemos hacer en Apache2 para que cuando algun gilipollas ponga http://www.lagartorojo.com.ar vea nuestra index en la ubicacion citada y cuando ponga http://www.webdehistoria.com.ar vea la otra? Esto deberia ser realmente facil, a mi ensima se me han venido los examenes y casi no he estudiado intentando configurar esto, ya no tengo la menor idea de que tocar, y todo el material que esta publicado en internet NO FUNCIONA. socorroooooooooooooooooooooooooooooooooo!!!!!!!!!!!!!

  13. Hola Iahia

    He estado unos días fuera de casa sin acceso a Internet y al volver mira, sorpresa, varios comentarios tuyos. Me he divertido mucho leyéndolos, de verdad.

    La configuración de lighty que te copié FUNCIONA, aunque tal vez no me supe explicar bien: no tienes que copiarla n veces para cada servidor, NO HACE FALTA. El default host es para peticiones HTTP 1.0 que no incluyan la cabecera “Host:” o cuando el directorio del dominio al que se intenta acceder no exsita. Ejemplo fácil, con la configuración que te copié tal cual:

    – si pones http://www.ejemplo1.com.ar Y EXISTE /var/www/www.ejemplo1.com.ar (ejemplo1 sólo no vale), va ahí
    – si pones http://www.ejemplo2.com.ar Y EXISTE /var/www/www.ejemplo2.com.ar, (ejemplo2 sólo no vale, ni ejemplo2.com ni .com.ar tampoco, es TODO EL DOMINIO COMPLETO, TAL CUAL) va ahí
    – si pones http://www.ejemplo3.com.ar Y *NO* EXISTE /var/www/www.ejemplo3.com.ar, ENTONCES es cuando se usa el default host, en el ejemplo /var/www/www.example.com

    Como ves es bastante más sencillo que la configuración de Apache que estás usando ahora, no tienes que ir añadiendo NADA a la configuración por cada vhost que quieras añadir ya que por defecto va a asumir que el directorio se llama igual que el dominio (cosa por otra parte muy recomendable y que te ahorrará a la larga dolores de cabeza si tienes muchos). Sólo hacer que el DNS apunte a la IP de tu servidor y tener el directorio apropiado con el contenido.

    Ahora bien, si ya lo tienes en marcha con Apache, ¡adelante! Desde luego si después te surge alguna duda a la hora de configurar PHP o cualquier otra historia vas a encontrar mucha más información sobre Apache que sobre lighty. Apache es un servidor de propósito general buenísimo, lighty lo que tiene es que consume bastantes menos recursos con lo que en máquinas algo escasas puedes optimizarlo mejor, pero también es más puñetero a veces.

    En fin, que me alegro que de una forma u otra al final lo lograras, campeón.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.