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:

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]

En realidad tenemos dos problemas:

  • Las líneas ya mencionadas:
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
  • 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:

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

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

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

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. :)

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

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… :)

Enviar a: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • barrapunto
  • meneame
  • Slashdot
  • blogmarks
  • co.mments
  • Technorati
  • YahooMyWeb

Artículos relacionados (o no)

7 Respuestas a “lighttpd + WordPressMU (español)”


  1. 1 guillermo

    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. 2 bisente

    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. 3 kalimocho

    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. 4 bisente

    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. 5 Guillermo

    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. 6 Guillermo

    Olvida lo que he dicho, que acabo de leer tu comentario en otra pestaña. (Esto me pasa por usar pestañas y no leerlas antes de contestar). Sorry.

    Un Saludo con disculpas. :-P

  7. 7 kalimocho

    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!! ;)

Añade un Comentario