Apache ha muerto  Viva LIGHTTPD! [email_address] * No creo realmente que el Apache haya muerto, pero si que ahora hay mas ...
Características <ul><li>Casi 3 años de desarrollo. Lo empezo un tal Jan Kneschke </li></ul><ul><li>La ultima  versión  est...
La  filosofía   Lighty <ul><li>Un solo proceso, 1 solo thread </li></ul><ul><li>KISS: “keep it simple, stupid” </li></ul><...
Cuando si, cuando no <ul><li>Lighty es perfecto cuando: </li></ul><ul><li>Uno puede y quiere tener control total sobre las...
Quien usa Lighttpd <ul><li>Algunos nombres &quot;importantes&quot; </li></ul><ul><li>YouTube </li></ul><ul><li>Wikipedia <...
Módulos  disponibles <ul><li>Los normales: </li></ul><ul><li>rewrite (como Apache) </li></ul><ul><li>auth (HTTP auth, con ...
Problemas y soluciones <ul><li>Clusters (FastCGI) </li></ul><ul><li>Downloads &quot;protegidos&quot; (X-SENDFILE) </li></u...
Configuración condicional <ul><li>Se pueden comparar: cookie, host,useragent, referer, url, querystring, remoteip, socket,...
FastCGI <ul><li>El interprete de FastCGI (php, rails) corre permanentemente como un daemon, atendiendo en un socket (unix ...
Apache mod_php vs FastCGI <ul><li>Apache: </li></ul><ul><ul><li>atiende el request </li></ul></ul><ul><ul><li>se lo pasa i...
1 servidor HTTP, 3 servidores PHP FastCGI FastCGI FastCGI HTTP
Balanceo de Carga PHP <ul><li>Notas: </li></ul><ul><li>También  puede balancear usando SQF (shortest queue first )y Cache ...
Un servidor por &quot;zona&quot; $HTTP[&quot;url&quot;] =~ &quot; ^/forum &quot; { proxy-core.protocol = &quot;fastcgi&quo...
Distribuyendo la carga  <ul><li>mod_proxy_core </li></ul><ul><ul><li>Proxy de HTTP, FastCGI, SCGI, AJP13 </li></ul></ul><u...
Distribuyendo la carga $HTTP[&quot;url&quot;] =~ &quot;.php$&quot; { proxy-core.protocol = &quot;fastcgi&quot; proxy-core....
Sirviendo downloads &quot;protegidos&quot; <ul><li>Problema  clásico : </li></ul><ul><li>El archivo / screensaver &quot;pe...
Sirviendo archivos &quot;protegidos&quot; <ul><li>Problemas de la solucion  clásica : </li></ul><ul><li>No hay resume de d...
Solución  Lighty recanchera <ul><li>Ventajas: </li></ul><ul><li>Es muy  rápido ; el archivo lo manda el kernel directo (us...
Scripteando las tripas de Lighty <ul><li>ModMagnet &quot;atrae&quot; los requests al servidor HTTP y permite modificarlos ...
Un archivo al azar En PHP, PHP+X-Sendfile y LUA <?php header(&quot;Content-Type: image/png&quot;); print file_get_contents...
magnet, minibenchmark <ul><li>Resultados: </li></ul><ul><li>PHP: 212.47 trans/sec (100%) </li></ul><ul><li>PHP + X-Sendfil...
magnet: cache html  <ul><li>Idea de un cache HTML bastante rudimentario </li></ul><ul><li>La primera vez que un script PHP...
magnet: cache html  Guardar el output HTML en el archivo temporal: <?php function cache_html(){ function write_html($text)...
magnet: cache html  Devolver el contenido del archivo temporal si existe y terminar la ejecucion (PHP): <?php function sho...
magnet: cache html  Devolver el contenido del archivo temporal si existe y terminar la ejecucion (LUA): info = lighty.stat...
magnet: cache html  <ul><li>Benchmark de juguete: </li></ul><ul><li>Cache PHP: 189.53 trans/sec (100%) </li></ul><ul><li>C...
Ayuda, por dios! <ul><li>http://www.lighttpd.net </li></ul><ul><li>http://blog.lighttpd.net </li></ul><ul><li>Trac (wiki+t...
Upcoming SlideShare
Loading in...5
×

Apache ha muerto, Viva Lighttpd

7,972

Published on

Lighttpd es un webserver que nacio como un Proof of Concept de "The C10K problem": "It's time for web servers to handle ten thousand clients simultaneously".

Tres años despues, Lighttpd es un webserver estable, rapido e increiblemente flexible; lo que lo hace una opcion ideal para servir aplicaciones web hechas a medida.

Published in: Business
1 Comment
6 Likes
Statistics
Notes
  • No creas que está tan muerto. Harán algo para subsanar el problema ya si acaso con el futuro Apache 3.0.

    http://www.slideshare.net/Metaconta/servidor-web-apache-php-mysql


    Saludo.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
7,972
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
132
Comments
1
Likes
6
Embeds 0
No embeds

No notes for slide

Apache ha muerto, Viva Lighttpd

  1. 1. Apache ha muerto Viva LIGHTTPD! [email_address] * No creo realmente que el Apache haya muerto, pero si que ahora hay mas opciones, algunas mucho mas interesantes, como Lighty. El titulo de la presentacion es para provocar, nomas.
  2. 2. Características <ul><li>Casi 3 años de desarrollo. Lo empezo un tal Jan Kneschke </li></ul><ul><li>La ultima versión estable es 1.4.18, devel es 1.5-prerelease. Licencia BSD. </li></ul><ul><li>Proof of Concept de &quot;The C10K problem&quot;: &quot;It's time for web servers to handle 10.000 clients simultaneously&quot; </li></ul><ul><li>Corre PHP, Python, PERL, Ruby, cualquier cosa que sea FastCGI o SCGI o AJP13 o ... </li></ul><ul><li>Market Share de 0.6% (feb 2007) </li></ul><ul><li>Mueve 6 de los Top 250 sitios en la internet (Alexa - puaj) </li></ul><ul><li>Increíblemente rápido , liviano y flexible (condicionales, etc) </li></ul>
  3. 3. La filosofía Lighty <ul><li>Un solo proceso, 1 solo thread </li></ul><ul><li>KISS: “keep it simple, stupid” </li></ul><ul><ul><li>Los archivos estáticos los manda directo el kernel: del disco al socket </li></ul></ul><ul><ul><li>FastCGI: Los script PHP los procesa -el- PHP (no el mod_php, ni el mod_snake) </li></ul></ul><ul><li>Un web server es, básicamente , un programa que mueve texto de un lado al otro de la memoria. Mover &quot;mucho&quot; texto no debería ser algo &quot;pesado&quot; (limitado por el CPU) </li></ul><ul><ul><li>Lighttpd como proxy HTTP </li></ul></ul><ul><li>&quot;The web is a pipe&quot; </li></ul>
  4. 4. Cuando si, cuando no <ul><li>Lighty es perfecto cuando: </li></ul><ul><li>Uno puede y quiere tener control total sobre las aplicaciones que corre </li></ul><ul><li>Cuando el hardware no esta súper exigido </li></ul><ul><li>Lighty no es ideal cuando: </li></ul><ul><li>Hay cientos de usuarios distintos usando virtualhosts (virtual hosting barato) y van a quejarse de cosas como &quot;los rewrites de Apache no me andan!&quot; </li></ul><ul><li>Los recursos son escasos para el trafico (discos exprimidos!) </li></ul>
  5. 5. Quien usa Lighttpd <ul><li>Algunos nombres &quot;importantes&quot; </li></ul><ul><li>YouTube </li></ul><ul><li>Wikipedia </li></ul><ul><li>ImageShack </li></ul><ul><li>SourceForge </li></ul><ul><li>SendSpace.com </li></ul><ul><li>MiniNova.org </li></ul><ul><li>IsoHunt.com </li></ul>
  6. 6. Módulos disponibles <ul><li>Los normales: </li></ul><ul><li>rewrite (como Apache) </li></ul><ul><li>auth (HTTP auth, con distintos backends) </li></ul><ul><li>deflate (comprime con GZIP o BZIP2, todo lo que es text/*) </li></ul><ul><li>expire (agrega headers de Expires) </li></ul><ul><li>... </li></ul><ul><li>Los emocionantes: </li></ul><ul><li>flv_streaming (youtube en casa!) </li></ul><ul><li>magnet (dar vuelta requests como una media) </li></ul><ul><li>trigger_b4_dl (anti hotlinking) </li></ul><ul><li>upload_progress (progress bars en javascript fáciles ) </li></ul>
  7. 7. Problemas y soluciones <ul><li>Clusters (FastCGI) </li></ul><ul><li>Downloads &quot;protegidos&quot; (X-SENDFILE) </li></ul><ul><li>Distribuyendo la carga (mod_proxy_core) </li></ul><ul><li>Scripteando las tripas de lighty (mod magnet) </li></ul><ul><ul><li>imágenes al azar </li></ul></ul><ul><ul><li>cache </li></ul></ul>
  8. 8. Configuración condicional <ul><li>Se pueden comparar: cookie, host,useragent, referer, url, querystring, remoteip, socket, path, existing-path </li></ul><ul><ul><li>server.document-root = &quot;/var/www/example/&quot; </li></ul></ul><ul><ul><li>$HTTP[&quot;host&quot;] == &quot;www2.example.org&quot; { </li></ul></ul><ul><ul><li>server.document-root = &quot;/var/www/alt/&quot; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>$HTTP[&quot;url&quot;] =~ &quot;^/images/&quot; { </li></ul></ul><ul><ul><li>expire.url = ( &quot;&quot; => &quot;access 365 days&quot; ) </li></ul></ul><ul><ul><li>} </li></ul></ul>
  9. 9. FastCGI <ul><li>El interprete de FastCGI (php, rails) corre permanentemente como un daemon, atendiendo en un socket (unix o TCP) </li></ul><ul><li>El webserver se le conecta para pedirle que interprete un script </li></ul><ul><li>El daemon devuelve una respuesta (ej, HTML) </li></ul><ul><li>Notas : </li></ul><ul><li>La performance obtenida es similar a la de Apache mod_php </li></ul><ul><li>Se necesita una instancia del interprete de FastCGI para cada pedido simultaneo (PHP va forkeando, como necesita) </li></ul>
  10. 10. Apache mod_php vs FastCGI <ul><li>Apache: </li></ul><ul><ul><li>atiende el request </li></ul></ul><ul><ul><li>se lo pasa internamente al mod_php </li></ul></ul><ul><ul><li>devuelve la respuesta </li></ul></ul><ul><li>Lighttpd: </li></ul><ul><ul><li>atiende el request </li></ul></ul><ul><ul><li>se conecta con el servidor de FastCGI (local o remoto) </li></ul></ul><ul><ul><li>devuelve la respuesta </li></ul></ul>
  11. 11. 1 servidor HTTP, 3 servidores PHP FastCGI FastCGI FastCGI HTTP
  12. 12. Balanceo de Carga PHP <ul><li>Notas: </li></ul><ul><li>También puede balancear usando SQF (shortest queue first )y Cache Array Routing Protocol (CARP) </li></ul><ul><li>Soporta FailOver: si un procesador esta caído , prueba con el próximo </li></ul><ul><ul><li>$HTTP[&quot;url&quot;] =~ &quot;.php$&quot; { </li></ul></ul><ul><ul><li>proxy-core.protocol = &quot;fastcgi&quot; </li></ul></ul><ul><ul><li>proxy-core.balancer = &quot;round-robin&quot; </li></ul></ul><ul><ul><li>proxy-core.backends = ( &quot;10.0.0.1:1000&quot;, </li></ul></ul><ul><ul><li>&quot;10.0.0.2:1000&quot;, &quot;10.0.0.3:1000&quot;) </li></ul></ul><ul><ul><li>} </li></ul></ul>
  13. 13. Un servidor por &quot;zona&quot; $HTTP[&quot;url&quot;] =~ &quot; ^/forum &quot; { proxy-core.protocol = &quot;fastcgi&quot; proxy-core.backends = ( &quot; 10.0.0.1:1000 &quot;) } $HTTP[&quot;url&quot;] =~ &quot; ^/torrents &quot; { proxy-core.protocol = &quot;fastcgi&quot; proxy-core.backends = ( &quot; 10.0.0.99:1000 &quot;) }
  14. 14. Distribuyendo la carga <ul><li>mod_proxy_core </li></ul><ul><ul><li>Proxy de HTTP, FastCGI, SCGI, AJP13 </li></ul></ul><ul><li>Un servidor de Lighttpd &quot;adelante&quot; </li></ul><ul><li>Funcionando como un proxy (sin cache!) </li></ul><ul><li>Redirgiendo los requests al backend correspondiente </li></ul><ul><ul><li>Los PHP a 10.0.0.1:1000 (FastCGI) </li></ul></ul><ul><ul><li>Las imágenes , al servidor que les corresponda </li></ul></ul><ul><ul><ul><li>/images/[0-4]/* -> http://10.0.0.2/images/ (HTTP) </li></ul></ul></ul><ul><ul><ul><li>/images/[5-9]/* -> http://10.0.0.3/images/ (HTTP) </li></ul></ul></ul>
  15. 15. Distribuyendo la carga $HTTP[&quot;url&quot;] =~ &quot;.php$&quot; { proxy-core.protocol = &quot;fastcgi&quot; proxy-core.backends = ( &quot;10.0.0.1:1000&quot; ) } else $HTTP[&quot;url&quot;] =~ &quot;^/images/[0-4]/&quot; { proxy-core.protocol = &quot;http&quot; proxy-core.backends = ( &quot;10.0.0.2:80&quot; ) } else $HTTP[&quot;url&quot;] =~ &quot;^/images/[5-9]/&quot; { proxy-core.protocol = &quot;http&quot; proxy-core.backends = ( &quot;10.0.0.3:80&quot; ) } The web is a pipe!
  16. 16. Sirviendo downloads &quot;protegidos&quot; <ul><li>Problema clásico : </li></ul><ul><li>El archivo / screensaver &quot;pescaditos.exe&quot; esta solo disponible para usuarios registrados </li></ul><ul><li>Solución clásica (php): </li></ul><ul><li><?php </li></ul><ul><li>if (usuario_registrado()){ </li></ul><ul><li>header(&quot;Content-type: application/octet-stream&quot;); </li></ul><ul><li>print file_get_contents(&quot;/opt/files/pescaditos.exe&quot;); </li></ul><ul><li>} </li></ul>
  17. 17. Sirviendo archivos &quot;protegidos&quot; <ul><li>Problemas de la solucion clásica : </li></ul><ul><li>No hay resume de downloads </li></ul><ul><li>No hay cache de ningún tipo </li></ul><ul><li>Ocupa un &quot;servidor de php&quot; (Apache child o FastCGI) </li></ul><ul><li>Es leeento (abrir el archivo, copiar el contenido del archivo a la memoria, mandar el contenido al socket) </li></ul><ul><li>Desperdicia memoria con archivos &quot;grandes&quot; </li></ul><ul><li>Solución Lighty recanchera: </li></ul><ul><li>El PHP (o lo que sea) valida si el usuario tiene permisos </li></ul><ul><li>Devuelve un header de HTTP especial, &quot;X-Sendfile&quot; con el path del archivo estático a devolver </li></ul><ul><li>Lighty encuentra este header especial y manda al kernel a darle el archivo al usuario </li></ul>
  18. 18. Solución Lighty recanchera <ul><li>Ventajas: </li></ul><ul><li>Es muy rápido ; el archivo lo manda el kernel directo (usa sendfile(2) </li></ul><ul><li>Manda headers HTTP como la gente: Last-Modification, Etag, Size </li></ul><ul><li>Soporta resume, puede responder If-Modified-Since, If-None-Match, etc </li></ul><ul><li>No ocupa un procesador de FastCGI </li></ul><?php if (usuario_registrado()) header(&quot;X-Sendfile: /opt/files/pescaditos.exe&quot;);
  19. 19. Scripteando las tripas de Lighty <ul><li>ModMagnet &quot;atrae&quot; los requests al servidor HTTP y permite modificarlos a gusto </li></ul><ul><li>Usa scripts LUA para alterar los pedidos / las respuestas </li></ul><ul><li>Los scripts solo son compilados cuando el servidor es reiniciado o cuando cambian </li></ul><ul><li>Corre en el mismo proceso que lighty, así que cualquier operación &quot;lenta&quot; bloquea todo el server </li></ul><ul><li>Permite hacer cosas bastante macabras </li></ul>
  20. 20. Un archivo al azar En PHP, PHP+X-Sendfile y LUA <?php header(&quot;Content-Type: image/png&quot;); print file_get_contents(&quot;imgs/&quot;.rand(0,9).&quot;.png&quot;); <?php header(&quot;Content-Type: image/png&quot;); header(&quot;X-Sendfile: &quot;.getcwd(). &quot;/imgs/&quot;.rand(0,9).&quot;.png&quot;); lighty.env[&quot;request.uri&quot;]=&quot;/imgs/&quot; .. math.random(9) .. &quot;.png&quot; return lighty.RESTART_REQUEST
  21. 21. magnet, minibenchmark <ul><li>Resultados: </li></ul><ul><li>PHP: 212.47 trans/sec (100%) </li></ul><ul><li>PHP + X-Sendfile: 264.10 trans/sec (124%) </li></ul><ul><li>LUA: 432.97 trans/sec (203%) </li></ul>
  22. 22. magnet: cache html <ul><li>Idea de un cache HTML bastante rudimentario </li></ul><ul><li>La primera vez que un script PHP se ejecuta, su salida (probablemente HTML) se guarda en un archivo temporal </li></ul><ul><li>Las siguientes veces que es ejecutado, antes de hacer todas las cosas &quot;interesantes&quot; (conectarse a la db, hacer cosas), nos fijamos si este archivo temporal existe. </li></ul><ul><li>Si es así , se devuelve el contenido del archivo temporal, evitando (y nos ahorramos toda la parte larga) </li></ul>
  23. 23. magnet: cache html Guardar el output HTML en el archivo temporal: <?php function cache_html(){ function write_html($text){ $info = stat($_SERVER[&quot;SCRIPT_FILENAME&quot;]); file_put_contents(&quot;/tmp/&quot;.$info['ino'].&quot;.html&quot;,$text); return false; } ob_start(&quot;write_html&quot;); }
  24. 24. magnet: cache html Devolver el contenido del archivo temporal si existe y terminar la ejecucion (PHP): <?php function show_cached(){ $info = stat($_SERVER[&quot;SCRIPT_FILENAME&quot;]); $cache_file = &quot;/tmp/&quot;.$info['ino'].&quot;.html&quot;; if (file_exists($cache_file)){ print file_get_contents($cache_file); exit; } }
  25. 25. magnet: cache html Devolver el contenido del archivo temporal si existe y terminar la ejecucion (LUA): info = lighty.stat(lighty.env[&quot;physical.path&quot;]) cache_path = &quot;/tmp/&quot;..info[&quot;st_ino&quot;]..&quot;.html&quot; cache_info = lighty.stat(cache_path) if (cache_info) then lighty.env[&quot;physical.path&quot;] = cache_path end
  26. 26. magnet: cache html <ul><li>Benchmark de juguete: </li></ul><ul><li>Cache PHP: 189.53 trans/sec (100%) </li></ul><ul><li>Cache LUA: 360.72 trans/sec (190%) </li></ul>
  27. 27. Ayuda, por dios! <ul><li>http://www.lighttpd.net </li></ul><ul><li>http://blog.lighttpd.net </li></ul><ul><li>Trac (wiki+tickets) </li></ul><ul><ul><li>http://trac.lighttpd.net /trac/wiki/ </li></ul></ul><ul><li>#lighttpd@irc.freenode.net </li></ul><ul><li>http://forum.lighttpd.net/forum/1/ </li></ul><ul><li>[email_address] </li></ul>Creative Commons Attribution-Noncommercial Share Alike 2.5 Argentina License
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×