<?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># rm-rf.es &#187; Apache</title>
	<atom:link href="http://rm-rf.es/categoria/apache/feed/" rel="self" type="application/rss+xml" />
	<link>http://rm-rf.es</link>
	<description>Administración de sistemas, Unix, Linux, FreeBSD, Windows, hosting, dominios, servidores...</description>
	<lastBuildDate>Sat, 28 Jan 2012 19:36:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Pasos para activar WebDAV en Apache (mod_dav)</title>
		<link>http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/</link>
		<comments>http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 08:28:47 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[webDAV]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2454</guid>
		<description><![CDATA[El objetivo de WebDAV es hacer de la World Wide Web un medio legible y editable, en línea con la visión original de Tim Berners-Lee. Este protocolo proporciona funcionalidades para crear, cambiar y mover documentos en un servidor remoto (típicamente un servidor web). Esto se utiliza sobre todo para permitir la edición de los documentos [...]]]></description>
			<content:encoded><![CDATA[<p><img align="right" src="http://rm-rf.es/wp-content/uploads/2011/08/apache.jpg" alt="Apache" title="Apache" width="150" height="149" class="size-full wp-image-2132" /><br />
<blockquote>El objetivo de WebDAV es hacer de la <a title="World Wide Web" href="http://es.wikipedia.org/wiki/World_Wide_Web">World Wide Web</a> un medio legible <em>y</em> editable, en línea con la visión original de <a title="Tim Berners-Lee" href="http://es.wikipedia.org/wiki/Tim_Berners-Lee">Tim Berners-Lee</a>. Este protocolo proporciona funcionalidades para crear, cambiar y mover documentos en un servidor remoto (típicamente un servidor web). Esto se utiliza sobre todo para permitir la edición de los documentos que sirve un servidor web, pero puede también aplicarse a sistemas de almacenamiento generales basados en web, que pueden ser accedidos desde cualquier lugar. La mayoría de los sistemas operativos modernos proporcionan soporte para WebDAV, haciendo que los ficheros de un servidor WebDAV aparezcan como almacenados en un <a title="Directorio" href="http://es.wikipedia.org/wiki/Directorio">directorio</a> local.</p>
<p style="text-align: right;"><a href="http://es.wikipedia.org/wiki/WebDAV" target="_blank">Definición de WebDAV en Wikipedia</a></p>
</blockquote>
<h3>Preparación/instalación</h3>
<p>Vamos a ver los pasos (sencillos) para <strong>activar WebDAV en Apache</strong>. Lo primero que hay que verificar es que el módulo mod_dav está cargado, ya sea de forma estática o dinámica. Normalmente cuando instalamos Apache por gestor de paquetes viene cargado de forma dinámica en el fichero httpd.conf:</p>
<pre>Loadmodule dav_module modules/libdav.so</pre>
<p>Si por contra <a title="Cómo compilar Apache y PHP en Linux" href="http://rm-rf.es/como-compilar-apache-php-linux/" target="_blank">compilamos Apache manualmente</a> podemos decidir si compilarlo estáticamente o dinámicamente (como hemos visto antes). Para hacerlo estáticamente añadiremos la directiva correspondiente a la línea de compilación y podremos ver si está cargado con el comando:</p>
<pre># httpd -l</pre>
<p>Otra opción es instalar el paquete por yum/apt/pkg si el paquete está disponible en un repositorio.</p>
<h3>Configuración</h3>
<p>Lo primero que tenemos que hacer es <strong>activar el soporte para WebDAV</strong> a nivel general de Apache, para ello añadiremos la siguiente línea en el fichero httpd.conf. Podemos restringirlo a nivel de &lt;Directory&gt; o &lt;Location&gt;:</p>
<pre>Dav On</pre>
<p>Además de esto, debemos especificar la <strong>base de datos de bloqueos (Lock Database)</strong> en la sección global de la configuración del httpd.conf:</p>
<pre>DavLockDB /etc/apache/var/DavLock</pre>
<p>Este directorio debe tener permisos de escritura para el usuario y grupo que ejecuta el servidor Apache.</p>
<p>El resultado final sería el siguiente, en este ejemplo activamos WebDAV en una ubicación (/webdav) únicamente para usuarios autenticados (admin) configurados con <a title="Generar fichero htpasswd desde línea de comandos" href="http://rm-rf.es/generar-fichero-htpasswd-desde-linea-de-comandos/" target="_blank">htpasswd</a></p>
<pre>DavLockDB /usr/local/apache2/var/DavLock
&lt;Location /webdav&gt;
   Dav On

   AuthType Basic
   AuthName DAV
   AuthUserFile user.passwd

   &lt;LimitExcept GET OPTIONS&gt;
     require user admin
   &lt;/LimitExcept&gt;
&lt;/Location&gt;</pre>
<p>Estas mismas directivas (a excepción del DavLockDB) podríamos añadirlas dentro de un virtualhost.</p>
<h3>Conectar al WebDAV</h3>
<p>Muchos sistemas soportan acceso a WebDAV de forma nativa. No obstante, en Linux podéis usar <strong>cadaver</strong> sobre línea de comandos:</p>
<pre>$ cadaver http://dav.test.com/webdav/
...
...
dav:/webdav/&gt;</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/" title="mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)">mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)</a></li><li><a href="http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/" title="Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;">Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;</a></li><li><a href="http://rm-rf.es/apache-como-hacer-debug-de-mod_rewrite/" title="Apache: cómo hacer debug de mod_rewrite">Apache: cómo hacer debug de mod_rewrite</a></li><li><a href="http://rm-rf.es/error-28no-space-left-on-device-mod_python-failed-to-create-global-mutex/" title="[error] (28)No space left on device: mod_python: Failed to create global mutex">[error] (28)No space left on device: mod_python: Failed to create global mutex</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)</title>
		<link>http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/</link>
		<comments>http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 10:18:25 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2170</guid>
		<description><![CDATA[Si utilizas Apache + FastCGI y no has modificado los parámetros por defecto de configuración de fasctcgi es probable que si intentas hacer upload de ciertos ficheros cuyo tamaño no sea muy pequeño recibas un error como este en el log: [Tue Aug 30 12:05:13 2011] [warn] [client XX.XX.XXX.XX] mod_fcgid: HTTP request length 132147 (so [...]]]></description>
			<content:encoded><![CDATA[<p>Si utilizas <strong>Apache + FastCGI</strong> y no has modificado los parámetros por defecto de configuración de fasctcgi es probable que si intentas hacer upload de ciertos ficheros cuyo tamaño no sea muy pequeño recibas un error como este en el log:</p>
<pre>[Tue Aug 30 12:05:13 2011] [warn] [client XX.XX.XXX.XX] mod_fcgid: HTTP request length 132147 (so far) exceeds MaxRequestLen (131072)</pre>
<p><strong>FastCGI</strong> está bloqueando la subida del fichero debido a su tamaño. Los límites iniciales de la directiva <strong>MaxRequestLen</strong> son muy bajos por defecto (131072), así que conviene ampliarlos para evitar este tipo de errores, por ejemplo a 15MB. Esta directiva la añadimos dentro del fichero php.conf (en la carpeta conf/ de apache) y sino dentro del IfModule correspondiente a fastcgi:</p>
<pre>&lt;IfModule mod_fcgid.c&gt;
MaxRequestLen 15728640
...
...
&lt;/IfModule&gt;</pre>
<p><a title="Apache: diferencia entre reiniciar con ‘restart’ y ‘graceful’" href="http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/">Reiniciamos apache</a> y listo. Hay que tener en cuenta que esto mismo puede suceder también en servidores con <a title="Instalación y configuración de Lighttpd con PHP + FastCGI" href="http://rm-rf.es/instalacion-y-configuracion-de-lighttpd-con-php-fastcgi/">Lighttpd y FastCGI</a>.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/" title="Pasos para activar WebDAV en Apache (mod_dav)">Pasos para activar WebDAV en Apache (mod_dav)</a></li><li><a href="http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/" title="Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;">Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;</a></li><li><a href="http://rm-rf.es/lighttpd-proteger-una-carpeta-o-website-con-contrasena/" title="Lighttpd: proteger una carpeta o website con contraseña">Lighttpd: proteger una carpeta o website con contraseña</a></li><li><a href="http://rm-rf.es/apache-como-hacer-debug-de-mod_rewrite/" title="Apache: cómo hacer debug de mod_rewrite">Apache: cómo hacer debug de mod_rewrite</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache: servir PHP usando extensión HTML</title>
		<link>http://rm-rf.es/apache-servir-php-usando-extension-html/</link>
		<comments>http://rm-rf.es/apache-servir-php-usando-extension-html/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 15:10:59 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[htaccess]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2141</guid>
		<description><![CDATA[Existe la posibilidad de que queramos introducir código PHP dentro de ficheros estáticos (.html, .htm&#8230;), de modo que al servir la página a través del navegador dicho código php se ejecute en lugar de mostrarse como texto plano. Este truco valdría tanto para cualquier otra extensión (cgi por ejemplo). Para realizar esta configuración, debemos utilizar [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-2132" style="margin-left: 20px; margin-right: 20px;" title="Apache" src="http://rm-rf.es/wp-content/uploads/2011/08/apache.jpg" alt="Apache" align="right" />Existe la posibilidad de que queramos<strong> introducir código PHP dentro de ficheros estáticos (.html, .htm&#8230;)</strong>, de modo que al servir la página a través del navegador dicho código php se ejecute en lugar de mostrarse como texto plano. Este truco valdría tanto para cualquier otra extensión (cgi por ejemplo).</p>
<p>Para realizar esta configuración, debemos utilizar la directiva <a href="http://httpd.apache.org/docs/current/mod/mod_mime.html#addtype" target="_blank"><strong>AddType</strong></a> en el fichero <a title="htaccess" href="http://rm-rf.es/sobre/htaccess"><strong>.htaccess</strong></a> del website o directamente a nivel general del servidor web en el fichero <strong>httpd.conf</strong>.</p>
<p>Lo primero que debemos verificar es que tenemos cargado en Apache el <strong>módulo mod_mime</strong>, que es el encargado de servir la directiva AddType.</p>
<pre># httpd -l | grep mime
  mod_mime.c</pre>
<p>Una vez verificado, si quisieramos <strong>mapear las extensiones .html para servir contenido PHP</strong>, deberíamos añadir la siguiente directiva al fichero .htaccess:</p>
<pre>AddType application/x-httpd-php .php .htm .html .shtml</pre>
<p>Si tuvierais varias versiones de PHP instaladas en un mismo servidor, es posible que necesitéis especificar la versión del siguiente modo:</p>
<pre>AddType application/x-httpd-php5 .php .htm .html .shtml</pre>
<p>o</p>
<pre>AddType application/x-httpd-php4 .php .htm .html .shtml</pre>
<p>Esto lo podemos añadir también a nivel general en Apache, ya sea directamente en el httpd.conf o en el fichero php.conf junto con el resto de configuraciones de PHP. Si lo añadimos en httpd.conf reiniciamos el servicio tras hacerlo:</p>
<pre># /etc/init.d/httpd graceful</pre>
<p>Ahora, si hacemos un fichero test.html con el siguiente contenido, al servirlo en el navegador web ejecutará el código PHP en lugar de mostrarlo como si fuera html puro y duro:</p>
<pre>&lt;h1&gt;Prueba ejecutar PHP en fichero HTML&lt;/h1&gt;
&lt;? phpinfo ?&gt;</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/utilizar-htaccess-phpini-en-apache-con-suphp/" title="Utilizar .htaccess / php.ini en Apache con suPHP">Utilizar .htaccess / php.ini en Apache con suPHP</a></li><li><a href="http://rm-rf.es/10-trucos-para-securizar-php/" title="10 trucos para securizar PHP">10 trucos para securizar PHP</a></li><li><a href="http://rm-rf.es/stub-start-error-en-oracle-iplanet-web-server-php-fastcgi/" title="Stub Start Error en Oracle iPlanet Web Server: PHP + FastCGI">Stub Start Error en Oracle iPlanet Web Server: PHP + FastCGI</a></li><li><a href="http://rm-rf.es/configurar-php-fastcgi-en-oracle-iplanet-web-server/" title="Configurar PHP + FastCGI en Oracle iPlanet Web Server">Configurar PHP + FastCGI en Oracle iPlanet Web Server</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/apache-servir-php-usando-extension-html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;</title>
		<link>http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/</link>
		<comments>http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/#comments</comments>
		<pubDate>Sun, 14 Aug 2011 18:31:59 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[servidor web]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=2131</guid>
		<description><![CDATA[Vamos a ver las principales diferencias a la hora de reiniciar un servidor web Apache mediante /etc/init.d/httpd restart y /etc/init.d/httpd graceful . Reinicio con restart # apachectl -k restart # /etc/init.d/httpd restart Esta forma de reiniciar el servidor web es lo mismo que enviar una señal HUP a los procesos httpd (enviar señales a un [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-2132" style="margin-left: 20px; margin-right: 20px;" title="Apache" src="http://rm-rf.es/wp-content/uploads/2011/08/apache.jpg" alt="Apache" width="150" height="149" align="right" />Vamos a ver las principales diferencias a la hora de reiniciar un <strong>servidor web Apache</strong> mediante</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/etc/init.d/httpd restart</div></div>
<p>y</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/etc/init.d/httpd graceful</div></div>
<p>.</p>
<h3>Reinicio con restart</h3>
<pre># apachectl -k restart</pre>
<pre># /etc/init.d/httpd restart</pre>
<p>Esta forma de reiniciar el servidor web es lo mismo que enviar una señal HUP a los procesos httpd (<a title="Linux: enviar señales a un proceso con el comando kill" href="http://rm-rf.es/linux-enviar-senales-a-un-proceso-con-el-comando-kill/">enviar señales a un proceso</a>). Básicamente lo que hace es:</p>
<ol>
<li>Solicitar la finalización de los procesos con la señal <strong>TERM</strong> a los procesos child (hijos) y eliminar el proceso padre</li>
<li>Se vuelven a leer los ficheros de configuración y se abren los ficheros de log. Las estadísticas de <a title="Apache: Activar httpd fullstatus" href="http://rm-rf.es/apache-activar-httpd-fullstatus/">mod_status</a> se reinician</li>
<li>Se genera el proceso padre y a partir de él los nuevos procesos hijos</li>
</ol>
<p>Como podéis ver, hay parada de servicio. Puede llegar a ser mínima pero hay un momento en el que no hay ningún proceso httpd para servir peticiones web.</p>
<h3>Reinicio con graceful</h3>
<pre># apachectl -k graceful</pre>
<pre># /etc/init.d/httpd graceful</pre>
<p>Esta forma de reiniciar Apache hace que se envíe una señal</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">USR1</div></div>
<p>, lo cual hace que en lugar de reiniciar todos los procesos hijos de vez, el proceso padre permite que cada uno de los child termine de servir la petición web antes de morir. El proceso sería el siguiente:</p>
<ol>
<li>Enviamos la señal <strong>USR1</strong> o graceful</li>
<li>El proceso padre indica a los hijos que mueran una vez finalizada la petición que estén sirviendo</li>
<li>El proceso padre vuelve a leer los ficheros de configuración y abrir los logs</li>
<li>Los procesos hijos van terminando de servir las peticiones y el padre los va sustituyendo por nuevos (que ya tienen cargada la nueva configuración)</li>
</ol>
<p>Cara a mod_status, módulo que sirve para controlar el estado del servidor web, Apache no habrá sido reiniciado, mantendrá todas sus estadísticas y mostrará con una G los threads que están sirviendo previos al reinicio graceful.</p>
<p>&nbsp;</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/informacion-apache-linea-de-comandos/" title="Información sobre apache desde línea de comandos ">Información sobre apache desde línea de comandos </a></li><li><a href="http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/" title="Pasos para activar WebDAV en Apache (mod_dav)">Pasos para activar WebDAV en Apache (mod_dav)</a></li><li><a href="http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/" title="mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)">mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)</a></li><li><a href="http://rm-rf.es/lighttpd-proteger-una-carpeta-o-website-con-contrasena/" title="Lighttpd: proteger una carpeta o website con contraseña">Lighttpd: proteger una carpeta o website con contraseña</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache: cómo hacer debug de mod_rewrite</title>
		<link>http://rm-rf.es/apache-como-hacer-debug-de-mod_rewrite/</link>
		<comments>http://rm-rf.es/apache-como-hacer-debug-de-mod_rewrite/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 12:47:00 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Mod_Rewrite]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1836</guid>
		<description><![CDATA[El módulo de Apache mod_rewrite tiene la opción de activar un modo debug o de registro de errores que puede ser de gran utilidad cuando tenemos algún problema con la creación de urls amigables o cualquier tipo uso que le demos a mod_rewrite. La implantación es simple, únicamente tenemos que especificar en el fichero de [...]]]></description>
			<content:encoded><![CDATA[<p>El <strong>módulo de <a title="Apache" href="http://rm-rf.es/sobre/apache/">Apache</a> mod_rewrite</strong> tiene la opción de activar un modo <strong>debug</strong> o de registro de errores que puede ser de gran utilidad cuando tenemos algún problema con la creación de urls amigables o cualquier tipo uso que le demos a mod_rewrite.</p>
<p>La implantación es simple, únicamente tenemos que especificar en el fichero de configuración de Apache httpd.conf la ruta hacia el log y el nivel de debug que queremos aplicar, que va de 0 (sin debug) a 9 (máximo debug). Se recomienda configurarlo con el valor 3 ya que siendo superior puede provocar alto uso de recursos:</p>
<pre>RewriteLog "/usr/local/apache/logs/rewrite.log"
RewriteLogLevel 3</pre>
<p>Es recomendable también activarlo únicamente para el virtualhost que lo necesitemos (si tenemos varios sitios web en el mismo servidor) o incluso a nivel de directorio con la directiva Directory. Reiniciamos Apache y comenzará a volcarse la información sobre dicho log.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/isapi-rewrite-alternativa-a-mod-rewrite-en-iis/" title="ISAPI Rewrite: Alternativa a Mod Rewrite en IIS">ISAPI Rewrite: Alternativa a Mod Rewrite en IIS</a></li><li><a href="http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/" title="Pasos para activar WebDAV en Apache (mod_dav)">Pasos para activar WebDAV en Apache (mod_dav)</a></li><li><a href="http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/" title="mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)">mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)</a></li><li><a href="http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/" title="Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;">Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/apache-como-hacer-debug-de-mod_rewrite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[error] (28)No space left on device: mod_python: Failed to create global mutex</title>
		<link>http://rm-rf.es/error-28no-space-left-on-device-mod_python-failed-to-create-global-mutex/</link>
		<comments>http://rm-rf.es/error-28no-space-left-on-device-mod_python-failed-to-create-global-mutex/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 06:59:11 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1828</guid>
		<description><![CDATA[Ayer en un servidor Apache con mod_python me encontré con este error: [Thu Jun 02 21:43:19 2011] [error] (28)No space left on device: mod_python: Failed to create global mutex 1 of 4 (/tmp/mpmtx280211). Configuration Failed Lo primero que hice por lógica fue mirar lo siguiente: Mirar que el disco tuviera espacio libre (df -h). Mirar [...]]]></description>
			<content:encoded><![CDATA[<p>Ayer en un servidor Apache con mod_python me encontré con este error:</p>
<p><strong><em>[Thu Jun 02 21:43:19 2011] [error] (28)No space left on device: mod_python: Failed to create global mutex 1 of 4 (/tmp/mpmtx280211).<br />
Configuration Failed<br />
</em></strong></p>
<p>Lo primero que hice por lógica fue mirar lo siguiente:</p>
<ol>
<li>Mirar que el disco tuviera espacio libre (<em>df -h</em>).</li>
<li>Mirar que el disco no estuviera al 100% en inodos (<em>df -i</em>).</li>
<li>Mirar que ningún log de Apache hubiera llegado a los 2.0GB de tamaño.</li>
</ol>
<p>Ninguna de las tres cosas era cierta y seguía teniendo el problema. Hace ya un par de años tuve un problema similar en Apache y estaba relacionado con los semáforos del Kernel:<a title="Apache: Semget: No space left on device" href="http://rm-rf.es/apache-semget-no-space-left-on-device/"> Apache: Semget: No space left on device</a>. Esa vez la solución que ofrecía era vaciar el array de semáforos. En este caso vamos  <a href="http://www.eth0.us/python-mutex" target="_blank">solucionarlo</a> de otro modo, <strong>ampliando los valores de Kernel para los semáforos</strong>. Actualmente tenía los siguientes:</p>
<pre># cat /proc/sys/kernel/sem
250	32000	32	128</pre>
<p>Los ampliamos y reiniciamos Apache:</p>
<pre># echo "kernel.sem = 512 32000 100 512" &gt;&gt; /etc/sysctl.conf
# sysctl -p
# /etc/init.d/httpd restart</pre>
<p>&nbsp;</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/" title="Pasos para activar WebDAV en Apache (mod_dav)">Pasos para activar WebDAV en Apache (mod_dav)</a></li><li><a href="http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/" title="mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)">mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)</a></li><li><a href="http://rm-rf.es/apache-diferencia-entre-reiniciar-con-restart-y-graceful/" title="Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;">Apache: diferencia entre reiniciar con &#8216;restart&#8217; y &#8216;graceful&#8217;</a></li><li><a href="http://rm-rf.es/apache-como-hacer-debug-de-mod_rewrite/" title="Apache: cómo hacer debug de mod_rewrite">Apache: cómo hacer debug de mod_rewrite</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/error-28no-space-left-on-device-mod_python-failed-to-create-global-mutex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cluster HTTP en alta disponibilidad con CentOS + Heartbeat</title>
		<link>http://rm-rf.es/cluster-http-en-alta-disponibilidad-con-centos-heartbeat/</link>
		<comments>http://rm-rf.es/cluster-http-en-alta-disponibilidad-con-centos-heartbeat/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 08:20:12 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[alta disponibilidad]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[HeartBeat]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1731</guid>
		<description><![CDATA[En esta entrada vamos a montar un cluster de alta disponibilidad con dos nodos CentOS, Heartbeat y servidor web Apache. A partir de esta configuración básica el cluster puede aumentar su número de nodos según requerimientos de forma gradual y sencilla. La configuración del cluster es la siguiente: nodo 1: IP: 192.168.1.129 HOSTNAME: cluster01 nodo [...]]]></description>
			<content:encoded><![CDATA[<p>En esta entrada vamos a montar un <strong>cluster de alta disponibilidad con dos nodos CentOS, Heartbeat y servidor web Apache</strong>. A partir de esta configuración básica el cluster puede aumentar su número de nodos según requerimientos de forma gradual y sencilla.</p>
<p>La configuración del cluster es la siguiente:</p>
<p><strong>nodo 1: </strong></p>
<p><span style="color: blue;"><em>IP: 192.168.1.129</em><br />
<em> HOSTNAME: cluster01</em></span></p>
<p><strong>nodo 2:</strong></p>
<p><span style="color: blue;"><em>IP: 192.168.1.130</em><br />
<em> HOSTNAME: cluster02</em></span></p>
<p><strong>IP virtual para el cluster:</strong></p>
<p><span style="color: blue;"><em>IP: 192.168.1.131</em></span></p>
<div align="center"><img class=" size-full wp-image-1734" title="Cluster Apache Heartbeat" src="http://rm-rf.es/wp-content/uploads/2011/04/apache-heartbeat.jpg" alt="Cluster Apache Heartbeat" width="500" height="276" /></div>
<div><em><small>Imagen: <a href="http://hapm.sourceforge.net/index-en.html">hapm.sourceforge.net</a></small></em></div>
<p>Una vez configurado en los dos nodos el hostname e IPs (la IP virtual de momento no la tocamos), pasamos directamente a la <strong>instalación de Heartbeat y Apache</strong>, en ambos nodos deberíamos instalar:</p>
<pre> yum install httpd</pre>
<p>Si preferís compilar apache en lugar de usar paquetes precompilados acudir a este post: <a title="Cómo compilar Apache y PHP en Linux" href="http://rm-rf.es/como-compilar-apache-php-linux/">compilar apache y php</a>.</p>
<p><em>Nota: Tendréis que configurar Apache para que escuche por la IP virtual, no lo arranquéis todavía:</em></p>
<pre>Listen 192.168.1.131:80</pre>
<p>Evitamos que httpd arranque automáticamente, lo hará HeartBeat:</p>
<pre># chkconfig httpd off</pre>
<p>Instalamos Heartbeat mediante yum:</p>
<pre># yum install heartbeat</pre>
<p>Una vez instalado pasamos a la configuración de Heartbeat. Los ficheros básicos son <strong>authkeys, ha.cf y haresources</strong>. La ruta en la que debemos configurarlos es <strong>/etc/ha.d/</strong>. Si necesitamos ejemplos o los ficheros base los podemos encontrar en <strong>/usr/share/doc/heartbeat-2.1.2/</strong>.</p>
<h3>ha.cf</h3>
<p>ha.cf es el fichero en el que se especifica la <strong>configuración global del cluster</strong>. Nuestra configuración base es la siguiente. En el fichero de muestra tenéis información sobre todas las directivas disponibles:</p>
<pre>logfile /var/log/cluster.log
logfacility local0
warntime 5
deadtime 30
initdead 120
keepalive 2
bcast eth0
udpport 694
auto_failback on
node cluster01
node cluster02</pre>
<p>En primera instancia especificamos que el log donde se volcará toda la información será /var/log/cluster.log. Las directivas de detección de fallo de nodos son las siguientes:</p>
<ul>
<li><strong>warntime</strong>: Heartbeat avisará cuando un nodo falle tras 5 segundos.</li>
<li><strong>deadtime</strong>: Hearbeat confirmará que un nodo ha caído, 30 segundos.</li>
<li><strong>initdead</strong>: Tiempo máximo que Heartbeat esperará a que un nodo arranque, 60 segundos.</li>
<li><strong>keepalive</strong>: Especifica cada cuanto tiempo Heartbeat enviará paquetes para comprobar la disponibilidad de los nodos, 2 segundos.</li>
</ul>
<p>A través de &#8220;node&#8221; especificamos cada uno de los nodos que componen el cluster (sus hostname), uddport es el puerto UDP utilizado para la comunicación y bcast la interfaz broadcast.</p>
<h3>authkeys</h3>
<p>Este es el fichero en el que se configura el <strong>sistema de autenticación entre todos los nodos del cluster</strong>. El formato es el siguiente:</p>
<pre>auth num
num algorithm secret</pre>
<p>Los algoritmos disponibles son crc (1) sha1 (2) y md5 (3). Se recomienda utilizar sha1 así que lo utilizamos para nuestro cluster. &#8220;clu$ter-4uth&#8221; será la llave de autenticación (secret):</p>
<pre>auth 2
2 sha1 clu$ter-4uth</pre>
<p>Únicamente root debe poder leer el fichero, así que asignamos los permisos correspondientes:</p>
<pre># chmod 600 /etc/ha.d/authkeys</pre>
<h3>haresources</h3>
<p>En este fichero se especifican los servicios que se moveran entre los distintos nodos del cluster cuando uno de ellos caiga. En este caso únicamente trabajaremos con httpd, en el propio fichero tenéis toda la información. Le especificamos también la IP virtual asignada al servicio:</p>
<pre>cluster01 192.168.1.131 httpd</pre>
<h3>Propagar cambios de configuración entre nodos</h3>
<p>Una vez finalizada la configuración inicial, podemos propagar los cambios entre todos los nodos mediante el comando ha_propagate. Hay que tener conectividad ssh/scp entre las máquinas, <a title="Login SSH sin password de forma rápida y sencilla" href="http://rm-rf.es/login-ssh-sin-password-de-forma-rapida-y-sencilla/">si no utilizáis llaves os pedirá la clave ssh</a> de los nodos:</p>
<pre># /usr/lib/heartbeat/ha_propagate
Propagating HA configuration files to node cluster02.

ha.cf                                                                                                                    100%   11KB  10.7KB/s   00:00
authkeys                                                                                                                 100%  672     0.7KB/s   00:00
Setting HA startup configuration on node cluster02.
..
...</pre>
<h3>Arrancar y probar el cluster</h3>
<p>Una vez finalizada la configuración ya podemos proceder a arrancar el cluster, para ello iniciamos HeartBeat en cada uno de los nodos:</p>
<pre># /etc/init.d/heartbeat start</pre>
<p>El propio HeartBeat reiniciará Apache, no lo hagáis manualmente:</p>
<pre>IPaddr[4618]:    2011/04/19_11:43:02 INFO:  Resource is stopped
ResourceManager[4591]:    2011/04/19_11:43:02 info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.131 start
IPaddr[4694]:    2011/04/19_11:43:02 INFO: Using calculated nic for 192.168.1.131: eth0
IPaddr[4694]:    2011/04/19_11:43:02 INFO: Using calculated netmask for 192.168.1.131: 255.255.255.0
IPaddr[4694]:    2011/04/19_11:43:03 INFO: eval ifconfig eth0:0 192.168.1.131 netmask 255.255.255.0 broadcast 192.168.1.255
IPaddr[4677]:    2011/04/19_11:43:03 INFO:  Success
ResourceManager[4591]:    2011/04/19_11:43:03 info: Running /etc/init.d/httpd  start</pre>
<p>En este caso no estamos montando a través de iSCSI, NFS o similar los datos que sirve Apache, de modo que para verificar contra qué nodo del cluster estamos conectando en cada momento podemos crear un index.html básico en cada uno de los nodos, ruta <em>/var/www/html/index.html</em> en el que indiquemos el nodo en el que nos encontramos.</p>
<p>En este momento, si accedermos a <strong>http://192.168.1.131</strong> ya deberíamos poder acceder vía web al servicio, y nos indicará que <strong>es el cluster01 quien está sirviendo el contenido</strong>.</p>
<p>La primera prueba que vamos a hacer para probar el cluster es tirar el nodo cluster01, para ello tiramos la interfaz de red, en mi caso eth0:</p>
<pre># ifdown eth0</pre>
<p>Una vez pasado el tiempo especificado en la configuración, en nodo cluster02 debería tomar el control de httpd y servir la web <strong>http://192.168.1.131</strong>, en el log veréis algo similar a:</p>
<pre>heartbeat[2354]: 2011/04/19_11:31:24 WARN: node cluster01: is dead
heartbeat[2354]: 2011/04/19_11:31:24 WARN: No STONITH device configured.
heartbeat[2354]: 2011/04/19_11:31:24 WARN: Shared disks are not protected.
heartbeat[2354]: 2011/04/19_11:31:24 info: Resources being acquired from cluster01.
heartbeat[2354]: 2011/04/19_11:31:24 info: Link cluster01:eth0 dead.
harc[2417]:	2011/04/19_11:31:25 info: Running /etc/ha.d/rc.d/status status
heartbeat[2418]: 2011/04/19_11:31:25 info: No local resources [/usr/share/heartbeat/ResourceManager listkeys cluster02] to acquire.
mach_down[2447]:	2011/04/19_11:31:26 info: Taking over resource group 192.168.1.131
ResourceManager[2473]:	2011/04/19_11:31:27 info: Acquiring resource group: cluster01 192.168.1.131 httpd
IPaddr[2500]:	2011/04/19_11:31:28 INFO:  Resource is stopped
ResourceManager[2473]:	2011/04/19_11:31:28 info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.131 start
IPaddr[2576]:	2011/04/19_11:31:30 INFO: Using calculated nic for 192.168.1.131: eth0
IPaddr[2576]:	2011/04/19_11:31:30 INFO: Using calculated netmask for 192.168.1.131: 255.255.255.0
IPaddr[2576]:	2011/04/19_11:31:31 INFO: eval ifconfig eth0:0 192.168.1.131 netmask 255.255.255.0 broadcast 192.168.1.255
IPaddr[2559]:	2011/04/19_11:31:32 INFO:  Success
ResourceManager[2473]:	2011/04/19_11:31:32 info: Running /etc/init.d/httpd  start
mach_down[2447]:	2011/04/19_11:31:33 info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired
mach_down[2447]:	2011/04/19_11:31:33 info: mach_down takeover complete for node cluster01.
heartbeat[2354]: 2011/04/19_11:31:33 info: mach_down takeover complete.</pre>
<p>Y efectivamente, al entrar por navegador a http://192.168.1.131/ accedemos al cluster02.</p>
<p>Esta es la configuración más básica de un cluster HTTP con HeartBeat, a partir de aquí es cuestión de ir haciendo pruebas de failover y failback tirando nodos, levantandolos, y en definitiva, trastear con la configuración, etc ya que HeartBeat permite una gran cantidad de configuraciones.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/red-hat-cluster-generic-error-al-crear-un-ip-resource/" title="Red Hat Cluster: &#8220;generic error&#8221; al crear un IP Resource">Red Hat Cluster: &#8220;generic error&#8221; al crear un IP Resource</a></li><li><a href="http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/" title="Pasos para activar WebDAV en Apache (mod_dav)">Pasos para activar WebDAV en Apache (mod_dav)</a></li><li><a href="http://rm-rf.es/crear-un-cluster-mysql-con-un-unico-comando/" title="Crear un cluster MySQL con un único comando">Crear un cluster MySQL con un único comando</a></li><li><a href="http://rm-rf.es/mod_fcgid-http-request-length-132147so-far-exceeds-maxrequestlen-131072/" title="mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)">mod_fcgid: HTTP request length 132147(so far) exceeds MaxRequestLen (131072)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/cluster-http-en-alta-disponibilidad-con-centos-heartbeat/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Instalar mod_security para Apache en Linux 64 bits</title>
		<link>http://rm-rf.es/instalar-mod_security-para-apache-en-linux-64-bits/</link>
		<comments>http://rm-rf.es/instalar-mod_security-para-apache-en-linux-64-bits/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 14:03:41 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[mod security]]></category>
		<category><![CDATA[Mod_Security]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1717</guid>
		<description><![CDATA[A la hora de instalar mod_security en sistemas de 64 bits podemos encontrarnos con problemas al intentar hacerlo a través de apxs. Por ello, tenemos que recurrir a la instalación mediante compilación. En este caso bajo un centos 5 x86_64. Lo primero que hacemos es descargar las fuentes: $ wget http://www.modsecurity.org/download/modsecurity-apache_2.5.13.tar.gz Descomprimimos y nos ubicamos [...]]]></description>
			<content:encoded><![CDATA[<p>A la hora de <a title="Instalación y configuración de Mod_Security" href="http://rm-rf.es/instalacion-y-configuracion-de-mod_security/">instalar mod_security</a> en sistemas de 64 bits podemos encontrarnos con problemas al intentar hacerlo a través de <a title="apxs no se encuentra disponible para Apache" href="http://rm-rf.es/apxs-no-se-encuentra-disponible-para-apache/">apxs</a>. Por ello, tenemos que recurrir a la instalación mediante compilación. En este caso bajo un<strong> centos 5 x86_64</strong>.<br />
Lo primero que hacemos es descargar las fuentes:</p>
<pre>$ wget http://www.modsecurity.org/download/modsecurity-apache_2.5.13.tar.gz</pre>
<p>Descomprimimos y nos ubicamos en la carpeta apache2 (para versiones 2 de Apache):</p>
<pre>$ tar -xzvf modsecurity-apache_2.5.13.tar.gz
$cd modsecurity-apache_2.5.13/apache2</pre>
<p>Llega el momento de compilar, en este caso la configuración me ha obligado a especificar la ruta tanto de apxs como de apr-config y apu-config:</p>
<pre># ./configure --with-apxs=/usr/local/apache/bin/apxs \
 --with-apr=/usr/local/apache/bin/apr-1-config \
 --with-apu=/usr/local/apache/bin/apu-1-config</pre>
<p>Si no recibimos ningún error compilamos:</p>
<pre># make</pre>
<p>E instalamos:</p>
<pre># make install</pre>
<p>Llega el momento de añadir a httpd.conf la carga de los módulos necesarios y la llamada al fichero de configuración:</p>
<pre>LoadFile /usr/lib/libxml2.so
LoadModule security2_module modules/mod_security2.so</pre>
<p>Y la llamada al fichero de configuración que podéis llamar como queráis:</p>
<pre>Include conf/modsec2.conf</pre>
<p>Ya quedará únicamente crear o copiar el fichero modsec2.conf y copiar las reglas que queramos a la ruta deseada.</p>
<p>&nbsp;</p>
<p>modsec2.conf:</p>
<pre>&lt;IfModule mod_security2.c&gt;
SecRuleEngine On
SecFilterCheckURLEncoding On
SecFilterForceByteRange 0 255
SecAuditEngine RelevantOnly
SecAuditLog logs/modsec_audit.log
SecDebugLog logs/modsec_debug_log
SecDebugLogLevel 0
SecDefaultAction "phase:2,deny,log,status:403"
#Redireccion a html de seguridad
ErrorDocument 403 http://rm-rf.es/fallo_seguyridad.html
SecRule REMOTE_ADDR "^127.0.0.1$" nolog,allow
#Includes de configuracion
Include "/usr/local/apache/conf/modsecurity_rules/*.conf"
&lt;/IfModule&gt;</pre>
<p>Finalmente comprobamos que la sintaxis de los ficheros de configuración es correcta y ya podemos arrancar Apache y hacer pruebas con mod_security:</p>
<pre># /etc/init.d/httpd configtest
Syntax OK</pre>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/instalacion-y-configuracion-de-mod_security/" title="Instalación y configuración de Mod_Security">Instalación y configuración de Mod_Security</a></li><li><a href="http://rm-rf.es/pasos-para-activar-webdav-en-apache-mod_dav/" title="Pasos para activar WebDAV en Apache (mod_dav)">Pasos para activar WebDAV en Apache (mod_dav)</a></li><li><a href="http://rm-rf.es/bondingteamingtrunking-en-rhel-y-centos/" title="Bonding/Teaming/Trunking en RHEL y CentOS">Bonding/Teaming/Trunking en RHEL y CentOS</a></li><li><a href="http://rm-rf.es/selinux-semanage-command-not-found/" title="SELinux &#8216;semanage: command not found&#8217;">SELinux &#8216;semanage: command not found&#8217;</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/instalar-mod_security-para-apache-en-linux-64-bits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo compilar Apache y PHP en Linux</title>
		<link>http://rm-rf.es/como-compilar-apache-php-linux/</link>
		<comments>http://rm-rf.es/como-compilar-apache-php-linux/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 16:53:45 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[compilador]]></category>
		<category><![CDATA[howto]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1641</guid>
		<description><![CDATA[En este artículo voy a explicar los pasos básicos para compilar Apache y PHP (con soporte para MySQL y otros módulos) en GNU/Linux, concretamente bajo RHEL, aunque se puede aplicar a cualquier distribución (CentOS, Fedora, Debian, etc). Lo primero que tenemos que comprobar es que tengamos instalados los compiladores necesarios (C / C++&#8230;) para poder [...]]]></description>
			<content:encoded><![CDATA[<p>En este artículo voy a explicar los <strong>pasos básicos para compilar Apache y PHP (con soporte para MySQL y otros módulos) en GNU/Linux</strong>, concretamente bajo RHEL, aunque se puede aplicar a cualquier distribución (CentOS, Fedora, Debian, etc).</p>
<p>Lo primero que tenemos que comprobar es que tengamos <a title="Red-Hat y Centos: Instalación de compiladores C / C++" href="http://rm-rf.es/red-hat-centos-instalacion-compiladores-c/">instalados los compiladores necesarios</a> (C / C++&#8230;) para poder empezar a trabajar, en RHEL y CentOS podemos instalarlos por yum, y en Debian y similar por apt:</p>
<pre># yum install gcc gcc-c++ autoconf make automake</pre>
<h2>Compilar Apache</h2>
<p>Para compilar Apache lo primero que debemos hacer es bajarnos las fuentes de la versión que queramos instalar. En este caso vamos a <a href="http://httpd.apache.org/download.cgi#apache22" target="_blank">bajar la última versión estable</a> de la rama 2.2, la 2.2.17:</p>
<pre># wget http://apache.rediris.es//httpd/httpd-2.2.17.tar.gz</pre>
<p>Descomprimimos (podéis hacerlo en el directorio /usr/src/ destinado a las fuentes o en donde más rabia os dé):</p>
<pre>#  tar -xzvf httpd-2.2.17.tar.gz</pre>
<p>Nos ubicamos en la ruta donde hayamos descomprimido las fuentes:</p>
<pre># cd /usr/src/httpd-2.2.17</pre>
<p>Ya estamos listos para comenzar a configurar nuestra instalación. El primer paso de toda compilación es el script <strong>configure</strong>, básicamente es el <strong>momento en el que podemos personalizar como queramos nuestra instalación</strong> (lugar donde instalar apache, módulos a compilar, cómo cargar esos módulos, etc) también se realizan ciertos chequeos para verificar que la compilación se puede realizar correctamente.</p>
<p>Para ver todas las posibilidades que nos ofrece la configuración, siempre tendremos que ejecutar la ayuda, resultaría tedioso explicar aquí todas las opciones de compilación así que nos vamos a centrar en una instalación básica, para personalizar vuestras instalaciones:</p>
<pre># ./configure --help</pre>
<p>Bien, en nuestro caso la línea de configure va a ser la siguiente:</p>
<pre># ./configure --prefix=/usr/local/apache --enable-headers --enable-rewrite --enable-expires --enable-so --disable-authz-default</pre>
<ul>
<li><strong>&#8211;prefix=&lt;ruta&gt;</strong> será la ruta en la que vamos a instalar Apache, en este caso /usr/local/apache.</li>
<li><strong>&#8211;enable-MODULO</strong>: para la activación de módulos utilizamos este parámetro. En la línea de configuración vemos que hemos activado <em>mod_rewrite, mod_headers y mod_expires</em>. Si no especificamos nada, los módulos se cargan de forma estática, para cargarlos de forma dinámica (DSO, explicado en el siguiente punto) utilizamos <strong>&#8211;enable-MODULO=shared</strong>.</li>
<li><strong>&#8211;enable-so</strong> Permitimos a Apache cargar módulos compartidos (Dynamic Shared Object (DSO)), php será uno de ellos. Esta opción también nos permitirá añadir nuevos módulos sin necesidad de recompilar y de forma dinámica (añadiendo simplemente el módulo mediante &#8220;Load Module&#8221; en la configuración). Los modulos que añadamos a través de esta línea de compilación, y sin especificar <em>shared</em> se instalarán de forma estática.</li>
<li><strong>&#8211;disable-MODULO</strong>: He puesto un ejemplo de deshabilitar un módulo en la línea de compilación para que veáis que se pueden deshabilitar módulos (por defecto Apache carga algunos módulos que quizás no te interesen), en el ejemplo desactivamos authz-default</li>
</ul>
<p>Una vez que tengamos claro que queremos y que no queremos instalar, podemos <em>construir</em> nuestra compilación, para ello simplemente ejecutamos make (según la cantidad de módulos que hayas configurado le puede costar un rato, puedes ir a tomar un café mientras ;) ):</p>
<pre># make</pre>
<p>Y una vez que haya terminado, finalizamos la compilación e instalamos apache:</p>
<pre># make install</pre>
<p>Cuando haya terminado ya podemos probar nuestra instalación de apache, lo arrancamos:</p>
<pre># /usr/local/apache/bin/apachectl start</pre>
<p>Si accedemos vía web, por ejemplo desde la IP del servidor o el host que tenga configurado, deberíamos visualizar lo siguiente:</p>
<p><strong><em>It works!</em></strong></p>
<h3>Cómo actualizar Apache</h3>
<p>La actualización por compilación de fuentes es bastante sencilla. Simplemente tendríamos que seguir este mismo proceso, pero en el punto del configure apache nos lo pone más fácil. <strong>En la ruta /usr/local/apache/build encontraréis un fichero llamado config.nice que guarda vuestros parámetros de compilación</strong>, con lo que podéis usar dicho fichero en lugar de crear un nuevo configure. El proceso sería entonces, bajar las fuentes de la nueva versión y:</p>
<pre># ./config.nice
# make
# make install
</pre>
<p><em><strong>Nota</strong>: Los ficheros de configuración, logs y documentos no se sobreescribirán durante la actualización.</em></p>
<h2>Compilar PHP</h2>
<p>Ahora que ya tenemos Apache funcionando, es hora de instalar PHP. Vamos a seguir el mismo procedimiento que para compilar Apache. En este caso vamos a instalar PHP con soporte para MySQL y algún otro módulo que veremos más adelante.</p>
<p>Empezamos descargando las fuentes desde el <a href="http://php.net/" target="_blank">sitio web de PHP</a>. En este caso la última versión estable de la rama 5.3, la 5.3.6. De nuevo nos colocamos en el directorio src o donde queráis trabajar mientras instalamos:</p>
<pre># cd /usr/sr
# wget http://es2.php.net/get/php-5.3.6.tar.gz/from/es.php.net/mirror</pre>
<p>Descomprimimos y nos colocamos dentro del directorio:</p>
<pre># tar -xzvf php-5.3.6.tar.gz
# cd php-5.3.6</pre>
<p>Ahora, al igual que con Apache llega el momento de crear la línea de configuración, el configure. Del mismo modo podemos seleccionar la ruta de instalación, los módulos y una buena cantidad de parámetros para personalizar nuestra instalación. Es imprescindible pues revisar la ayuda:</p>
<pre># ./configure --help</pre>
<p>Una vez que tenemos claro que y como queremos instalar, comenzamos con el configure:</p>
<pre># ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql --enable-ftp --disable-pdo --disable-ctype</pre>
<p>Pasamos a explicar esta línea de configure:</p>
<ul>
<li><strong>&#8211;prefix</strong>: al igual que con Apache especificamos la ruta en la que instalaremos php.</li>
<li><strong>&#8211;with-config-file-path</strong>: especificamos la ruta donde se encontrará el fichero de configuración php.ini.</li>
<li><strong>&#8211;with-apxs2</strong>: como vamos a compilar php como módulo dinámico (DSO) updatede apache especificamos la ruta a apxs.</li>
<li><strong>&#8211;with-libxml2</strong>: para evitar el error provocado porque la compilación no encuentra xml2-config necesitaremos tener instalado libxml2-devel (yum install libxml2-devel. El error es <em>configure: error: xml2-config not found. Please check your libxml2 installation</em>.</li>
<li><strong>&#8211;with-mysql</strong>: habilitamos soporte para MySQL. Por supuesto, antes de habilitar cualquier extensión, si depende de algún programa hay que instalarlo antes, en este caso el cliente MySQL y las headers (paquete devel):
<pre>yum install mysql mysql-devel</pre>
</li>
<li><strong>&#8211;enable-ftp</strong>: habilitamos soporte para FTP. Podemos habilitar cualquier otro módulo con <strong>&#8211;enable-MODULO</strong></li>
<li><strong>&#8211;disable-pdo</strong>: deshabilitamos el soporte para PDO. Podemos deshabilitar cualquier otro módulo con <strong>&#8211;disable-MODULO</strong></li>
</ul>
<p>Una vez seleccionados los módulos a instalar y las opciones correspondientes podemos comenzar a compilar (puede tardar un rato):</p>
<pre># make</pre>
<p>Si todo ha ido bien y no hemos recibido errores podemos finalizar la instalación:</p>
<pre># make install</pre>
<p>Una vez instalado automáticamente habrá añadido la carga del módulo en nuestra configuración de apache (fichero httpd.conf):</p>
<pre>LoadModule php5_module modules/libphp5.so</pre>
<p>Ahora solo nos queda indicar a Apache como tiene que interpretar los ficheros php, tenemos que añadir la siguiente línea dentro del fichero httpd.conf. Podemos añadirla junto a los demás AddType, buscadlos y colocadla debajo:</p>
<pre>AddType application/x-httpd-php .php</pre>
<p>Ahora solo queda reiniciar apache y verificar el funcionamiento de php. Antes comprobamos que la sintaxis del fichero de configuración httpd.conf es correcta:</p>
<pre># /usr/local/apache/bin/apachectl configtest
Syntax OK</pre>
<p>Reiniciamos apache:</p>
<pre># /usr/local/apache/bin/apachectl restart</pre>
<p>Podemos crear un fichero de pruebas en php para verificar todos los parámetros y módulos de la instalación de php, el contenido es el siguiente:</p>
<pre>&lt;? phpinfo(); ?&gt;</pre>
<p>Lo colocamos en el DocumentRoot por defecto, en nuestro caso es /usr/local/apache/htdocs y lo ejecutamos desde el navegador, el resultado es el siguiente, ya tenemos Apache y php operativo:</p>
<div align="center"><img src="http://rm-rf.es/wp-content/uploads/2011/03/php.jpeg" alt="php 5.3.6" title="php 5.3.6" width="450" height="525" class="size-full wp-image-1651" /></div>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/pecl-configure-error-cannot-run-c-compiled-programs/" title="pecl: configure: error: cannot run C compiled programs">pecl: configure: error: cannot run C compiled programs</a></li><li><a href="http://rm-rf.es/configure-error-libpng-aso-not-found-compilando-php-con-64-bits/" title="configure: error: libpng.(a|so) not found (compilando PHP con 64 bits)">configure: error: libpng.(a|so) not found (compilando PHP con 64 bits)</a></li><li><a href="http://rm-rf.es/activar-pcntl-para-php-en-cpanel-easyapache/" title="Activar pcntl para PHP en cPanel (easyapache)">Activar pcntl para PHP en cPanel (easyapache)</a></li><li><a href="http://rm-rf.es/suphp-premature-end-of-script-headers-en-el-error_log/" title="suPHP: &#8220;Premature end of script headers&#8221; en el error_log">suPHP: &#8220;Premature end of script headers&#8221; en el error_log</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/como-compilar-apache-php-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurar Apache como Reverse Proxy (Proxy Inverso)</title>
		<link>http://rm-rf.es/configurar-apache-como-reverse-proxy-proxy-inverso/</link>
		<comments>http://rm-rf.es/configurar-apache-como-reverse-proxy-proxy-inverso/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 09:39:50 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[apxs]]></category>
		<category><![CDATA[httpd]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://rm-rf.es/?p=1538</guid>
		<description><![CDATA[Reverse Proxy / Proxy inverso Un reverse proxy es un servidor proxy instalado en el domicilio de uno o más servidores web. Todo el tráfico entrante de Internet y con el destino de uno de esos servidores web pasa a través del servidor proxy. Hay varias razones para instalar un &#8220;reverse proxy&#8221;: Seguridad: el servidor proxy [...]]]></description>
			<content:encoded><![CDATA[<div align="center"><img class="aligncenter size-full wp-image-1540" title="reverse proxy" src="http://rm-rf.es/wp-content/uploads/2010/12/reverse_proxy.jpg" alt="reverse proxy" width="320" height="414" /></div>
<blockquote>
<h2>Reverse Proxy / Proxy inverso</h2>
<p>Un <em>reverse proxy</em> es un servidor proxy instalado en el domicilio de uno o más servidores web. Todo el tráfico entrante de Internet y con el destino de uno de esos servidores web pasa a través del servidor proxy. Hay varias razones para instalar un &#8220;reverse proxy&#8221;:</p>
<ul>
<li>Seguridad: el servidor proxy es una capa adicional de defensa y por lo tanto protege los servidores web.</li>
<li>Cifrado / Aceleración SSL: cuando se crea un sitio web seguro, habitualmente el cifrado SSL no lo hace el mismo servidor web, sino que es realizado por el &#8220;reverse proxy&#8221;, el cual está equipado con un hardware de aceleración <a title="Transport Layer Security" href="http://es.wikipedia.org/wiki/Transport_Layer_Security">SSL</a> (Security Sockets Layer).</li>
<li>Distribución de Carga: el &#8220;reverse proxy&#8221; puede distribuir la carga entre varios servidores web. En ese caso, el &#8220;reverse proxy&#8221; puede necesitar reescribir las URL de cada página web (traducción de la URL externa a la URL interna correspondiente, según en qué servidor se encuentre la información solicitada).</li>
<li>Caché de contenido estático: Un &#8220;reverse proxy&#8221; puede descargar los servidores web almacenando contenido estático como imágenes u otro contenido gráfico.</li>
</ul>
<p style="text-align: right;"><a href="http://es.wikipedia.org/wiki/Proxy" target="_blank">Definición Wikipedia</a></p>
</blockquote>
<h2>Configurando Apache como Reverse Proxy</h2>
<p>Para poder utilizar el propio <strong>servidor web Apache como Proxy inverso</strong>, debemos tener compilados una serie de módulos. Los módulos básicos necesarios son los siguientes: <strong>mod_proxy, mod_proxy_http, mod_proxy_ftp, mod_proxy_connect, mod_proxy_html, mod_xml2enc y mod_headers</strong>.</p>
<p>Lo primero que deberíamos hacer es revisar cuales de estos módulos ya están compilados en nuestro servidor web apache, para ello al pasamos al binario httpd el parámetro</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-l</div></div>
<p>:</p>
<pre># httpd -l

  mod_headers.c
  mod_proxy.c
  proxy_connect.c
  proxy_ftp.c
  proxy_http.c
</pre>
<p>En este caso vemos que varios de ellos ya están compilados, hay que decir que mod_proxy integra el resto que véis ( proxy_connect, proxy_ftp y proxy_http). <strong>En caso de no tener mod_proxy compilado</strong>, deberíais <strong>hacerlo a través de la línea de compilación</strong>, y en caso de haber instalado apache por gestor de paquetes (yum, apt, etc) deberíais instalar el módulo correspondiente.</p>
<p>Partiendo entonces de la base que tenemos mod_proxy compilado, ahora deberíamos preparar los módulos <strong>mod_proxy_html y mod_xml2enc</strong>, que permiten reescribes las URLs en formato HTML (tipo mod_rewrite) hacia la ruta del proxy y dar soporte internacional (i18n) respectivamente.</p>
<p>Ámbos módulos se pueden descargar desde <a target="_blank" href="http://apache.webthing.com/mod_proxy_html/">http://apache.webthing.com/mod_proxy_html/</a>, una vez descargados podemos añadirlos a apache de forma sencilla mediante <a title="apxs" href="http://rm-rf.es/sobre/apxs/" target="_blank">apxs</a> de forma dinámica (DSO). Nos ubicamos en la carpeta en la que se encuentren los ficheros mod_proxy_html.c y mod_xml2enc.c y ejecutamos el siguiente comando (puede variar según ruta de apxs):</p>
<pre># /usr/local/apache/bin/apxs -I . -cia mod_proxy_html.c  mod_xml2enc.c</pre>
<p>Es posible que encontréis un problema relacionado con libxml, es debido a que para compilar el módulo se necesitan dichas librerías. Podéis hacer un include a dichas librerías con el parámetro -L o directamente hacer un enlace simbólico de forma temporal:</p>
<pre># /usr/local/apache/bin/apxs -L /usr/include/libxml2/libxml/ -I . -cia mod_proxy_html.c  mod_xml2enc.c</pre>
<p>O el enlace simbólico:</p>
<pre># ln -s /usr/include/libxml2/libxml/ .</pre>
<p>Tras realizar este paso de forma satisfactoria, en nuestro fichero de configuración de Apache httpd.conf deberían aparecer como cargados ámbos módulos:</p>
<pre>LoadModule proxy_html_module  modules/mod_proxy_html.so
LoadModule xml2enc_module     modules/mod_xml2enc.so</pre>
<p>Ahora añadimos también la carga del módulo xml:</p>
<pre>LoadFile  /usr/lib/libxml2.so
LoadModule proxy_html_module  modules/mod_proxy_html.so
LoadModule xml2enc_module     modules/mod_xml2enc.so</pre>
<p>Este paso finalizaría la parte de compilación/instalación. Para la configuración es recomendable revisar todas las directivas posibles en la <a href="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html" target="_blank">documentación oficial de apache</a>. Nosotros vamos a configurar un ejemplo sencillo. Vamos a hacer que <strong>al acceder a http://rm-rf.es/google se acceda a google.es mediante proxy inverso</strong>.</p>
<p>Vamos a desactivar lo primero el Forward Proxy porque no lo utilizamos, podemos añadir la siguiente directiva seguido de los LoadModule anteriores:</p>
<pre>ProxyRequests Off</pre>
<p>El virtualhost con el proxy inverso configurado quedaría de esta forma:</p>
<pre>&lt;VirtualHost *:80&gt;
ServerName rm-rf.es
DocumentRoot /xxx/xxx/xxx
ServerAdmin <a href="mailto:xxxr@xxx.xx">x</a>xx@xxxx
UseCanonicalName Off
CustomLog /xxxxx
ScriptAlias /xxxxx

&lt;Location /google&gt;
        SetOutputFilter proxy-html
        ProxyPass         <a href="http://google.es">http://</a>google.es/
        ProxyHTMLURLMap         <a href="http://google.es">http://google.es</a> /google
        ProxyPassReverse         <a href="http://google.es">http:</a>//google.es
        RequestHeader unset Accept-Encoding
&lt;/Location&gt;

&lt;/VirtualHost&gt;</pre>
<p>Como veis, hemos añadido una nueva ubicación &#8220;Location&#8221; dentro del Virtualhost para especificar que ese es el punto desde el que se servirán las peticiones desde el proxy. Posteriormente <strong>mapeamos mediante ProxyPass la URL local contra la URL remota</strong>. La directiva ProxyPassReverse permite a apache ajustar la URL en las cabeceras HTTP Location, Content-Location y URI, mientras que ProxyHTMLURLMap es la directiva utilizada para hacer el rewrite de los enlaces HTML.</p>
<p>Finalmente hacemos un graceful o un syntax check (-t) a apache para recargar las configuraciones y verificar si el funcionamiento es correcto. Esta es una configuración básica de como utilizar mod_proxy para servir contenido, vuelvo a recomendar la revisión de la documentación para sacar el máximo partido a este servicio. Quizás en otro artículo explique como configurar este proxy reverso para servir contenido mediante SSL y otras curiosidades más.</p>
<h4  class="related_post_title">También te puede interesar:</h4><ul class="related_post"><li><a href="http://rm-rf.es/apxs-no-se-encuentra-disponible-para-apache/" title="apxs no se encuentra disponible para Apache">apxs no se encuentra disponible para Apache</a></li><li><a href="http://rm-rf.es/informacion-apache-linea-de-comandos/" title="Información sobre apache desde línea de comandos ">Información sobre apache desde línea de comandos </a></li><li><a href="http://rm-rf.es/apache-activar-httpd-fullstatus/" title="Apache: Activar httpd fullstatus">Apache: Activar httpd fullstatus</a></li><li><a href="http://rm-rf.es/apache-rotar-logs-segun-fecha-o-tamano/" title="Apache: rotar logs según fecha o tamaño">Apache: rotar logs según fecha o tamaño</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://rm-rf.es/configurar-apache-como-reverse-proxy-proxy-inverso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

