{"id":2491,"date":"2011-02-05T11:50:58","date_gmt":"2011-02-05T10:50:58","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=2491"},"modified":"2011-02-05T11:50:58","modified_gmt":"2011-02-05T10:50:58","slug":"modificaciones-en-el-servidor-fachada-nginx","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=2491","title":{"rendered":"Modificaciones en el servidor: fachada nginx"},"content":{"rendered":"<p>Estas semanas, cuando el trabajo y la salud me lo han permitido, he estado realizando algunos cambios en el servidor. Como <a href=\"http:\/\/bitacora.eniac2000.com\/?p=2460\">coment\u00e9 anteriormente<\/a>, el m\u00e1s importante ha sido el cambio de su ubicaci\u00f3n: ha pasado de ser un servidor virtual VMWare ubicado en C\u00f3rdoba a ser un servidor f\u00edsico emplazado en Sevilla. Y ya que estaba de cambios, me decid\u00ed a probar un servidor web del que llevaba tiempo escuchando hablar: nginx.<\/p>\n<p><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2011\/01\/nginx-logo.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2011\/01\/nginx-logo.png\" alt=\"Logo NGINX\" title=\"Logo NGINX\" width=\"350\" height=\"90\" class=\"aligncenter size-full wp-image-2462\" \/><\/a><\/p>\n<p>nginx es un servidor web\/proxy inverso ligero de alto rendimiento y un proxy para protocolos de correo electr\u00f3nico (IMAP\/POP3). Es software libre y de c\u00f3digo abierto, licenciado bajo la Licencia BSD simplificada. Es multiplataforma, por lo que corre en sistemas tipo Unix (GNU\/Linux, BSD, Solaris, Mac OS X, etc.) y Windows. <\/p>\n<p>El sistema es empleado en una larga lista de sitios web conocidos, como: WordPress, Hulu, GitHub, Ohloh,  SourceForge y TorrentReactor.  Originalmente, nginx fue desarrollado para  satisfacer las necesidades de varios sitios web de Rambler que recib\u00edan unas 500 millones de peticiones al d\u00eda en septiembre de 2008. <\/p>\n<p>De acuerdo con el estudio de Netcraft, Netcraft\u2019s May 2010 Web Server Survey, nginx fue el tercer servidor web m\u00e1s usado en todos los dominios (6.55% de los sitios estudiados) y el cuarto servidor web m\u00e1s usado en los sitios activos (8.77% de los sitios estudiados). <\/p>\n<p>Sus caracter\u00edsticas b\u00e1sicas son las siguientes: <\/p>\n<ul>\n<li>Servidor de archivos est\u00e1ticos, \u00edndices y autoindexado<\/li>\n<li>Habilitado para soportar m\u00e1s de 10.000 conexiones simult\u00e1neas<\/li>\n<li>Proxy inverso con opciones de cach\u00e9<\/li>\n<li>Balance de carga<\/li>\n<li>Tolerancia a fallos<\/li>\n<li>Soporte de HTTP sobre SSL<\/li>\n<li>Soporte para FastCGI con opciones de cach\u00e9<\/li>\n<li>Servidores virtuales basados en nombre y\/o en direcci\u00f3n IP<\/li>\n<li>Streaming de archivos FLV y MP4<\/li>\n<li>Soporte para autenticaci\u00f3n<\/li>\n<li>Compresi\u00f3n gzip<\/li>\n<li>Capacidad de reescritura de URLs<\/li>\n<li>Sistema de log personalizable<\/li>\n<li>Soporte WebDAV<\/li>\n<\/ul>\n<p>La arquitectura interna de nginx le permite servir m\u00e1s peticiones por segundo con menos recursos que sus principales alternativas. \u00c9sta consiste en un proceso maestro que delega el trabajo en uno o varios procesos \u201cworker\u201d. Cada worker gestiona m\u00faltiples peticiones de modo basado en eventos, o bien as\u00edncrono, haciendo uso de funcionalidades especiales del kernel Linux (epoll\/select\/poll). Esto permite a nginx gestionar un gran n\u00famero de peticiones concurrentes de una manera r\u00e1pida y con muy poca sobrecarga. Por ejemplo, un servidor Apache puede ser configurado para procesar las bien una petici\u00f3n por proceso (pre-fork) o bien una petici\u00f3n por cada hilo (worker). Aunque el modo basado en hilos de Apache tiene un rendimiento mucho mejor que el basado en procesos, sigue haciendo uso de mucha m\u00e1s memoria y CPU que la arquitectura basada en eventos de nginx. <\/p>\n<p>En mi caso concreto, mi servidor web contiene las siguientes aplicaciones:<\/p>\n<ul>\n<li>Una bit\u00e1cora. La que est\u00e1s leyendo, que utiliza WordPress. Necesita PHP y una base de datos MySQL<\/li>\n<li>Un sistema de almacenamiento de fotograf\u00edas. Utiliza Gallery2. Tambi\u00e9n necesita PHP, MySQL, y una serie de molestas reescrituras<\/li>\n<li>Una serie de aplicaciones menores de mantenimiento y de gesti\u00f3n de logs. Por lo general, usan PHP, CGI, y alguna de ellas MySQL<\/li>\n<\/ul>\n<p>Mi objetivo primordial era realizar un reemplazo completo del servidor Apache, motivado por las siguientes razones: el cambio del servidor me ha dejado con menos recursos hardware (en concreto, con menos RAM y con un procesador menos potente), y sobre todo, comprobar si nginx es tan bueno como lo vende.<\/p>\n<p>A la hora de realizar el cambio, pude comprobar algo que es bastante importante: nginx es un servidor web de ficheros est\u00e1ticos. Esto quiere decir que si est\u00e1s pensando en sacar a trav\u00e9s de \u00e9l p\u00e1ginas web din\u00e1micas tienes un problema. Por suerte es un problema f\u00e1cilmente abordable, ya que al estar pensado desde el principio como un servidor proxy inverso, tienes la capacidad de delegar funcionalidades no soportadas en otros servidores adicionales. En mi caso, instal\u00e9 en mi servidor Debian un servidor PHP externo, spawn-fcgi, que escucha peticiones por el puerto 9000.<\/p>\n<p>La migraci\u00f3n de WordPress no supuso mayor problema, una vez solucionado el tema anterior. Sin embargo, la de Gallery2 s\u00ed me ha planteado m\u00e1s dificultades, debido a una serie de <em>reescrituras<\/em> un tanto especiales que necesita para mantener funcionando el sistema. Tras varios d\u00edas de pruebas, y viendo que no alcanzaba a migrar completamente esta aplicaci\u00f3n, decid\u00ed darle un cambio de perspectiva: mantener el servidor Apache como un servidor web subordinado, y emplear nginx como servidor de fachada, con cach\u00e9 de contenido. No hay mal que por bien no venga, ya que me ha supuesto la oportunidad de realizar pruebas de esta funcionalidad, de cara a una l\u00ednea de trabajo que estoy desarrollando para mi empresa.<\/p>\n<p>Como consecuencia de lo anterior, decid\u00ed mover los puertos de servicio del servidor Apache al 81 (conexi\u00f3n http) y 444 (conexi\u00f3n https), que son s\u00f3lo alcanzables desde la red interna de mi casa. Mediante una serie de reescrituras, las peticiones efectuadas al sistema Gallery2 son dirigidas al servidor Apache, procesadas por \u00e9ste, y reenviadas por nginx al cliente, adem\u00e1s de ser cacheadas para ganar en tiempo de respuesta. El resto de peticiones (WordPress, otras aplicaciones&#8230;) son servidas directamente por el servidor nginx. Un diagrama b\u00e1sico de lo expuesto hasta el momento ser\u00eda el siguiente:<\/p>\n<figure id=\"attachment_2492\" aria-describedby=\"caption-attachment-2492\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2011\/02\/fachada-nginx.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2011\/02\/fachada-nginx-400x307.png\" alt=\"Diagrama de arquitectura\" title=\"Diagrama de arquitectura\" width=\"400\" height=\"307\" class=\"size-medium wp-image-2492\" \/><\/a><figcaption id=\"caption-attachment-2492\" class=\"wp-caption-text\">Diagrama de arquitectura<\/figcaption><\/figure>\n<p>El resultado desde el punto de vista funcional es bastante bueno: las aplicaciones siguen siendo servidas de manera correcta, se ha ganado algo en tiempo de respuesta (por desgracia, la poca potencia del servidor y las limitaciones de la l\u00ednea de datos no permiten grandes alegr\u00edas), y ha disminuido el consumo de memoria: pese a no haber eliminado el servidor Apache, se ha pasado de consumir unos 900 MB de RAM a unos 780, y con un comportamiento mucho m\u00e1s estable. Cada proceso nginx consume un m\u00e1ximo de 3 MB, mientras que cada proceso Apache ronda los 50 MB, con una gran fluctuaci\u00f3n de memoria consumida. A esto hay que sumar los dos procesos configurados para spawn-fcgi, que tambi\u00e9n rondan los 50 MBs. La bajada en el consumo ha venido de haber podido reducir el n\u00famero de procesos Apache que se mantienen en ejecuci\u00f3n: he podido pasar de un m\u00ednimo de 10 procesos concurrentes a tan s\u00f3lo 2.<\/p>\n<p>En resumen: estoy bastante contento con el cambio. Estoy aprendiendo a gestionar servidores web de alto rendimiento, y creo que voy a poder sacarle bastante partido a este servidor nginx en el \u00e1mbito laboral. Esperemos que as\u00ed sea.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Estas semanas, cuando el trabajo y la salud me lo<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[116,517,1147,1169,1268,1522],"series":[],"class_list":["post-2491","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-apache","tag-debian","tag-mysql","tag-nginx","tag-php","tag-servidor-web"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/2491","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2491"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/2491\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2491"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=2491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}