<?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>Rubén Ortiz &#187; Apache 2.X</title>
	<atom:link href="http://www.rubenortiz.es/category/software/apache-2x/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rubenortiz.es</link>
	<description>Blog personal de Rubén Ortiz</description>
	<lastBuildDate>Fri, 30 Jul 2010 09:31:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Apache &#8211; Mod Cache</title>
		<link>http://www.rubenortiz.es/2009/10/02/apache-mod-cache/</link>
		<comments>http://www.rubenortiz.es/2009/10/02/apache-mod-cache/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 09:43:44 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=2508</guid>
		<description><![CDATA[Un mod de Apache del que todavía no había hablado es mod_cache. Mod_cache se utiliza sobretodo cuando se montan Apaches que sirven de proxy entre el servidor original y el cliente. Pero no tiene sólo esta utilidad. Mod_deflate, es un mod de Apache que comprime los contenidos a costa de tiempo de la CPU. Pues [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-2044 aligncenter" title="apache" src="http://www.rubenortiz.es/wp-content/uploads/2009/06/apache.jpg" alt="apache" width="205" height="205" /></p>
<p>Un mod de Apache del que todavía no había hablado es mod_cache. Mod_cache se utiliza sobretodo cuando se montan Apaches que sirven de proxy entre el servidor original y el cliente. Pero no tiene sólo esta utilidad.<br />
<span id="more-2508"></span><br />
Mod_deflate, es un mod de Apache que comprime los contenidos a costa de tiempo de la CPU. Pues bien, si habilitamos mod_deflate, Apache ha de estar comprimiendo continuamente los contenidos que se le requieren. Si usamos también mod_cache y alguno de sus submódulos (mod_disk_cache, mod_file_cache o mod_mem_cache) evitamos que ciertas cosas se recompriman porque Apache las sirve de la cache que ha generado.</p>
<p>Para habilitarlo, hemos de activar los módulos:</p>
<p><code><br />
LoadModule cache_module modules/mod_cache.so<br />
LoadModule disk_cache_module modules/mod_disk_cache.so<br />
</code></p>
<p>El archivo de configuración sería así:</p>
<p><code></p>
<p>CacheRoot /var/cache/httpd/mod_disk_cache<br />
CacheEnable disk /<br />
CacheDirLevels 5<br />
CacheDirLength 3</p>
<p></code></p>
<p><strong>CacheRoot </strong>es el path a la carpeta donde se guarda la cache<br />
<strong>CacheEnable</strong> disk / habilita el cacheo para todos los archivos<br />
<strong>CacheDirLevels y CacheDirLength</strong> ordenan a Apache a crear N niveles de N profunidad en el path</p>
<p>Y por último, reiniciar Apache.</p>
<p>Luego, hemos de pensar que Apache y su mod_disk_cache, ocuparán espacio en disco. Podemos eliminarlo periódicamente con <strong>htcacheclean</strong>.</p>
<p><code> <strong># /usr/sbin/htcacheclean -v -t -p/var/cache/httpd/mod_disk_cache -l64M</strong><br />
Statistics:<br />
size limit 64.0M<br />
total size was 9.4M, total size now 9.4M<br />
total entries was 696, total entries now 696<br />
</code></p>
<p><strong>Links</strong></p>
<ul>
<li><a href=" http://www.vicente-navarro.com/blog/2007/12/02/usando-el-mod_cache-de-apache-para-que-el-mod_deflate-no-incremente-la-carga-del-servidor/"> http://www.vicente-navarro.com</a></li>
<li><a href="http://httpd.apache.org/docs/2.2/mod/mod_cache.html">http://httpd.apache.org/docs/2.2/mod/mod_cache.html</a></li>
<li><a href="http://www.howtoforge.com/caching-with-apache-mod_cache-on-debian-etch">http://www.howtoforge.com</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2009/10/02/apache-mod-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Invalid command &#8216;SetEnv&#8217;</title>
		<link>http://www.rubenortiz.es/2009/07/09/invalid-command-setenv/</link>
		<comments>http://www.rubenortiz.es/2009/07/09/invalid-command-setenv/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 09:56:22 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=2085</guid>
		<description><![CDATA[El error era perhaps misspelled or defined by a module not included in the server configuration Y si, ese era el problema. El módulo env_module no estaba cargado desde la configuración. LoadModule env_module modules/mod_env.so Reiniciamos y a otra cosa.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-2044 aligncenter" title="apache" src="http://www.rubenortiz.es/wp-content/uploads/2009/06/apache.jpg" alt="apache" width="205" height="205" /></p>
<p>El error era</p>
<p><code>perhaps misspelled or defined by a module not included in the server configuration</code></p>
<p>Y si, ese era el problema. El módulo <strong>env_module</strong> no estaba cargado desde la configuración.<br />
<code><br />
LoadModule env_module modules/mod_env.so</code></p>
<p>Reiniciamos y a otra cosa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2009/07/09/invalid-command-setenv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proteger carpetas con .htaccess y .htpasswd</title>
		<link>http://www.rubenortiz.es/2009/06/22/proteger-carpetas-con-htaccess-y-htpasswd/</link>
		<comments>http://www.rubenortiz.es/2009/06/22/proteger-carpetas-con-htaccess-y-htpasswd/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 14:16:33 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=2036</guid>
		<description><![CDATA[Una forma básica de ofrecer seguridad sobre directorios web en Linux es utilizando las posibilidades que nos ofrece la apache. .htaccess Hemos de crear primero, un archivo llamado &#8220;.htaccess&#8221; y editarlo con las siguientes directivas: AuthUserFile: path absoluto hasta el fichero .htpasswd AuthName: contendrá el nombre del prompt o ventana que el usuario leerá al [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-2044 aligncenter" title="apache" src="http://www.rubenortiz.es/wp-content/uploads/2009/06/apache.jpg" alt="apache" width="205" height="205" /></p>
<p>Una forma básica de ofrecer seguridad sobre directorios web en Linux es utilizando las posibilidades que nos ofrece la <a href="http://www.rubenortiz.es/category/software/apache-2x/">apache</a>.<br />
<span id="more-2036"></span><br />
<strong>.htaccess</strong></p>
<p>Hemos de crear primero, un archivo llamado &#8220;.htaccess&#8221; y editarlo con las siguientes directivas:</p>
<p><strong>AuthUserFile:</strong> path absoluto hasta el fichero .htpasswd<br />
<strong>AuthName:</strong> contendrá el nombre del prompt o ventana que el usuario leerá al acceder al <strong>directorio protegido<br />
AuthType:</strong> el tipo de autenticación<br />
<strong>require user:</strong> los usuarios que podrán acceder al directorio protegido</p>
<p>Un ejemplo de .htaccess sería<br />
<code><br />
AuthUserFile /path/absoluto/a/.htpasswd<br />
AuthName Acceso Restringido<br />
AuthType Basic<br />
require user prueba</code></p>
<p>Recordad que este archivo se ha de guardar en la carpeta donde queremos implementar la seguridad. Incluso podríamos llegar a bloquear el acceso a archivos, añadiendo debajo de esas líneas lo siguiente:</p>
<p><code><br />
&lt;\Files "index.html"&gt;<br />
Require valid-user<br />
&lt;\/Files&gt;</code></p>
<p><strong>.htpasswd</strong></p>
<p>Este otro fichero, contiene el nombre del usuario y a continuación su password pero, encriptado. Para genera el archivo necesitamos, o bien acceso a nuestro apache para crear el password desde consola o bien, existen muchas webs que nos crean el texto del archivo .htpasswd, al entrar el nombre y el password que queremos.</p>
<p>Si tenemos acceso a la consola lo generamos nosotros mismos:</p>
<p><code><strong>-bash-3.2# htpasswd -nb pepito pepote</strong><br />
pepito:29.fNajst6GCU</code></p>
<p>para añadirlo al .htpasswd directamente, lo podemos redireccionar con el cat</p>
<p><code><strong>-bash-3.2# htpasswd -nb pepito pepote &gt;&gt; .htpasswd</strong></code></p>
<p>Sino, podemos buscar sitios en <a href="http://www.e2.u-net.com/htaccess/make.htm">internet </a>y luego editamos el fichero.</p>
<p>Si apache no te pide la autorización al acceder a la ventana, asegúrate de que lo tienes bien configurado.</p>
<p><strong>Links</strong><br />
<a href="http://www.apacheweek.com/features/userauth">http://www.apacheweek.com/features/userauth</a><br />
<a href="http://www.cristalab.com/tutoriales/proteger-carpetas-con-.htaccess-y-.htpasswd-c213l/">http://www.cristalab.com/tutoriales/proteger-carpetas-con-.htaccess-y-.htpasswd-c213l/</a><br />
<a href="http://www.elated.com/articles/password-protecting-your-pages-with-htaccess/">http://www.elated.com/articles/password-protecting-your-pages-with-htaccess/</a><br />
<a href="http://chernando.eu/doc/apache/">http://chernando.eu/doc/apache/</a><br />
<a href="http://www.colordeu.es/BLOG/proteger-carpetas-web-con-htaccess-y-htpasswd">http://www.colordeu.es/BLOG/proteger-carpetas-web-con-htaccess-y-htpasswd</a><br />
<a href="http://readthefuckingmanual.net/error/1385/">http://readthefuckingmanual.net/error/1385/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2009/06/22/proteger-carpetas-con-htaccess-y-htpasswd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Apache Server-Status not Found 404</title>
		<link>http://www.rubenortiz.es/2009/06/18/apache-server-status-not-found-404/</link>
		<comments>http://www.rubenortiz.es/2009/06/18/apache-server-status-not-found-404/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 13:55:37 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=2027</guid>
		<description><![CDATA[Esto lo sospechaba por puro sentido común, pero no había dado con la forma de arreglarlo. Si decidimos activar el mod_status para Apache, hemos de acceder vía web a http://ip/server-status o http://dominio/server-status. El problema es que si en el dominio configurado tenemos reglas para .htaccess, el .htaccess interpretará la URL /server-status ocasionando que nos devuelva [...]]]></description>
			<content:encoded><![CDATA[<p>Esto lo sospechaba por puro sentido común, pero no había dado con la forma de arreglarlo. Si decidimos activar el <a title="apache mod_status centos" href="http://www.rubenortiz.es/2008/01/11/apache-serverstatus/">mod_status</a> para Apache, hemos de acceder vía <strong>web a http://ip/server-status</strong> o <strong>http://dominio/server-status.</strong> El problema es que si en el dominio configurado tenemos reglas para .htaccess, el .htaccess interpretará la URL /server-status ocasionando que nos devuelva un 404. <span id="more-2027"></span>Para evitarlo hay que decirle que /server-status no es una URL para redireccionar. Editamos el .htaccess y añadimos:</p>
<p><code><strong>RewriteCond %{REQUEST_URI} !=/server-status</strong></code></p>
<p>Reiniciamos apache, y si todo está ok, deberíamos ver la información del mod.</p>
<p><strong>Links</strong></p>
<ul>
<li><a href="http://www.mydigitallife.info/2007/04/23/request-url-server-status-or-404-page-not-found-apache-error/">http://www.mydigitallife.info/</a></li>
<li><a href="http://drupal.org/node/52511">http://drupal.org/node/52511</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2009/06/18/apache-server-status-not-found-404/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quitar cabeceras ETag de Apache</title>
		<link>http://www.rubenortiz.es/2009/05/18/quitar-cabeceras-etag-de-apache/</link>
		<comments>http://www.rubenortiz.es/2009/05/18/quitar-cabeceras-etag-de-apache/#comments</comments>
		<pubDate>Mon, 18 May 2009 09:55:18 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=1844</guid>
		<description><![CDATA[Editamos el archivo de configuración de apache y añadimos: Header unset ETag FileETag None También lo podemos configurar con nuestro .htacccess. Reinciamos apache y listo. El motivo de hacerlo ya es entrar en discusión de ciertos factores. Links http://www.askapache.com/htaccess/apache-speed-etags.html]]></description>
			<content:encoded><![CDATA[<p>Editamos el archivo de configuración de apache y añadimos:</p>
<p><code><br />
Header unset ETag<br />
FileETag None<br />
</code></p>
<p>También lo podemos configurar con nuestro .htacccess. Reinciamos apache y listo. El motivo de hacerlo ya es entrar en discusión de ciertos factores.</p>
<p><strong>Links</strong></p>
<ul>
<li><a href="http://www.askapache.com/htaccess/apache-speed-etags.html">http://www.askapache.com/htaccess/apache-speed-etags.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2009/05/18/quitar-cabeceras-etag-de-apache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[client ::1] Directory index forbidden by Options directive: /var/www/html/</title>
		<link>http://www.rubenortiz.es/2008/09/04/client-1-directory-index-forbidden-by-options-directive-varwwwhtml/</link>
		<comments>http://www.rubenortiz.es/2008/09/04/client-1-directory-index-forbidden-by-options-directive-varwwwhtml/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 09:49:37 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=175</guid>
		<description><![CDATA[No es un errror grave, pero es el típico que te llena los logs de error de apache y la verdad, molesta. Lo que debemos hacer es crear un index.html dentro de la ruta que muestra el error. # touch /var/www/html/index.html http://www.howtoforge.com/forums/showthread.php?t=17144]]></description>
			<content:encoded><![CDATA[<p>No es un errror grave, pero es el típico que te llena los logs de error de apache y la verdad, molesta. Lo que debemos hacer es crear un index.html dentro de la ruta que muestra el error.</p>
<p><code><strong># touch /var/www/html/index.html</strong></code></p>
<p><a href="http://www.howtoforge.com/forums/showthread.php?t=17144">http://www.howtoforge.com/forums/showthread.php?t=17144</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2008/09/04/client-1-directory-index-forbidden-by-options-directive-varwwwhtml/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Apache mod_expire. Expiración de contenidos web</title>
		<link>http://www.rubenortiz.es/2008/08/07/apache-mod_expire-expiracion-de-contenidos-web/</link>
		<comments>http://www.rubenortiz.es/2008/08/07/apache-mod_expire-expiracion-de-contenidos-web/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 10:01:50 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=187</guid>
		<description><![CDATA[Otra funcionalidad de apache. Se trata de mod_expire. Con mod_expire, podemos expresar el tiempo de expiración de un tipo de archivo (css,gif,png&#8230;etc). De esta manera, avisamos al navegador que ese contenido no va a cambiar en un determinado tiempo y no hace falta que lo vuelva a descargar. En las instalaciones típicas de Apache 2.0.X [...]]]></description>
			<content:encoded><![CDATA[<p>Otra funcionalidad de apache. Se trata de mod_expire. Con mod_expire, podemos expresar el tiempo de expiración de un tipo de archivo (css,gif,png&#8230;etc). De esta manera, avisamos al navegador que ese contenido no va a cambiar en un determinado tiempo y no hace falta que lo vuelva a descargar.</p>
<p><span id="more-187"></span></p>
<p>En las instalaciones típicas de Apache 2.0.X el mod_expire, al igual que una legión de modulos, ya viene compilado y cargado en la configuración por defecto. Si tenemos dudas de si está o no, lo podemos comprobar con la extensión de Mozilla Firebug, <a title="yslow" href="http://developer.yahoo.com/yslow/">YSlow</a>. Utilizando esta extensión vemos la fecha de expiración de un archivo en concreto.</p>
<p>Primero, compilamos el modulo sino lo tenemos por defecto, utilizando apxs. Si no tenemos este binario, podemos instalarlo con</p>
<p><code><strong># yum install httpd-devel</strong></code></p>
<p>Necesitamos el fichero .c del mod_expires, lo podemos bajar o copiar del paquete de httpd. Una vez lo tengamos todo, ejecutamos:</p>
<p><code><strong># /usr/local/apache/bin/apxs -i -a -c<br />
/root/httpd-2.2.6/modules/metadata/mod_expires.c</strong></code></p>
<p>Se deja el módulo en la ubicación por defecto</p>
<p><code># /usr/local/modules/mod_expires.so</code></p>
<p>Comprobamos en el fichero de configuración de apache, que se ha cargado la línea de configuración adecuada:</p>
<p><code><strong># LoadModule expires_module     modules/mod_expires.so</strong></code></p>
<p>Salvamos los cambios y reiniciamos apache</p>
<p><code><strong># /etc/init.d/httpd restart</strong></code></p>
<p>Podemos utilizar mod_expires en diferentes contextos, pero seguiremos el ejemplo encontrado en Yukei.net, por comodidad, más que nada. Nos referimos a utilizar htaccess, con lo cual, explícitamente necesitamos mod_rewrite.</p>
<p>Vamos al directorio donde tenemos el contenido que queremos controlar por expiración y creamos el htaccess</p>
<p><code><strong># touch .htaccess</strong></code></p>
<p><code><strong>#joe .htaccess</strong></code></p>
<p>Añadimos</p>
<p><code>&lt;IfModule mod_expires.c&gt;<br />
ExpiresActive On<br />
ExpiresDefault "access plus 1 year"<br />
&lt;/IfModule&gt;<br />
</code></p>
<p>o bien</p>
<p>Añadimos esto en el fichero httpd.conf de nuestro apache</p>
<p><code><br />
ExpiresActive On<br />
ExpiresDefault "access plus 1 month"<br />
</code></p>
<p>Reiniciamos apache again</p>
<p><code><strong># /etc/init.d/httpd restart</strong></code></p>
<p>Ahora, es cuando debemos comprobar con Yslow que nuestro contenido expira en el tiempo que nosotros hemosindicado. Para mod_expire hay dos directivas, ExpireDefault y ExpireByType. Son muy similares</p>
<p><strong>ExpireDefault</strong></p>
<div class="example">
<p><code> ExpiresDefault "access plus 1 month"<br />
ExpiresDefault "access plus 4 weeks"<br />
ExpiresDefault "access plus 30 days" </code></div>
<p><strong>ExpireByType</strong></p>
<div class="example">
<p><code> ExpiresByType text/html "access plus 1 month 15       days 2 hours"<br />
ExpiresByType image/gif "modification plus 5 hours 3       minutes"</code></p>
<p><strong>Links:</strong></div>
<p><a title="yukei.net" href="http://www.yukei.net/2008/03/controla-la-fecha-de-vencimiento-de-tus-archivos-con-mod_expires/ ">http://www.yukei.net</a></p>
<p><a title="mapopa" href="http://mapopa.blogspot.com/2008/07/enable-mod-expire-for-fast-image.html">http://mapopa.blogspot.com</a></p>
<p><a title="expire" href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html">http://httpd.apache.org/docs/2.0/mod/mod_expires.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2008/08/07/apache-mod_expire-expiracion-de-contenidos-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache. MaxClients y más&#8230;</title>
		<link>http://www.rubenortiz.es/2008/05/13/apache-maxclients-y-mas/</link>
		<comments>http://www.rubenortiz.es/2008/05/13/apache-maxclients-y-mas/#comments</comments>
		<pubDate>Tue, 13 May 2008 08:45:42 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=85</guid>
		<description><![CDATA[Conocer la versión Hay muchas maneras pero dejamos dos simples. Es necesario por motivos obvios, conocer la versión de apache instalada en nuestro sistema y el modo en el que ha sido compilado. # httpd -v Output: -bash-3.1# Server version: Apache/2.2.3 -bash-3.1# Server built: Jan 15 2008 20:33:30 # httpd -l Compiled in modules: core.c [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Conocer la versión</strong></p>
<p>Hay muchas maneras pero dejamos dos simples. Es necesario por motivos obvios, conocer la versión de apache instalada en nuestro sistema y el modo en el que ha sido compilado.</p>
<p><code><strong># httpd -v</strong></code></p>
<p>Output:</p>
<p><strong><code>-bash-3.1# Server version: Apache/2.2.3<br />
-bash-3.1# Server built:   Jan 15 2008 20:33:30</code></strong></p>
<p><span id="more-85"></span></p>
<p><code><strong># httpd -l</strong></code></p>
<p>Compiled in modules:</p>
<p>core.c<br />
prefork.c<br />
http_core.c<br />
mod_so.c</p>
<p>De esta manera sabemos que estamos ante un servidor Apache / 2.2.3 y en modo prefork:</p>
<p><a title="prefork 2.2.3" href="http://httpd.apache.org/docs/2.0/mod/prefork.html" target="_blank"><strong>Prefork MPM</strong></a>: el modo prefork utiliza múltiples procesos hijo, cada proceso hijo se ocupa de una conexión a la vez. Prefork es muy adecuado para sistemas con doble CPU, la velocidad es comparable al del Worker MPM y es altamente tolerante con los fallos en los módulos y los procesos hijos colgados. Por contra, el uso de memoria es alto y cuanto más tráfico tenemos más memoria consume</p>
<p><strong><a title="mpm worker" href="http://httpd.apache.org/docs/2.0/mod/worker.html" target="_blank">Worker MPM</a></strong>: utiliza múltiples procesos hijo. Es multi-thread dentro de cada proceso hijo y cada thread se encarga de una conexión.  Worker es más rápido y escalable y el uso de memoria es comparativamente bajo. Es también adecuado para múltiples procesadores. Worker es menos tolerante ante fallos de módulos y un fallo en un thread puede afectar a todos los threads de un proceso hijo.</p>
<blockquote><p>Este Módulo de MultiProcesamiento (MPM) implementa un     servidor híbrido multiproceso-multihebra.  Usando hebras para     atender peticiones, el servidor puede servir un mayor número     de peticiones con menos recursos de sistema que un servidor basado     únicamente en procesos. No obtante, se mantiene casi por     completo la estabilidad de un servidor basado en procesos     manteniendo la capacidad multiproceso, pudiendo cada proceso tener     muchas hebras.</p></blockquote>
<p><strong>Directivas de Apache</strong></p>
<ul>
<li><strong>MaxClients:</strong> es el número total de procesos hijo httpd que pueden ser procesados simultáneamente. El valor por defecto es bastante elevado para la mayoría de servidores (256). Cada proceso hijo es capaz de mapear (allocate) en memoria un número de información X. En Drupal, por ejemplo, cada proceso puede utilizar unos 10-15 Mb de memoria. 20 procesos, por 20MB de RAM cada uno, consume cerca de 500MB de memoria física. Cuando nos acercamos o llegamos al límite marcado, apache no devuelve un <strong>TimeOut </strong>inmediato, sino que coloca la petición en cola. Una aproximación racional al número adecuado para esta directiva podría ser la división de la cantidad total de RAM disponible (dejando una generosa cantidad para otros procesos) entre el máximo tamaño del proceso apache. Podemos saber el consumo de memoria de apache <strong>por proceso</strong> con el comando ps.</li>
</ul>
<p>Lo fundamental para entender como gestionar la directiva <strong>MaxClients</strong>, es comprender que puede tener un valor &#8220;alto&#8221; sino nuestro servidor está sirviendo contenido estático, pero con aplicaciones modernas tipo PHP de contenido dinámico, podemos tener graves problemas de estabilidad si no calculamos bien el número total de <strong>MaxClients</strong>. Una fórmula para calcular el valor apropiado del <strong>MaxClients </strong>sería (hay muchas) la siguiente:</p>
<p style="text-align: center;">MaxClients = Total RAM dedicated to the web server / Max child process size</p>
<p style="text-align: left;">En un ejemplo práctico, tenemos una máquina virtual (<strong><a title="openvz" href="http://www.rubenortiz.es/category/sistemas/aplicaciones/openvz/" target="_blank">OpenVZ</a></strong>) con 1Gb de RAM asignado. Después de averiguar el tamaño total del proceso apache, dividimos:</p>
<p style="text-align: center;">1 GB (1024 MB) / 2,3 MB = 445 MaxClients</p>
<p style="text-align: left;">Siempre pensando en un servidor que &#8220;sólo&#8221; ejecutara apache, obviamente, este valor es sólo un ejemplo. Nunca se debería asumir esa cantidad total de <strong>MaxClients</strong>. Lo mejor sería aumentar un poco el valor y comprobar el funcionamiento del servidor. Pero sería un buen punto de referencia.</p>
<p style="text-align: left;">
<ul>
<li><strong>StartServers:</strong> número de procesos iniciales.</li>
<li><strong>MinSpareServers:</strong> número de procesos iniciales en iddle que esperan una petición.</li>
<li><strong>MaxSpareServers:</strong> número máximo de procesos en iddle esperando.</li>
<li><strong>MaxRequestsPerChild: </strong>cuando un proceso excede este valor, el proceso es destruido y, si es necesario, un nuevo proceso lo reemplaza.  Esto puede reducir la memoria total usada en muchas situaciones, con los archivos dinámicos incrementando constantemente su uso de RAM y reiniciando los procesos para reducir su uso.</li>
<li><strong>ServerLimit:</strong> si nosotros queremos aumentar el número total de MaxClients de 256 a 300, debemos en principio aumentar el ServerLimit a la misma cantidad. Sino, el apache se quejará mostrándolo por la salida estándar.</li>
<li><strong>KeepAlive:</strong> por defecto está en off. Al estar on, permitimos a una misma conexión TCP hacer múltiples peticiones sin descartar la conexión <strong>(conexiones persistentes).</strong></li>
<li><strong>MaxKeepAliveRequests:</strong> el número total de peticiones permitidas por una misma conexión TCP.</li>
<li><strong>KeepAliveTimeOut:</strong> el número máximo de segundos que permanecerá el proceso esperando a ser respondido.</li>
</ul>
<p><strong>Ejemplo configuración por defecto de Apache</strong></p>
<p><code><br />
# IfModule prefork.c<br />
StartServers       8<br />
MinSpareServers    5<br />
MaxSpareServers   20<br />
ServerLimit      256<br />
MaxClients       256<br />
MaxRequestsPerChild  4000<br />
# IfModule<br />
# IfModule worker.c<br />
StartServers         2<br />
MaxClients         150<br />
MinSpareThreads     25<br />
MaxSpareThreads     75<br />
ThreadsPerChild     25<br />
MaxRequestsPerChild  0<br />
# ifModule<br />
</code></p>
<p><strong>Calcular memoria consumida por Apache</strong></p>
<p><code><strong># ps -ylC httpd --sort:rss </strong></code></p>
<p>&#8211;sort rss (<span style="font-size: x-small; font-family: Arial,Helvetica,sans-serif;">lista ordenando por RSS(Resident Set Size), kb del proceso en memoria)</span></p>
<p>Output:</p>
<p><code><strong># S    48  5674 17426  0  75   0  2904  2637 277588 ?        00:00:00 httpd</strong><br />
</code></p>
<p>2904 / 1024 = 2,8 MB ocupados por proceso de Apache. Ahora, debemos saber el número total de procesos:</p>
<p><code># <strong>lsof -i | grep httpd | grep ESTABLISHED | wc -l</strong></code></p>
<p>Output:</p>
<p><strong> # 15</strong></p>
<p>De este modo, tenemos que por proceso utilizamos 2,8 MB de memoria (no swap). Y sabemos que hay 15 procesos de apache en memoria, con lo cual 2,8 MB x 15 = <strong>42 MB</strong> usados. Otra forma, quizá más fácil de calcular como está rindiendo nuestro apache, es utilizar este <a title="python script apache memory" href="http://www.pixelbeat.org/scripts/ps_mem.py" target="_blank">script</a> escrito en python (gracias al admin de <a title="devside" href="http://forums.devside.net/" target="_blank">Devside</a> <img src='http://www.rubenortiz.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) Os dejo un output de lo que muestra el script:</p>
<p>Private  +   Shared  =  RAM used       Program</p>
<p><strong>84.0 KiB + 312.0 KiB = 396.0 KiB       klogd<br />
128.0 KiB + 452.0 KiB = 580.0 KiB       syslogd<br />
128.0 KiB + 524.0 KiB = 652.0 KiB       init<br />
824.0 KiB + 600.0 KiB =   1.4 MiB       bash<br />
568.0 KiB +   1.1 MiB =   1.6 MiB       sftp-server<br />
1.6 MiB +   1.9 MiB =   3.5 MiB       sshd (3)<br />
37.4 MiB +   2.1 MiB =  39.5 MiB       httpd (180)</strong></p>
<p><strong>Optimización</strong></p>
<p>No hablaremos de <strong>optimización </strong>totalmente pero, si comentaremos que una de las cosas que se recomiendan por toda la comunidad es deshabilitar los <strong>módulos </strong>de apache que no necesitemos. En el ejemplo que me ocupa, una máquina virtual de 1GB de RAM de OpenVZ, deshabilitamos de 52 procesos 35, dejando sólo activos 17. Volvimos a hacer el calculo de la memoria utilizada por apache entonces:</p>
<p>2,3 MB por proceso x 12 procesos = 33,6 MB! (22 % menos en memoria). No está mal.</p>
<p>Otro consejo que se da en todos los manuales de tunning de Apache, es el deshabilitar la resolución de DNS,<strong> HostnameLookups</strong>. Esta directiva intenta resolver cada IP conectada a tu servidor y eso genera un consumo de recursos innecesario.</p>
<p><strong>Conexiones Persistentes</strong></p>
<p>En sus inicios, el protocolo HTTP no permitía las conexiones persistentes, lo que significaba que era necesaria una conexión al servidor por cada archivo que tuviese que ser descargado. Esto era una manera ineficiente de hacer las cosas, especialmente desde que Internet comenzó a tener sitios webs con gran cantidad de archivos. ¿Por qué?:</p>
<ol>
<li>Cada conexión requiere la carga de al menos, 3 paquetes para ser iniciada (SYN,SYN-ACK,ACK). Esto significa que al menos 3 viajes de ida y vuelta para abrir una conexión.</li>
<li>Dada la naturaleza de TCP, bajo protocolo HTTP, una conexión funciona más rápido cuanto más tiempo está &#8220;abierta&#8221;. El cerrar y abrir continuamente conexiones, no permite a HTTP utilizar su ancho de banda total.</li>
</ol>
<p><strong>Directivas de KeepAlive</strong></p>
<ul>
<li><strong>KeepAlive</strong>: habilita o deshabilita las conexiones persistentes [ On - Off]</li>
<li><strong>KeepAliveTimeout</strong>: cuanto tardará Apache, en segundos, después de que una petición haya sido respondida para pasar a otra antes de cerrar la conexión.</li>
<li><strong>MaxKeepAliveRequests</strong>: el número total de peticiones que se permite a una conexión abierta.</li>
</ul>
<p>Cuando un cliente se conecta al servidor web, se le permite realizar <strong>múltiples peticiones en la misma conexión TCP</strong>, lo cual reduce la latencia asociada a las múltiples conexiones. Esto es útil cuando, por ejemplo, una conexión a una página web requiere varias imágenes, y todas esas imágenes son recibidas por el cliente en una misma conexión. El lado malo es que cada proceso o worker en el servidor debe esperar a que se cierre la sesión por el cliente antes de poder resolver la siguiente conexión. Es difícil decir si es adecuado o no, activar las conexiones persistentes. En caso de que lo activemos, debemos dejar un valor muy bajo, 2, en la directiva <strong>KeepAliveTimeout</strong>. De esta manera, nos aseguramos de que cualquier cliente puede hacer las peticiones con bastante tiempo, y que el proceso no estará esperando eternamente a que el cliente cierre la conexión y se moverá a la siguiente conexión TCP. Resumiendo, sólo podemos probar su uso y ver si responde a nuestras necesidades.</p>
<p>Una curiosidad. Después de activar el KeepAlive, lo pude ver reflejado al instante en las gráficas del <a title="cacti" href="http://www.cacti.net" target="_blank">Cacti</a>.</p>
<p><a rel="lightbox" href="http://www.rubenortiz.es/wp-content/uploads/2008/05/cacti.jpg"><img class="aligncenter size-full wp-image-87" title="cacti" src="http://www.rubenortiz.es/wp-content/uploads/2008/05/cacti.jpg" alt="" width="500" height="237" /></a></p>
<p>Un poco después de las 16.00 hice el cambio y se puede ver perfectamente. Es lo bueno de tener herramientas como esta. Era viernes y como no es bueno hacer cambios en fin de semana, lo desactivé.</p>
<p>Por último, comentar que la compresión de Apache logra muy buenos resultados. Revisar <strong><a title="mod deflate" href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html" target="_blank">mod_deflate.</a></strong></p>
<p>Fuentes:</p>
<p><a title="drupal" href="http://drupal.org/node/215516" target="_blank">http://drupal.org/node/215516</a></p>
<p><a title="apache performance" href="http://www.mysqlperformanceblog.com/2007/02/05/why-do-you-need-many-apache-children/" target="_blank">http://www.mysqlperformanceblog.com</a></p>
<p><a href="http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/" target="_blank">http://www.mysqlperformanceblog.com/</a></p>
<p><a href="http://www.devside.net/articles/apache-performance-tuning" target="_blank">http://www.devside.net/articles/apache-performance-tuning</a></p>
<p><a title="blacklog directive" href="http://publib.boulder.ibm.com/infocenter/wsdoc400/v6r0/index.jsp?topic=/com.ibm.websphere.iseries.doc/info/ae/ae/tprf_tunewebserv.html" target="_blank">http://publib.boulder.ibm.com</a></p>
<p><a href="http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html" target="_blank">http://www.onlamp.com/pub/a/onlamp/2004/02/05/lamp_tuning.html</a></p>
<p><a href="http://www.pacosanchez.com/2007/11/21/optimizando-apache" target="_blank">http://www.pacosanchez.com/2007/11/21/optimizando-apache</a></p>
<p><a title="worker" href="http://httpd.apache.org/docs/2.0/mod/worker.html" target="_blank">http://httpd.apache.org/docs/2.0/mod/worker.html</a></p>
<p><a title="prefork" href="http://httpd.apache.org/docs/2.0/mod/prefork.html" target="_blank">http://httpd.apache.org/docs/2.0/mod/prefork.html</a></p>
<p><a title="ibm" href="http://www.ibm.com/developerworks/web/library/l-tune-lamp-2.html#listing1" target="_blank">http://www.ibm.com/developerworks/web/library/l-tune-lamp-2.html#listing1</a></p>
<p><a title="keepalive" href="http://www.apache-es.org/?p=20" target="_blank">http://www.apache-es.org/?p=20</a></p>
<p><a title="python" href="http://www.pixelbeat.org/scripts/ps_mem.py" target="_blank">http://www.pixelbeat.org/scripts/ps_mem.py</a> &#8211; Reporta la memoria consumida por el sistema</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2008/05/13/apache-maxclients-y-mas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apache devuelve páginas PHP en blanco</title>
		<link>http://www.rubenortiz.es/2008/04/21/apache-php-devuelve-paginas-en-blanco/</link>
		<comments>http://www.rubenortiz.es/2008/04/21/apache-php-devuelve-paginas-en-blanco/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 14:38:39 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/?p=70</guid>
		<description><![CDATA[Un error tonto, más propio de un descuido ocasional que de un mala configuración. Pero me lo dejo aquí anotado para pensar más en el, si me vuelve a ocurrir. Tocando la configuración de un apache de una determinada máquina, para que la configuración por defecto no redirigiese a otro destino mediante la directiva Redirect, [...]]]></description>
			<content:encoded><![CDATA[<p>Un error tonto, más propio de un descuido ocasional que de un mala configuración. Pero me lo dejo aquí anotado para pensar más en el, si me vuelve a ocurrir. Tocando la configuración de un apache de una determinada máquina, para que la configuración por defecto no redirigiese a otro destino mediante la directiva Redirect, se me olvidó especificarle algo obligatorio si queremos utilizar el php.</p>
<p><code><strong>AddType application/x-httpd-php .php .phtml<br />
AddType application/x-httpd-php-source .phps</strong></code></p>
<p>Reiniciar apache y ya está. Esta es una de las causas, hay más que pueden afectar a nuestros servidor web.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2008/04/21/apache-php-devuelve-paginas-en-blanco/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache y mod_evasive</title>
		<link>http://www.rubenortiz.es/2008/04/01/apache-y-mod-evasive/</link>
		<comments>http://www.rubenortiz.es/2008/04/01/apache-y-mod-evasive/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 16:24:25 +0000</pubDate>
		<dc:creator>Rubén Ortiz</dc:creator>
				<category><![CDATA[Apache 2.X]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://www.rubenortiz.es/2008/04/01/mod-evasive/</guid>
		<description><![CDATA[¿Qué es Mod Evasive? Apache Evasive Maneuvers Module A module for Apache (both 1.3 and 2.0) giving Apache the ability to detect and fend off request-based DoS/DDoS attacks and brute-force attacks conserving your system resources and bandwidth. This tool can be configured to report abusers and even talk to network gear (such as a firewall [...]]]></description>
			<content:encoded><![CDATA[<p>¿Qué es Mod Evasive?</p>
<p><em><strong>Apache Evasive Maneuvers Module</strong><br />
A module for Apache (both 1.3 and 2.0) giving Apache the ability to detect and fend off request-based DoS/DDoS attacks and brute-force attacks conserving your system resources and bandwidth. This tool can be configured to report abusers and even talk to network gear (such as a firewall or ipchains).</em><br />
<span id="more-65"></span></p>
<p>Uno de los más famosos mods de toda la comunidad, creado por <a title="zdiazrski" href="http://www.zdziarski.com">Zdziarski</a>, este mod_evasive, es usado por cientos de webs. A estas alturas no sirve de nada presentarlo. Voy a explicar brevemente los pasos para poder utilizarlo en un sistema RedHat, Centos. Tuve la incógnita de como se podía hacer partiendo de una instalación de apache, creada a partir de yum y el repositorio de RedHat. Lo único que necesitamos es instalar el paquete httpd-devel:</p>
<p><code><br />
<strong># wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz<br />
# gunzip mod_evasive_1.10.1.tar.gz<br />
# tar xf mod_evasive_1.10.1.tar</strong><br />
</code></p>
<p>Actualización:</p>
<p><a href="ftp://217.113.242.100/linux/apache/mod_evasive_1.10.1.tar.gz">Mod Evasive 1.10.1</a></p>
<p>Necesitamos el binario apxs, para poder compilar el mod. Instalamos el paquete httpd-devel:</p>
<p><code><strong># yum install httpd-devel</strong></code></p>
<p>El archivo está localizado en:</p>
<p>/usr/sbin/apxs</p>
<p>Ahora, vamos a ver como compilarlo. Léemos directamente del archivo de instalación. Hay 2 archivos diferentes según nuestra versión de Apache, mod_evasive.c para el apache v1.3 y mod_evasive20.c para Apache v2.X. Leemos directamente del &#8220;README&#8221; del mod:</p>
<blockquote><p>1. Extract this archive<br />
2. Run $APACHE_ROOT/bin/apxs -i -a -c mod_evasive20.c<br />
3. The module will be built and installed into $APACHE_ROOT/modules, and loaded<br />
4. Restart Apache</p></blockquote>
<p>No hace falta que lo hagamos, pero como no tenemos el /bin/apxs dentro del $APACHE_ROOT creamos un enlace simbólico y entonces ejecutamos.<br />
<code><br />
<strong># ln -s /usr/sbin /etc/httpd/bin<br />
# /etc/httpd/bin/apxs -i -a -c mod_evasive20.c</strong></code></p>
<p>El modulo se guardará en $APACHE_ROOT/modules y se modificará automáticamente el httpd.conf para cargar el modulo. Lo siguiente es editar el archivo de configuración de apache para configurar el mod. Incluimos el siguiente trozo de código:</p>
<blockquote><p>DOSHashTableSize    3097<br />
DOSPageCount        2<br />
DOSSiteCount        50<br />
DOSPageInterval     1<br />
DOSSiteInterval     1<br />
DOSBlockingPeriod   10</p></blockquote>
<p>Este código de configuración es sólo el que viene por defecto. El mod permite incluso interactuar con Iptables para banear ips por firewall. Por ejemplo, podemos configurar rangos de ips &#8220;blancas&#8221;, seguras, que sabemos que no van a ser focos potenciales de ataques de DDos.</p>
<blockquote><p>DOSWhiteList 127.0.0.1<br />
DOSWhiteList 195.168.160.*</p></blockquote>
<p>La lista de ips baneadas, se incluirá en el syslog del sistema, concretamente, en /var/log/messages. Sólo nos queda ya reiniciar apache.</p>
<p>Una vez tengamos todo configurado, podemos utilizar un script en perl para comprobar si mod_evasive hace su trabajo.</p>
<p><code><strong># perl test.pl</strong></code></p>
<p><code>[...]<br />
HTTP/1.1 200 OK<br />
HTTP/1.1 200 OK<br />
HTTP/1.1 200 OK<br />
HTTP/1.1 403 Forbidden<br />
HTTP/1.1 403 Forbidden<br />
HTTP/1.1 403 Forbidden<br />
[...]</code></p>
<p>Cuando mod_evasive detecta que el umbral de conexiones ha sido rebasado, añadirá la ip a la lista de bloqueados.</p>
<p><strong>Links</strong></p>
<ul>
<li><a title="mod evasive" href="http://www.sourcefiles.org/Internet/WebServers/Modules/Security/mod_evasive_1.10.1.tar.gz.shtml">http://www.sourcefiles.org/</a></li>
<li><a title="mod evasive" href="http://www.zdziarski.com/projects/mod_evasive/">http://www.zdziarski.com/projects/mod_evasive/</a></li>
<li><a title="mod evasive emezeta" href="http://www.emezeta.com/articulos/mod-evasive-evitando-denegacion-servicio-distribuida">http://www.emezeta.com/articulos</a></li>
<li><a title="mod evasive webhostingtalk" href="http://www.webhostingtalk.com/showthread.php?t=592655">http://www.webhostingtalk.com/showthread.php?t=592655</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rubenortiz.es/2008/04/01/apache-y-mod-evasive/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
