<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El blog de LandM &#187; nginx</title>
	<atom:link href="http://blog.landm.net/tag/nginx/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.landm.net</link>
	<description>System Administrators and IT experts Blog</description>
	<lastBuildDate>Thu, 17 Jun 2010 08:34:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>proxy inverso y cómo pasar la ip real al servidor del backend</title>
		<link>http://blog.landm.net/2008/08/proxy-inverso-y-como-pasar-la-ip-real-al-servidor-del-backend/</link>
		<comments>http://blog.landm.net/2008/08/proxy-inverso-y-como-pasar-la-ip-real-al-servidor-del-backend/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 21:37:57 +0000</pubDate>
		<dc:creator>lucas</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[pasar ip]]></category>
		<category><![CDATA[proxy inverso]]></category>

		<guid isPermaLink="false">http://blog.landm.net/?p=51</guid>
		<description><![CDATA[Cuando se monta una infraestructura algo más compleja que las normales, se suele utilizar un frontend web para servir contenido estático y el resto pasarlo al backend para que sea interpretado por un servidor de aplicaciones (java, php, &#8230;). Esto es muy cómodo de administrar y se puede montar alta disponibilidad desde el frontend.
En este [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando se monta una infraestructura algo más compleja que las normales, se suele utilizar un frontend web para servir contenido estático y el resto pasarlo al backend para que sea interpretado por un servidor de aplicaciones (java, php, &#8230;). Esto es muy cómodo de administrar y se puede montar alta disponibilidad desde el frontend.</p>
<p>En este caso se hace un proxy inverso, es decir, se envían las peticiones desde el frontend al backend. El &#8220;problema&#8221; es que las peticiones tienen origen (frontend) 127.0.0.1 (si en el backend está en la misma máquina) o la ip interna 192.x.x.x (si el backend está en la red interna). Si el frontend es suficientemente flexible soporta balanceo entre servidores. Esta es una lista de frontends que funcionan muy bien:</p>
<ul>
<li><a title="pond" href="http://www.apsis.ch/pound/index_html" target="_blank">pound</a>: básicamente es un balanceador, pero muy eficiente</li>
<li><a title="perbal" href="http://www.danga.com/perlbal/" target="_blank">perlbal</a>: balanceador hecho en perl y servidor web para archivos estáticos. El código perl es sencillo y muy pontente, por lo que se pueden añadir funcionalidades rápidamente. Muy eficiente.</li>
<li><a title="Squid" href="http://www.squid-cache.org/" target="_blank">squid</a>: el de siempre. Se ha utilizado mucho para hacer proxy directo en vez de inverso, pero también se puede utilizar. Funciona muy bien y tiene un montón de funcionalidades, pero es menos eficiente que los anteriores.</li>
<li><a title="HAProxy" href="http://1wt.eu/articles/2006_lb/index.html#intr" target="_blank">HAPrroxy</a>: si buscas información detellada no te pierdas la documentación. Al final existe una <a href="http://1wt.eu/articles/2006_lb/index_10.html" target="_blank">explicación</a> de la arquitectura separada en contenido estático y dinámico. Es uno de los mejores balanceadores/proxy, aunque incluye más funcionalidades.</li>
<li><a title="Lighttpd" href="http://www.lighttpd.net/" target="_blank">lighttpd</a>: es un servidor web que nos puede servir páginas estáticas y hacer de proxy para el resto de peticiones. Una de las funcionalidades más interesantes es que puedes aplicar <em>regular expressions</em> para decidir el backend. Lo utilizamos en alguna ocasión con éxito.</li>
<li><a title="nginx" href="http://nginx.net/" target="_blank">nginx</a>: es un servidor web que cada día tiene mejor pinta. Es muy eficiente, rápido y sencillo de configurar. Cada día peligra más la hegemonía del apache. Permite servir un tipo de contenido y reenviar el resto al backend. Permite también <em>regular expressions</em>. Lo tenemos como frontend en algunos servidores y es una maravilla.</li>
</ul>
<p>Pues bien, todas estas soluciones hay que configurarlas para que envíen la ip real al backend. Por ejemplo, en el caso del nginx hay que poner estas líneas:</p>
<p>proxy_set_header X-Real-IP $remote_addr;</p>
<p>proxy_set_header Host $host;</p>
<p>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</p>
<p>Sin embargo, el apache siempre pinta la ip del que viene la petición: 127.0.0.1 o la ip interna. Para lograr que pinte la ip real hay que utilizar un pequeño módulo: <a title="mod_rpaf" href="http://stderr.net/apache/rpaf/" target="_blank">mod_rpaf</a>.</p>
<p>El montaje es sencillo:</p>
<pre class="code">$ wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.5.tar.gz
$ tar xzf mod_rpaf-0.5.tar.gz
$ cd mod_rpaf-0.5
$ vi Makefile (editar la variable APXS)
$ make rpaf; make install (para el apache 1.x)
$ make rpaf-2.0; make install-2.0 (para el apache 2.0.x)</pre>
<p>Luego hay que editar la configuración del apache y añadir estas líneas:</p>
<pre>LoadModule rpaf_module        libexec/mod_rpaf.so
AddModule mod_rpaf.c
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.1.1
RPAFheader X-Forwarded-For</pre>
<p>Ojo, en la línea RPAFproxy_ips hay que poner todas las ips desde donde vengan las peticiones al apache. Reiniciamos el apache y ya están las ips reales en los ficheros de logs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.landm.net/2008/08/proxy-inverso-y-como-pasar-la-ip-real-al-servidor-del-backend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
