<?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>apache | ahierro.es</title>
	<atom:link href="https://blog.ahierro.es/tag/apache/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ahierro.es</link>
	<description>Un blog personal  donde compartir experiencias e inquietudes relacionadas con internet, tecnología y otros asuntos interesantes</description>
	<lastBuildDate>Thu, 07 Oct 2021 07:02:51 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>

<image>
	<url>https://blog.ahierro.es/wp-content/uploads/2018/10/cropped-logo_small-1-2-32x32.png</url>
	<title>apache | ahierro.es</title>
	<link>https://blog.ahierro.es</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Variables de configuración de PHP en .htaccess</title>
		<link>https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/</link>
					<comments>https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 07 Oct 2021 07:02:49 +0000</pubDate>
				<category><![CDATA[Apache 2]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tips & Quick Wins]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[servidor]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=2352</guid>

					<description><![CDATA[<p>No siempre disponemos de acceso a la configuración del servidor. Aprendemos a configurar las variables de PHP mediante el archivo .htaccess cuando esto ocurre</p>
La entrada <a href="https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/">Variables de configuración de PHP en .htaccess</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Al momento de desplegar nuestras aplicaciones web no siempre tenemos acceso a la configuración del servidor. Aprendemos a configurar las variables de PHP mediante el archivo .htaccess cuando esto ocurre.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-1024x576.png" alt="Variables de PHP en htaccess" class="wp-image-2388" srcset="https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-1024x576.png 1024w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-300x169.png 300w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-768x432.png 768w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess-1536x864.png 1536w, https://blog.ahierro.es/wp-content/uploads/2021/10/htaccess.png 1920w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<span id="more-2352"></span>



<p>Y es que a veces encontraremos que nuestra aplicación tiene unos requisitos mínimos que el servidor no cumple. Pongamos por ejemplo que queremos <a href="https://blog.ahierro.es/instalar-prestashop-1-7/" title="Instalar Prestashop 1.7">instalar prestashop</a> que tiene ciertos <a href="https://blog.ahierro.es/requisitos-minimos-de-prestashop-1-7/" title="Requisitos mínimos de Prestashop 1.7">requisitos mínimos</a> y que por algún motivo nuestro hosting no satisface.</p>



<h2 class="wp-block-heading">Cómo configurar variables de PHP desde .htaccess</h2>



<p>Hay varias formas de actuar sobre estas variables, pero tal y como reza el título de esta entrada hoy vamos a hacerlo con el archivo <em>.htaccess</em>, y para ello utilizaremos la orden <em>php_value</em>. Su sintaxis es muy sencilla<em>:</em></p>



<p><em>php_value</em> + <em>variable_php</em> + <em>valor</em>. </p>



<p>Un ejemplo podría ser que necesitamos que la variable <em>memory_limit</em> esté configurada en 64M y el servidor la tiene configurada en 32M, o quizás el <em>max_input_vars</em> está configurado en 500 y nuestros requisitos mínimos son 1.000. Para ello incluiríamos las siguientes líneas en el archivo .htaccess:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
php_value memory_limit 64M
php_value max_input_vars 1000
</pre></div>


<p>O supongamos que queremos mostrar los errores de PHP de nuestra aplicación. Podemos hacerlo desde el archivo .htaccess:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
php_value error_reporting 7
php_flag display_errors On
</pre></div>


<h2 class="wp-block-heading">Dónde colocar las líneas dentro del archivo .htaccess</h2>



<p>Personalmente me gusta colocar este tipo de sentencias al comienzo del archivo .htaccess, justo detrás de los comentarios:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# Comentarios habituales en archivos .htaccess

# variables php
php_value error_reporting 7
php_flag display_errors On

&amp;lt;IfModule mod_rewrite.c&gt;
&amp;lt;IfModule mod_env.c&gt;
SetEnv HTTP_MOD_REWRITE On
&amp;lt;/IfModule&gt;

RewriteEngine on
...
</pre></div>


<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li><a href="https://blog.ahierro.es/aumentar-el-limite-de-memoria-de-un-script-en-php/">Aumentar el límite de memoria de un script en PHP</a></li><li><a href="https://blog.ahierro.es/aumentar-el-limite-de-tiempo-maximo-de-ejecucion-de-un-script-en-php/">Aumentar el limite de tiempo máximo de ejecución de un script en PHP</a></li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a></li><li><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a></li><li><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a></li></ul>La entrada <a href="https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/">Variables de configuración de PHP en .htaccess</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/variables-de-configuracion-de-php-en-htaccess/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP: mod_php vs CGI vs FastCGI vs FPM</title>
		<link>https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/</link>
					<comments>https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Fri, 11 Oct 2019 07:07:28 +0000</pubDate>
				<category><![CDATA[Apache 2]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1793</guid>

					<description><![CDATA[<p>Existen varias alternativas para conectar el intérprete de PHP con Apache, cada una de ellas con sus ventaja e inconvenientes. Hoy vamos repasar las principales e intentaremos responder a la pregunta de cuál es la más adecuada en función del uso que le vayamos a dar. Estoy seguro de que a muchos de vosotros os &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "PHP: mod_php vs CGI vs FastCGI vs FPM"</span></a></p>
La entrada <a href="https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/">PHP: mod_php vs CGI vs FastCGI vs FPM</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Existen varias alternativas para conectar el intérprete de PHP con Apache, cada una de ellas con sus ventaja e inconvenientes. Hoy vamos repasar las principales e intentaremos responder a la pregunta de cuál es la más adecuada en función del uso que le vayamos a dar.</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-1024x546.jpg" alt="Alternativas Instalación PHP" class="wp-image-1803" width="840" height="448" srcset="https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-1024x546.jpg 1024w, https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-300x160.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php-768x410.jpg 768w, https://blog.ahierro.es/wp-content/uploads/2019/10/alternativas_php.jpg 1920w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<span id="more-1793"></span>



<p>Estoy seguro de que a muchos de vosotros os suena lo siguiente: te dispones a instalar un servidor web, abres la consola de Linux, instalas Apache, y cuando buscas el paquete de PHP te encuentras que tienes varias opciones: php7.2, php7.2-cgi, php7.2-fpm o libphp7.2-embed. Dudas sobre cual elegir pero no tienes tiempo o ganas de investigar, sabes que el paquete php7.2 funcionará con total seguridad, así que lo instalas y continuas con la siguiente tarea.</p>



<p>Si has vivido esta situación, no te sientas culpable, no tengas remordimientos de conciencia, no estás solo, somos muchos los que hemos actuado así, pero sigue leyendo y la próxima vez podrás elegir la mejor opción para tus necesidades.</p>



<h2 class="wp-block-heading">Handlers en Apache</h2>



<p>Según la web de Apache, un handler es «una representación interna de Apache de una acción que se va a ejecutar cuando hay una llamada a un fichero», y continua «Generalmente, los ficheros tienen handlers implícitos, basados en el tipo de fichero de que se trata». Esto, traducido al cristiano y llevado al ámbito de PHP significa que cuando Apache detecta un fichero PHP hará uso de los handlers para conectar con el intérprete y que éste realice las tares  oportunas.</p>





<h2 class="wp-block-heading">Handlers para PHP</h2>



<p>Ya sabemos que es un handler, repasemos ahora las principales opciones existente para que Apache pueda interpretar los archivos PHP.</p>



<h3 class="wp-block-heading">DSO ó mod_php</h3>



<p>Probablemente habrás escuchado hablar de mod_php pero quizás no de DSO. Mod_php es como se conoce comúnmente al manejador DSO (Dynamic Shared Object).</p>



<p>Es la opción más habitual en entornos de desarrollo o locales, si buscamos en internet como instalar PHP sobre Apache en Linux la  mayoría de resultados nos propondrán este sistema, y para muestra un  botón: <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a>.</p>



<p>Con mod_php el intérprete de PHP es ejecutado directamente por Apache como un módulo, lo que evita tener que realizar llamadas a procesos externos. Esto es una ventaja en cuanto que la comunicación entre ambos es muy ágil y nos permite obtener un gran rendimiento.</p>



<p>Otra característica de este sistema es que el intérprete PHP es cargado al arrancar cada proceso de Apache, incluso cuando el contenido a servir no contiene código PHP alguno. Este hecho provoca que obtengamos un mejor rendimiento en detrimento del consumo de recursos del sistema, convirtiéndolo en una mala opción para sites con mucho tráfico.</p>



<p>También es importante destacar que PHP hereda los permisos del usuario de Apache. Esto implica que <em>nobody</em> será el propietario de cualquier archivo creado por PHP, pudiendo generar algunos conflictos de permisos. No obstante con una mínima configuración podemos evitar este problema, podéis ver como hacerlo en el artículo <a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a>.</p>



<h4 class="wp-block-heading">Ventajas de DSO</h4>



<ul class="wp-block-list"><li>Fácil instalación y configuración.</li><li>Buen rendimiento.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de DSO</h4>



<ul class="wp-block-list"><li>Alto consumo de recursos.</li><li>Los archivos creados por PHP pertenecen a Apache.</li></ul>



<h3 class="wp-block-heading">CGI</h3>



<p>CGI son las siglas de Common Getway Interface. Como su propio nombre indica es una interface y su cometido es permitir a Apache interactuar con programas externos, en este caso con PHP. Es un sistema que prácticamente podemos denominar como legacy y está cada vez más en desuso debido a su pobre rendimiento y a la existencia de alternativas más modernas y eficientes.</p>



<p>Al utilizar esta interface, cada petición de PHP inicia un proceso independiente que es finalizado cuando concluye su labor. Este modus operandi consigue que CGI sea muy eficiente en el consumo de memoria pero pobre en rendimiento. En sitios web con alto tráfico el sistema de creación y destrucción de procesos implica un uso de procesador demasiado elevado, por lo que no es nada recomendable para este tipo de sites.</p>





<p>Y al igual que con DSO, Apache será el propietario de lo archivos que generemos o subamos al servidor haciendo uso de PHP, pero ya hemos visto que este problema tiene fácil solución.</p>



<h4 class="wp-block-heading">Ventajas de CGI</h4>



<ul class="wp-block-list"><li>Fácil de instalar y configurar.</li><li>Consumo de recursos moderado en sites con poco tráfico.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de CGI</h4>



<ul class="wp-block-list"><li>Rendimiento pobre.</li><li>Alto consumo de procesador en sites con tráfico elevado.</li><li>Los archivos creados por PHP pertenecen a Apache.</li></ul>



<h3 class="wp-block-heading">FastCGI</h3>



<p>Podemos decir que FastCGI es la evolución de CGI, y surge por la necesidad disponer de un sistema con las ventaja de Common Getway Interface pero minimizando sus inconvenientes.</p>



<p>Al contrario que CGI, FastCGI mantiene la sesión abierta de forma persistente y no la cierra una vez que ha concluido el proceso por el que la abrió. Con esto se consigue un rendimiento similar a DSO a costa de elevar el consumo de memoria pero manteniéndolo por debajo de éste.</p>



<p>Una gran ventaja de FastCGI es que podemos configurar nuestro servidor para que trabaje con múltiples versions de PHP, lo que es particularmente útil cuando en una misma máquina tenemos aplicaciones que requieren versiones distintas de PHP.</p>



<p>Otra característica muy interesante es que podemos separar el host dónde corre Apache del host qué interpreta PHP, ofreciéndonos una gran versatilidad en el diseño de nuestro sistema.</p>



<p>Por último y haciendo referencia al propietario de los archivos creados por PHP, FastCGI hace uso de suEXEC para permitir definir la propiedad de los archivos. Esto es particularmente útil en entornos compartidos dónde es posible configurar distintos propietarios para distintos sites</p>



<h4 class="wp-block-heading">Ventajas de FastCGI</h4>



<ul class="wp-block-list"><li>Buen rendimiento.</li><li>Consumo de recursos moderado.</li><li>Posibilidad de ejecutar Apache y PHP en distintos hosts.</li><li>Posibilidad de trabajar con distintas versiones de PHP.</li><li>Posibilidad de definir el propietario de los archivos.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de FastCGI</h4>



<ul class="wp-block-list"><li>Mayor complejidad de configuración.</li></ul>



<h3 class="wp-block-heading">FPM</h3>



<p>FPM o FastCGI Process Manager ha sido el último en llegar, y no es más que una implementación de FastCGI con varias características orientadas a la mejora del comportamiento para  sitios web con mucho tráfico.</p>



<p>Cómo la diferencia entre FastCGI y FPM comienzan  a adentrarse en un terreno muy técnico, no entraremos en mucho detalle, ero si mencionaremos algunas de estas mejoras:</p>



<ul class="wp-block-list"><li>Manejo avanzado para detener/arrancar procesos de forma fácil.</li><li>Posibilidad de iniciar hilos de procesos con diferentes uid/gid/chroot/environment.</li><li>Escuchar en diferentes puertos.</li><li>Usar distintos php.ini</li><li>Uso de safe_mode.</li></ul>



<p>Si quieres ver la lista completa de estas ventajas puedes hacerlo en la página dedicada a <a href="https://www.php.net/manual/es/install.fpm.php" target="_blank" rel="noreferrer noopener" aria-label="FPM en php.net (abre en una nueva pestaña)">FPM en php.net</a>.</p>



<h4 class="wp-block-heading">Ventajas de FPM</h4>



<ul class="wp-block-list"><li>Buen rendimiento.</li><li>Consumo de recursos moderado.</li><li>Todas las ventajas de FastCGI.</li><li>Más opciones de configuración que FastCGI.</li></ul>



<h4 class="wp-block-heading">Inconvenientes de FPM</h4>



<ul class="wp-block-list"><li>Mayor dificultad de instalación y configuración.</li></ul>



<h2 class="wp-block-heading">Tabla comparativa</h2>



<p>Para intentar ser prácticos, podemos resumir lo que hemos visto en una tabla comparativa, que si bien carece de muchos matices puede darnos una visión bastante clara con tan solo un vistazo.</p>



<figure class="wp-block-table"><table><tbody><tr><th></th><th>DSO</th><th>CGI</th><th>FastCGI</th><th>FPM</th></tr><tr><th>Rendimiento</th><td>Bueno</td><td>Malo</td><td>Bueno</td><td>Bueno</td></tr><tr><th>Consumo de recursos</th><td>Alto</td><td>Medio-Alto</td><td>Medio</td><td>Medio</td></tr><tr><th>Archivos propiedad de Apache</th><td>Si</td><td>Si</td><td>No</td><td>No</td></tr><tr><th>Dificultad de configuración</th><td>Baja</td><td>Baja</td><td>Alta</td><td>Alta</td></tr><tr><th>Opciones de configuración</th><td>Media</td><td>Media</td><td>Alta</td><td>Muy Alta</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">mod_php, CGI, FastCGI ó FPM, cuál es mejor?</h2>



<p>Y la respuesta que muchos esperaréis después de leer (o no) esta entrada es: cuál es mejor? Y la respuesta más habitual a este tipo de preguntas es: para qué?</p>





<p>Para entornos de desarrollo, entornos de prueba o para pequeñas intranets sin excesiva carga recomendaría DSO. Es fácil de configurar, rinde bien y no tendremos problemas de recursos. El único motivo por el que me decantaría por otra opción sería si necesitáramos tener más de una versión de php corriendo en la misma máquina. En tal caso la opción más apropiada sería FastCGI.</p>



<p>Si nos vamos al lado opuesto, sites con muchísimo tráfico, dónde confieso que no tengo ninguna experiencia, parece que la mejor opción es FPM, por: rendimiento, consumo de recursos y versatilidad.</p>



<p>Y entre el espacio que dejan las dos situaciones propuestas es quizás dónde mejor encajaría FastCGI, asumiendo que los motivos que influyen en la decisión última no permiten trazar líneas delimitadoras claras y recomendar hasta aquí esta opción y a partir de aquí la otra. En su lugar nos dejan una amplia gama de grises en función de las características del entorno.</p>



<p class="has-text-align-left">Para acabar, personalmente intentaría no utilizaría CGI, pues no encuentro ninguna característica diferenciadora que compense el peor rendimiento y mayor consumo de recursos.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada por <a rel="noreferrer noopener" aria-label="Arek Socha (abre en una nueva pestaña)" href="https://blog.ahierro.es/wp-admin/post.php?post=1793&amp;action=edit" target="_blank">Arek Socha</a> en pixabay.</li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a>.</li><li><a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a>.</li><li><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a>.</li><li><a rel="noreferrer noopener" aria-label="Handlers en Apache (abre en una nueva pestaña)" href="https://httpd.apache.org/docs/2.4/es/handler.html" target="_blank">Handlers en Apache</a>.</li><li><a rel="noreferrer noopener" aria-label=" (abre en una nueva pestaña)" href="http://www.ietf.org/rfc/rfc3875" target="_blank">RFC de Common Gateway Interface</a>.</li></ul>



<p></p>La entrada <a href="https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/">PHP: mod_php vs CGI vs FastCGI vs FPM</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/php-mod_php-vs-cgi-vs-fastcgi-vs-fpm/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Habilitar módulos en Apache 2 sobre Ubuntu</title>
		<link>https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/</link>
					<comments>https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 22 Jul 2019 06:39:40 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tips & Quick Wins]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1491</guid>

					<description><![CDATA[<p>En realidad esta entrada iba a tratar sobre cómo habilitar el módulo mod_rewrite en Apache 2, cosa que no tiene mucho sentido pues ya (casi) siempre viene habilitado por defecto al instalar Apache. Así que puestos a escribir sobre habilitar módulos, y dado que es una tarea bastante habitual habitual cuando instalamos un nuevo servidor &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Habilitar módulos en Apache 2 sobre Ubuntu"</span></a></p>
La entrada <a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>En realidad esta entrada iba a tratar sobre cómo habilitar el módulo mod_rewrite en Apache 2, cosa que no tiene mucho sentido pues ya (casi) siempre viene habilitado por defecto al instalar Apache.</p>



<p>Así que puestos a escribir sobre habilitar módulos, y dado que es una tarea bastante habitual habitual cuando instalamos un nuevo servidor web, o incluso cuando instalamos algunos paquetes de software sobre un servidor web existente, decidí escribir esta entrada más generalista.</p>



<figure class="wp-block-image is-resized"><img decoding="async" src="https://blog.ahierro.es/wp-content/uploads/2019/07/habilitar.png" alt="Habilitar modulos Apache" class="wp-image-1493" width="840" height="330"/></figure>



<span id="more-1491"></span>



<p>Y es que en la actualidad, en una instalación estándar de Apache 2 sobre Ubuntu 18 se instalan más de 100 módulos, de los cuales sólo hay activos algo más de una veintena.</p>



<h2 class="wp-block-heading">Habilitar módulos</h2>



<p>Lejos quedan los tiempos en los que para habilitar módulos de Apache teníamos que editar el archivo <em>apache.conf</em>, tarea que generalmente no consistía más que en descomentar alguna línea. Hoy basta con ejecutar el comando <em>a2enmod</em> y reiniciar el servidor:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo a2enmod modulo
sudo service apache2 restart
</pre></div>


<p>Pero descubramos que hay detrás de de este comando.</p>



<p>Los módulos disponibles por Apache 2 se encuentran dentro del directorio <em>/etc/apache2/mods-available/</em>. Lo que quiere decir que si el módulo que queremos habilitar no se encuentra ahí tendremos que copiarlo  y asignarle los permisos adecuados.</p>





<p>Por otro lado, los módulos habilitados se encuentran en el directorio <em>/etc/apache2/mods-enabled/</em>. Pero en este caso en lugar de encontrar archivos, encontraremos enlaces simbólicos a los archivos situados en la carpeta <em>/etc/apache2/mods-available/</em>. Así que una alternativa al comando <em>a2enmod</em> es el comando <em>ln</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
sudo ln -s /etc/apache2/mods-available/modulo /etc/apache2/mods-enabled/modulo
sudo service apache2 restart
</pre></div>


<h2 class="wp-block-heading">Deshabilitar módulos</h2>



<p> Y para deshabilitar módulos la operación es muy similar, con la salvedad de que en lugar de utilizar el comando <em>a2enmod</em> utilizaremos el comando <em>a2dismod</em>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo a2dismod modulo
sudo service apache2 restart
</pre></div>


<p>O simplemente eliminaremos el enlace simbólico:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
sudo rm /etc/apache2/mods-enabled/modulo
sudo service apache2 restart
</pre></div>


<h2 class="wp-block-heading">Comprobaciones y logs de errores</h2>



<p>Podemos saber si un módulo se ha instalado correctamente revisando la salida de la función phpinfo() de php, en la sección apache2handler.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="943" height="334" src="https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules.png" alt="phpinfo Modulos de Apache" class="wp-image-1503" srcset="https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules.png 943w, https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules-300x106.png 300w, https://blog.ahierro.es/wp-content/uploads/2019/07/phpinfo_apache_modules-768x272.png 768w" sizes="auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></figure>



<p>Y en caso de experimentar cualquier tipo de problema, el primer lugar dónde consultar qué está ocurriendo son los logs de error de Apache 2, en el archivo  <em>/var/log/apache2/error.log</em>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cat /var/log/apache2/error.log
</pre></div>


<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li>Imagen de portada por <a href="https://pixabay.com/users/stockertui-12831137/" target="_blank" rel="noreferrer noopener" aria-label=" (abre en una nueva pestaña)">Wichan Yodsawai</a>.</li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a>.</li><li><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a>.</li><li><a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/">Habilitar módulos en Apache 2 sobre Ubuntu</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/habilitar-modulos-en-apache-2-sobre-ubuntu/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Clonar una web: los archivos</title>
		<link>https://blog.ahierro.es/clonar-una-web-los-archivos/</link>
					<comments>https://blog.ahierro.es/clonar-una-web-los-archivos/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:39:03 +0000</pubDate>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1078</guid>

					<description><![CDATA[<p>En la entrada previa hemos visto cómo clonar la base de datos como parte de nuestro objetivo de disponer de un entorno de pruebas de nuestra web en un servidor local actualizado regularmente. En esta ocasión abordamos cómo mantener una copia actualizada de los archivos de nuestro servidor para así completar el proceso. Esta es &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/clonar-una-web-los-archivos/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Clonar una web: los archivos"</span></a></p>
La entrada <a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>En la entrada previa hemos visto <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">cómo clonar la base de datos </a>como parte de nuestro objetivo de disponer de un entorno de pruebas de nuestra web en un servidor local actualizado regularmente. En esta ocasión abordamos cómo mantener  una copia actualizada de los archivos de nuestro servidor para así completar el proceso.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png" alt="Conar Web" class="wp-image-927" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-1078"></span>



<p>Esta es la tercera entrega de la serie <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a>, por lo que te recomiendo leer las entregas previas. No obstante, este artículo puede ser tratado como un artículo atómico asumiendo que perdemos ciertos matices.</p>





<p>Una de las ventajas del proceso de clonado de los archivos frente al de clonado de una base de datos es que si bien con la base de datos podíamos encontrarnos muchas limitaciones en función de los diferentes proveedores y planes de hostings, para clonar los archivos el único requisito que debemos cumplir con respecto a nuestro host remoto es tener acceso mediante ftp, algo que todos los hosting ofrecen.</p>



<h2 class="wp-block-heading">Descarga de archivos</h2>



<p>Para descargar los archivos nos serviremos del comando wget. Comenzaremos el proceso creando un script de consola y le asignándole los permisos necesarios:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
mkdir ~/scripts
vim ~/scripts/cloneWebFiles.sh
chmod 0755 ~/scripts/clonWebFiles.sh
</pre></div>


<p>Con el siguiente contenido:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
#!/bin/bash

wget -r -N -q --level=15 --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp fttp://ftp.url.com
</pre></div>


<p>Dónde:</p>



<ul class="wp-block-list"><li>-r, indica recursividad</li><li>-N, indica que descargue solo archivos nuevos y/o modificados</li><li>-q, oculta los mensajes de salida del comando</li><li>&#8211;level=15, es el numero de niveles de recursividad</li><li>&#8211;user=user, es el usuario ftp</li><li>&#8211;password=&#8217;password&#8217;, es la contraseña del ftp</li><li>&#8211;directory-prefix=~/webBackUp, es el directorio dónde copiaremos los archivos</li><li>fttp://ftp.url.com, es el ftp con el path del que queremos descargar los archivos</li></ul>



<p>Esto realizará una copia de los archivos de nuestra web en la carpeta <em>~/webBackUp/ftp.url.com</em>. Esta operación suele tardar bastante tiempo, así que para agilizarla hemos optado por descargar únicamente los archivos nuevos y/o modificados recientemente, aun así con una web de tamaño medio tardará un buen rato.</p>



<p>Debemos destacar que no descargamos los archivos directamente a nuestro entorno de pruebas, sino que los descargamos a una carpeta intermedia. Esto lo hacemos por dos motivos:</p>



<ol class="wp-block-list"><li>Modificaremos algunos archivos antes de copiarlos en nuestro entorno de pruebas.</li><li>Podemos crear un segundo script que omita la descarga y que restaure nuestra copia mucho más rápido, muy útil en caso de querer descartar los cambios realizados y comenzar desde 0.</li></ol>



<h2 class="wp-block-heading">Modificación de datos relativos al entorno</h2>



<p>Una vez hecha la descarga de los archivos deberemos modificar los que contienen datos relativos a nuestro host. En nuestro ejemplo, el archivo <em>wp-config.php </em>almacena la inforación de la conexión a la base de datos. En vuestro caso debereis localizar que archivos contienen este tipo de información antes de seguir avanzando.</p>



<p>La estrategia que seguiremos para ello sera la de realizar una copia inicial de forma manual de los archivos sensibles al entorno de pruebas. Una vez hecha actualizaremos los datos necesarios.</p>



<p>Por otro lado, automatizaremos una tarea que renombra estos archivos en la ubicación intermedia, de forma que cuando realicemos la copia al entorno de pruebas no se sobrescriban. Así que agregamos estas dos líneas a nuestro script:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
rm ~/webBackUp/ftp.url.com/w-config.php.renamed
mv ~/webBackUp/ftp.url.com/w-config.php ~/webBackUp/ftp.url.com/w-config.php.renamed
</pre></div>


<h2 class="wp-block-heading">Copia de archivos a la ubicación definitiva</h2>



<p>Ya con los archivos descargados y una vez resuelta la problemática de la información sensible al entorno copiamos los archivos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cp -r ~/webBackUp/ftp.url.com/* /var/www/targetVHost
</pre></div>


<p>Como vemos, este sistema solo copia los archivos nuevos y/o que han sufrido cambios, pero si hemos eliminado un archivo de nuestro host remoto no lo eliminará de nuestro host local. Para mi esta situación no supone un problema a día de hoy, así que simplemente no hago nada, pero siempre se puede preparar algún sistema que busque la diferencia de archivos entre la copia intermedia y el entorno de prueba y elimine los sobrantes de esta segunda ubicación. </p>



<h2 class="wp-block-heading">El script</h2>



<p>Y todo el rollazo que os he soltado se traduce básicamente en el siguiente script: </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
#!/bin/bash

wget -r -N -q --level=15 --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp fttp://ftp.url.com
rm ~/webBackUp/ftp.url.com/w-config.php.renamed
mv ~/webBackUp/ftp.url.com/w-config.php ~/webBackUp/ftp.url.com/w-config.php.renamed
cp -r ~/webBackUp fttp://ftp.url.com/* /var/www/targetVHost
</pre></div>


<h2 class="wp-block-heading">Programar la ejecución de la copia</h2>



<p>Al igual que hicimos con la clonación de la base de datos programamos la ejecución del script con Cron:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
crontab -e
</pre></div>


<p>E incluimos la siguiente línea en el archivo crontab:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
0 2 * * 5 ~/scripts/clonWebFiles.sh
</pre></div>


<p>Aunque en principio ambos script podrían ejecutarse a la misma vez, hemos sido precavidos retrasando una hora la ejecución de la copia de los archivos, de forma que se ejecute cada viernes a las 02:00 de la madrugada.</p>



<h2 class="wp-block-heading">Créditos y Referencias</h2>



<ul class="wp-block-list"><li>Articulo de la serie: <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a>.</li><li>Entrega previa de la seie: <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a>.</li><li>Imagen de portada: <a rel="noreferrer noopener" aria-label="Martin Harry (abre en una nueva pestaña)" href="https://pixabay.com/users/martinharry-1411929/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=941625" target="_blank">Martin Harry</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/clonar-una-web-los-archivos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Clonar una web: la base de datos</title>
		<link>https://blog.ahierro.es/clonar-una-web-la-base-de-datos/</link>
					<comments>https://blog.ahierro.es/clonar-una-web-la-base-de-datos/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:37:13 +0000</pubDate>
				<category><![CDATA[Bases de Datos]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=1076</guid>

					<description><![CDATA[<p>Clonar una web se divide básicamente en clonar los archivos y clonar la base de datos. Y si como en nuestro caso además queremos mantener una copia actualizada con relativa frecuencia deberemos automatizar este proceso. En esta entrada veremos cómo de sencillo es hacerlo intentando mantener la máxima compatibilidad con cualquier tipo de hosting. Esta &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Clonar una web: la base de datos"</span></a></p>
La entrada <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Clonar una web se divide básicamente en clonar los archivos y clonar la base de datos. Y si como en nuestro caso además queremos mantener una copia actualizada con relativa frecuencia deberemos automatizar este proceso. En esta entrada veremos cómo de sencillo es hacerlo intentando mantener la máxima compatibilidad con cualquier tipo de hosting.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png" alt="Conar Web" class="wp-image-927" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-1076"></span>



<p>Esta entrada pertenece a la serie <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a>. Por ese motivo te recomiendo que leas dicho artículo para darle perspectiva a este. Sea como sea, este artículo puede ser leído sin la referencia anterior, pero perderemos ciertos matices que quizás resulten interesantes. </p>



<h2 class="wp-block-heading">Backup de la base de datos remota</h2>



<p>En función del hosting que tengamos contratado dispondremos de una serie de funcionalidades. Por norma general si has contratado un VPS o servidor dedicado tendrás la posibilidad de ejecutar scripts de consola, lo cual ofrece muchas posibilidades para la tarea que queremos realizar.</p>



<p>Si por el contrario dispones de un hosting compartido no sueles tener acceso a esta opción, así que para dar respuesta a la mayor cantidad de situaciones posibles realizaremos el backup con PHP, más concretamente haremos uso de la clase <a rel="noreferrer noopener" aria-label="MySql Backup Lite  (abre en una nueva pestaña)" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">MySql Backup Lite </a>que introducimos en la entrada <a href="https://blog.ahierro.es/backup-de-base-de-datos-mysql-con-php/">Backup de base de datos MySQL con PHP</a>. Y para programar la ejecución de esta tarea nos ayudaremos de nuestro servidor local, dónde programaremos la ejecución de un script que acceda a la url que realiza el respaldo.</p>





<p>Para no extendernos demasiado y no repetirnos, no copiaremos la clase en esta entrada, puedes encontrarla en los enlaces del párrafo anterior.</p>



<p>Así que crearemos un script en PHP en nuestro servidor remoto que llamaremos <em>backUpDb.php </em>en el directorio <em>scripts</em> que tras ser ejecutado generará una copia de la base de datos en el archivo <em>backups</em>/<em>wordpressBackUp.sql</em>. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
include(&#039;MySqlBackup.php&#039;);

$arrayDbConf&#x5B;&#039;host&#039;] = &#039;dbHost&#039;;
$arrayDbConf&#x5B;&#039;user&#039;] = &#039;dbUser&#039;;
$arrayDbConf&#x5B;&#039;pass&#039;] = &#039;dbPassword&#039;;
$arrayDbConf&#x5B;&#039;name&#039;] = &#039;wordpressDbName&#039;;

try {

  $bck = new MySqlBackupLite($arrayDbConf);
  $bck-&gt;backUp();
  $bck-&gt;setFileDir(&#039;../backups/&#039;);
  $bck-&gt;setFileName(&#039;wordpressBackUp.sql&#039;);
  $bck-&gt;saveToFile();

}
catch(Exception $e) {

  die($e);

}
</pre></div>


<p>Si nuestro hosting tiene habilitada la conexión remota a la base de datos este paso podríamos ejecutarlo en el servidor local. Como no siempre tendremos esta opción, nos hemos decantado por la alternativa más universal.</p>



<p>Y puesto que en este ejemplo el backup es de una plataforma WordPress, y que por ese motivo los datos de conexión a la base de datos ya están especificados en un archivo de configuración escrito en PHP, sería más interesante hacer un <em>include</em> del archivo <em>wp-config.php </em>y obtenerlos desde ahí. De nuevo, en pro de mantener esta entrada lo más genérica posible hemos decidido hacerlo así.</p>



<h2 class="wp-block-heading">Programar la ejecución del backup de la base de datos</h2>



<p>Una vez más existen múltiples opciones para programar esta tarea, unas más elegantes que otras. En un VPS programar una tarea con Cron sería lo más lógico y eficiente, pero tal y como hemos comentado, tomaremos la opción que podemos aplicar independientemente del hosting que tengamos: utilizaremos Cron en nuestro servidor local para programar una tarea que ejecute el script de backup de base de datos que acabamos de crear en el host remoto.</p>



<p>Para ello creamos un script de consola y le asignamos los permisos necesarios:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
mkdir ~/scripts
vim ~/scripts/cloneWebDb.sh
chmod 0755 ~/scripts/clonWebDb.sh
</pre></div>


<p>Con el siguiente contenido:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
#!/bin/bash

curl -Is https://url.com/scripts/backUpDb.php
</pre></div>


<p>Y programamos la ejecución del script con Cron:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
crontab -e
</pre></div>


<p>E incluimos la siguiente línea en el archivo crontab:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
0 1 * * 5 ~/scripts/clonWebDb.sh
</pre></div>


<p>Asegurándonos de que el script se ejecuta cada Viernes a la 1 de la madrugada. Evidentemente puedes programar la periodicidad que más te convenga. Puedes visitar la entrada <a href="https://blog.ahierro.es/programar-tareas-en-ubuntu-con-cron/">Programar tareas en Ubuntu con Cron</a> para profundizar en la programación de tareas con Cron.</p>



<h2 class="wp-block-heading">Descargar el backup de la base de datos</h2>



<p>Lo siguiente es descargar el backup que acabamos de realizar. Lo haremos mediante el protocolo ftp, sirviéndonos del comando wget. Para ello agregamos una línea más a nuestro script clonWeb.sh, de forma que quede así:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
#!/bin/bash

curl -Is https://url.com/scrpts/backUpDb.php
wget -q --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp fttp://ftp.url.com/backups/wordpressBackUp.sql
</pre></div>


<p>Dónde:</p>



<ul class="wp-block-list"><li>-q, oculta los mensajes de salida del comando</li><li>&#8211;user=user, es el usuario ftp</li><li>&#8211;password=&#8217;password&#8217;, es la contraseña del ftp</li><li>&#8211;directory-prefix=~/webBackUp, es el directorio dónde copiaremos los archivos</li><li>fttp://ftp.url.com/backups/wordpressBackUp.sql, es el ftp con el path del que queremos descargar los archivos</li></ul>



<p>Con esto ya habremos descargado nuestra base de datos en el directorio <em>~/webBackUp/ftp.url.com/backups/wordpressBackUp.sql</em>. El siguiente paso será restaurarla.</p>



<h2 class="wp-block-heading">Restauración de la base de datos</h2>



<p>Y para restaurar la base de datos en nuestro servidor local la estrategia que seguiremos será:</p>



<ol class="wp-block-list"><li>Eliminamos la base de datos.</li><li>Volvemos a crear base de datos vacía.</li><li>Restauramos la base de datos desde el backup.</li></ol>



<p>Como puedes ver el proceso es bastante crítico pues elimina completamente la copia existente. Además hará que durante el tiempo que toma el proceso nuestro clon local no esté accesible. En mi caso el uso que le voy a dar es disponer de una réplica de una web en productivo en un servidor local para realizar pruebas. Para este uso el riesgo es perfectamente asumible, y en todo el tiempo que llevo utilizándola no he tenido ningún tipo de problema. Evidentemente, tú deberás evaluar si este riego y esta parada de servicio son asumibles para ti.</p>



<p>Así que crearemos un script SQL que elimine completamente la base de datos y vuelva a crearla. De nuevo lo haremos dentro de la carpeta <em>~/scripts </em>y lo llamaremos <em>dropAndCreateDb.sql</em>. El contenido será el siguiente:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
DROP DATABASE localDbName;
CREATE DATABASE localDbName;
</pre></div>


<p>Y agregamos dos líneas más a nuestro script de consola para ejecutar</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
#!/bin/bash

curl -Is https://urlToScript.com/backUpDb.php
wget -N -q --user=user --password=&#039;password&#039; --directory-prefix=~/webBackUp ftp://ftp.miweb.com/path/backups/wordpressBackUp.sql
mysql -u localDbUserName -plocalDbPassword localDbName &lt; ~/scripts/dropAndCreateDb.sql
mysql -u localDbUserName -plocalDbPassword localDbName &lt; ~/webBackUp/ftp.url.com/backups/wordpressBackUp.sql
</pre></div>


<h2 class="wp-block-heading">Actualización de los datos relativos al entorno</h2>



<p>El último paso para dar por completado el proceso de clonación de nuestra base de datos será reemplazar todos los datos datos necesarios para que nuestro clon funcione perfectamente. Este paso es el que más puede variar de un entorno a otro, a continuación os dejo un ejemplo bastante básico para un blog realizado en wordpress:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
update wp_options set option_value=&#039;http://192.168.1.10&#039; where option_name=&#039;siteurl&#039;;
update wp_options set option_value=&#039;http://192.168.1.10&#039; where option_name=&#039;home&#039;;
update wp_posts set guid=REPLACE(guid, &#039;blog.ahierro.es&#039;, &#039;192.168.1.146:8085&#039;) where guid like &#039;%blog.ahierro.es%&#039;;
</pre></div>


<p>Vosotros tendréis que localizar las tablas, campos y registro a modificar en vuestras plataformas. En el ejemplo expuesto las dos primeras líneas hacen referencia a datos de configuración y son imprescindible, pues de no actualizar estos campos nuestro wordpress local siempre redirigiría al remoto.</p>



<h2 class="wp-block-heading">Créditos y Referencias</h2>



<ul class="wp-block-list"><li>Articulo de la serie: <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a>.</li><li>Siguiente entrega de la serie: <a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</a>.</li><li>Clase  <a rel="noreferrer noopener" href="https://github.com/ahierrohdez/MySqlBackupLite" target="_blank">MySql Backup Lite</a>.</li><li>Imagen de portada: <a rel="noreferrer noopener" aria-label="Martin Harry (abre en una nueva pestaña)" href="https://pixabay.com/users/martinharry-1411929/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=941625" target="_blank">Martin Harry</a>.</li></ul>La entrada <a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/clonar-una-web-la-base-de-datos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Clonar una web en un servidor local</title>
		<link>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/</link>
					<comments>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 05:34:58 +0000</pubDate>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=900</guid>

					<description><![CDATA[<p>Independientemente de los distintos entornos de desarrollo que podamos tener configurados, en muchas ocasiones es tremendamente util disponer de una copia exacta de nuestra web de producción en otro servidor local o remoto. Y cuando hablamos de «una copia exacta», queremos decir que tanto archivos como bases de datos estén perfectamente actualizados. Esto es muy &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Clonar una web en un servidor local"</span></a></p>
La entrada <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Independientemente de los distintos <a href="https://blog.ahierro.es/entornos-en-el-desarrollo-de-software/">entornos de desarrollo</a> que podamos tener configurados, en muchas ocasiones es tremendamente util disponer de una copia exacta de nuestra web de producción en otro servidor local o remoto.</p>



<p>Y cuando hablamos de «una copia exacta», queremos decir que tanto archivos como bases de datos estén perfectamente actualizados. Esto es muy útil para realizar pruebas de todo tipo: nuevos plugins, cambios de configuración, revisión de actualizaciones, etc.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="438" src="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png" alt="Conar Web" class="wp-image-927" srcset="https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web.png 650w, https://blog.ahierro.es/wp-content/uploads/2019/05/clonar_web-300x202.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-900"></span>



<p>Realizar esta tarea manualmente es tedioso, aburrido y consume mucho tiempo, eso sin contar que es probable que cuando nos propongamos realizar nuestras pruebas este entorno esté desactualizado, alterado por las últimas pruebas realizadas, o lo que es aún peor, no esté disponible. Así que una buena idea es automatizar esta tarea y programar su ejecución con la periodicidad que nos interese.</p>



<h2 class="wp-block-heading">Algunos aspectos relativos al clonado</h2>



<h3 class="wp-block-heading">Resumen del proceso</h3>



<p>Es buena idea tener una visión general del proceso antes de adentrarnos en él. Lo que vamos a hacer básicamente es un proceso ETL  (Extract, Transform, Load) manual.</p>



<p>Como parte del proceso de extracción realizaremos una copia de seguridad de la base de datos y la descargaremos a una ubicación intermedia. Haremos lo mismo con los archivos del servidor.</p>





<p>Una vez tenemos todo lo necesario en nuestro servidor local, modificamos algunos datos como son archivos de configuración o los registros en la base de datos relativos al entorno.</p>



<p>Finalmente restauraremos la base de datos y sobrescribiremos los archivos de nuestro servidor local.</p>



<h3 class="wp-block-heading">Local versus Remoto</h3>



<p>A pesar de que cada una de las tareas que realizaremos no son complicadas por si mismas, alternaremos de host continuamente y eso puede generar alguna confusión, así que para seguir los pasos indicados sin error deberemos estar muy  atentos al host en el que se realizan las distintas acciones. Identificaremos los hosts como «remoto», el servidor de producción que queremos clonar, y «local» el servidor de pruebas dónde queremos tener la copia.</p>



<p>Es importante que las versiones de <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">LAMP (Linux, Apache, PHP y MySQL) </a>sean lo más similar posible, de este modo es posible que nos ahorraremos algunos quebraderos de cabeza. Además, es recomendable dedicar un <a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">virtual host de Apache </a>para este entorno en nuestro servidor local.</p>



<h3 class="wp-block-heading">Ejemplo sobre WordPress</h3>



<p>Y ya que estas líneas que lees están escritas sobre WordPress, utilizaremos esta plataforma como ejemplo para realizar el clonado. Esto quiere decir que por norma general, si queréis clonar otra plataforma, las mayores diferencias las encontraremos en los los registros de la base de datos y los archivos de configuración referentes al entorno.</p>



<h3 class="wp-block-heading">Periodicidad</h3>



<p>Como hemos dicho queremos automatizar el clonado de nuestra web para tener nuestra réplica preparada y actualizada en todo momento. Podemos establecer la periodicidad que más nos convenga, personalmente estoy cómodo con una semana por dos motivos:</p>



<ol class="wp-block-list"><li>En una semana no suelen producirse muchos cambios en el blog.</li><li>Algunas pruebas se extienden durante varios días, y una restauración diaria las sobrescribiría.</li></ol>



<p>Además, siempre estamos a tiempo de lanzar una actualización manual en caso de ser necesario con la simple ejecución de un script. Si no tienes una web muy grande el proceso será relativamente rápido.</p>



<h2 class="wp-block-heading">Requisitos hardware</h2>



<p>En cuanto a los requisitos de hardware puedes estar tranquilo, pues no necesitas un gran servidor para implementar este sistema. Un ejemplo muy claro de ello es que para este blog lo tengo implementado con una humilde Raspberry Pi. Por si te interesa, aquí te dejo un enlace en el que puedes ver cómo de sencillo es <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">montar un servidor web Apache sobre una Raspberry Pi</a>.</p>



<h2 class="wp-block-heading">Clonando nuestra web: el proceso</h2>



<p>Llegados a este punto creo que al igual que yo ya tendréis ganas de poneros manos a la obra, así que no me enrollo más y vamos al lío.</p>



<p>Y puesto que esto se ha alargado un poco más de la cuenta, hemos dividido este artículo en varias entregas para que sea más fácil de seguir:</p>



<ol class="wp-block-list"><li>Clonar una web en un servidor local (es decir, esta entrada).</li><li><a href="https://blog.ahierro.es/clonar-una-web-la-base-de-datos/">Clonar una web: la base de datos</a>.</li><li><a href="https://blog.ahierro.es/clonar-una-web-los-archivos/">Clonar una web: los archivos</a>.</li></ol>



<h2 class="wp-block-heading">Créditos y referencias</h2>



<ul class="wp-block-list"><li>Imagen de portada: <a rel="noreferrer noopener" href="https://pixabay.com/users/martinharry-1411929/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=941625" target="_blank">Martin Harry</a>.</li></ul>





<p></p>La entrada <a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como configurar Virtual Hosts en Apache 2 y Ubuntu</title>
		<link>https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/</link>
					<comments>https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 24 Dec 2018 06:30:33 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://www.ahierro.es/?p=288</guid>

					<description><![CDATA[<p>Los más habitual en un entorno de desarrollo, de pruebas o de pre-producción es que tengamos varios proyectos conviviendo en paralelo. Y como ser organizado no es solo una virtud, sino que es una cualidad imprescindible para evitar el caos de cara al futuro, los hosts virtuales de Apache 2 son una buena forma de &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Como configurar Virtual Hosts en Apache 2 y Ubuntu"</span></a></p>
La entrada <a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Los más habitual en un entorno de desarrollo, de pruebas o de pre-producción es que tengamos varios proyectos conviviendo en paralelo. Y como ser organizado no es solo una virtud, sino que es una cualidad imprescindible para evitar el caos de cara al futuro, los hosts virtuales de Apache 2 son una buena forma de lograrlo.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/12/apache_virtual_hosts.png" alt="Apache Virtual Hosts" class="wp-image-303" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/apache_virtual_hosts.png 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/apache_virtual_hosts-300x168.png 300w, https://blog.ahierro.es/wp-content/uploads/2018/12/apache_virtual_hosts-267x150.png 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-288"></span>



<p>Los ejemplos de este documento han sido probados tanto sobre Ubuntu Mate 16.0.4.2 y Apache 2.4.18 como sobre XUbuntu 18.04 con la versión 2.4.29 de Apache, aunque funcionarán sobre la mayoría de distribuciones Linux con la versión 2.4 de Apache.</p>



<p>Para el resto del artículo, asumiremos que la ip de la máquina dónde estamos configurando los host virtuales es 192.168.1.10.</p>



<h3 class="wp-block-heading">¿Qué es un virtual host en Apache 2?</h3>



<p>Virtual host es la herramienta que Apache pone a nuestra disposición para poder publicar más de una página web en un mismo servidor Apache, y que además,&nbsp; nos permite mantener configuraciones diferentes para cada host virtual.</p>





<p>Al realizar una petición al servidor web, Apache puede identificar a que site (host virtual) queremos acceden en función de tres variables relacionadas con la solicitud realuzada al servidor:</p>



<ol class="wp-block-list"><li>La IP</li><li>El Host Name</li><li>El puerto</li></ol>



<p>En este artículo distinguiremos los host virtuales por el puerto, pues es lo que utilizo habitualmente en mi entorno de desarrollo por una simple cuestión de comodidad.</p>



<h3 class="wp-block-heading">Nociones de configuración</h3>



<p>Toda la configuración de Apache 2 se encuentra bajo la carpeta <em>/var/apache2</em>. Los archivos de configuración para los virtual hosts se encuentran dentro de dos carpetas en particular:</p>



<ol class="wp-block-list"><li><em>/var/apache2/sites-available</em>. En esta carpeta se encuentran todos los archivos de configuración de los hosts virtuales, cada host se corresponde con un archivo.</li><li><em>/var/apache2/sites-enabled</em>. En esta carpeta se crearán enlaces simbólicos a los archivos de la carpeta sites-available para los host que queramos activar en cada momento.</li></ol>



<p>Con la instalación de Apache, se creará por defecto, el archivo <em>/etc/apache2/sites-available/000-default.conf</em> y su correspondiente enlace simbólico en la carpeta <em>sites-enabled</em> que se encarga de configurar el host virtual por defecto al que accedemos tras instalar Apache.</p>



<h3 class="wp-block-heading">Cómo crear un virtual host</h3>



<p>Crear host virtuales es una tarea relativamente habitual, así que los señores desarrolladores de Apache nos lo han puesto bastante sencillo.</p>



<p>A continuación crearemos un host virtual para alojar un entorno de pruebas de este blog. Para entender mejor el proceso, a pesar de que es sencillo, lo dividiremos en cuatro pasos:</p>



<h4 class="wp-block-heading">Paso 1: Creamos el directorio que alojará nuestra web</h4>



<p>Lo primero será crear el directorio dónde alojaremos los archivos que posteriormente serviremos.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cd /var/www
sudo mkdir ahierro.es
cd ahierro.es
sudo mkdir public
</pre></div>


<p>La carpeta que serviremos será <em>public</em>, es buena idea guardarse un nivel de directorio para archivos relacionados con el proyecto que no deben ser accesibles desde una url en el navegador. Esto es bastante habitual en muchas aplicaciones y frameworks.</p>



<p>En este paso del proceso es importante dejar correctamente configurados los permisos de acceso a los archivos y carpetas de nuestro host virtual. Para ello os dejo un enlace al artículo <a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a> por si queréis echarle un vistazo.</p>



<h4 class="wp-block-heading">Paso 2: Creamos el archivo de configuración del nuevo host virtual</h4>



<p>Ahora crearemos el archivo de configuración en <em>/etc/apache2/sites-available</em>, lo más sencillo es hacerlo desde otro que ya exista. Es muy importante que lleve la extensión .conf o el comando a2ensite no funcionará más adelante:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
cd /etc/apache2/sites-available
sudo cp 000-default.conf ahierro.es.conf
</pre></div>


<p>Lo editamos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo vim ahierro.es.conf
</pre></div>


<p>Inicialmente tenemos algo así:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
&lt;VirtualHost *:80&gt;
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request&#039;s Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with &quot;a2disconf&quot;.
#Include conf-available/serve-cgi-bin.conf
&lt;/VirtualHost&gt;
</pre></div>


<p>Y tras modificarlo debe quedar así:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
&lt;VirtualHost *:80&gt;
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request&#039;s Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/ahierro.es/public

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with &quot;a2disconf&quot;.
#Include conf-available/serve-cgi-bin.conf

&lt;Directory /var/www/ahierro.es/public&gt;
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
&lt;/Directory&gt;

&lt;/VirtualHost&gt;
</pre></div>


<p>Como podemos ver en la línea 1 hemos cambiado :80 por :8085, con lo que estamos indicando que a este virtualhost accederemos mediante este puerto. Personalmente suelo comenzar con el puerto 8080, en este ejemplo he especificado el 8085 porque ya tengo otros cinco host virtuales.</p>





<p>En la línea 12 lo único que hemos hecho es actualizar la referencia al directorio raíz para asegurarnos que apunta al lugar adecuado.</p>



<p>Y por último hemos añadido una nueva sección a partir de la línea 30 con unas directrices básicas entre las que hemos habilitado el módulo mod_rewrite, necesario para la re-escritura de urls.</p>



<h4 class="wp-block-heading">Paso 3: Abrimos el puerto adecuado en Apache</h4>



<p>Por defecto Apache solo atiende solicitudes por el puerto 80. Para conseguir que también atienda las que llegan por el puerto 8085, que es el que hemos indicado en nuestro fichero de configuración del virtual host, debemos editar el archivo <em>/etc/apache2/ports.conf</em>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo vim /etc/apache2/ports.conf
</pre></div>


<p>El contenido del fichero es algo así:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80
Listen 8085

&lt;IfModule ssl_module&gt;
Listen 443
&lt;/IfModule&gt;

&lt;IfModule mod_gnutls&gt;
Listen 443
&lt;/IfModule&gt;
</pre></div>


<p>Vemos que la&nbsp; línea 5 hace referencia al puerto 80, nosotros hemos añadido una línea más, la 6, indicándole que escuche también el puerto 8085.</p>



<h4 class="wp-block-heading">Paso 4: Habilitamos el nuevo virtualhost</h4>



<p>Si os habéis fijado hablamos de los directorios <em>sites-available</em> y <em>sites-enabled</em>, pero solo hemos trabajado con el primero. Para crear el enlace simbólico lo haremos con el comando a2ensite:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo a2ensite ahierro.es.conf
</pre></div>


<p>Y por si te lo estás preguntando, si, un ln o un cp servirían de igual manera. Y ahora que el enlace simbólico ya se encuentra en el directorio <em>sites-enabled</em> solo nos queda reiniciar apache:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo service apache2 restart
</pre></div>


<h4 class="wp-block-heading">Paso 5: Comprobamos que todo funcione correctamente</h4>



<p>Podemos comprobar que todo ha salido bien con dos sencillos pasos</p>



<ol class="wp-block-list"><li>Creamos un archivo <em>index.html</em> y lo guardamos en el directorio público del host virtual que acabamos de crear, en este caso <em>/var/www/ahierro.es/public</em>.</li><li>Accedemos a la ip del servidor seguida de dos puntos y el puerto: <em>http://192.168.1.10:8085/index.html.</em></li></ol>



<p>Si vemos el contenido del archivo index.html es que todo ha salido bien, en caso contrario deberemos buscar el problema en función del mensaje de error obtenido.</p>



<h3 class="wp-block-heading">Conclusión</h3>



<p>Una forma sencilla de organizar nuestros proyectos siempre que no sean demasiados.</p>



<p>Personalmente, en el virtual host por defecto (puerto 80),&nbsp; creo un sencillo fichero con enlaces a todos los hosts virtuales y otros accesos directos que me interesa tener a mano como pueden ser phpmyadmin o phpinfo. Esto suele ahorrarme unos minutos preciados minutos cada día.</p>



<p>Y como siempre me gustaría saber tú opinión,&nbsp; ¿utilizas los virtual host? ¿los identificas por puerto? ¿organizas tus proyectos de otra forma? Deja un comentario y aprendamos juntos.</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li><a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a></li><li><a href="https://blog.ahierro.es/ejecutar-linux-en-windows-10-con-wsl/">Ejecutar Linux en Windows 10 con WSL</a></li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a></li><li><a href="https://blog.ahierro.es/clonar-una-web-en-un-servidor-local/">Clonar una web en un servidor local</a></li></ul>La entrada <a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Archivos y permisos de usuario en Apache 2 y Linux</title>
		<link>https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/</link>
					<comments>https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/#comments</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Thu, 20 Dec 2018 06:30:23 +0000</pubDate>
				<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[Tips & Quick Wins]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[linux]]></category>
		<guid isPermaLink="false">https://blog.ahierro.es/?p=328</guid>

					<description><![CDATA[<p>Asegurar que los permisos de usuario de los archivos y carpetas de nuestro servidor web están correctamente asignados es una práctica que nos ahorrará problemas en el futuro. En esta mini entrada veremos cómo hacerlo. Para este artículo asumiremos que disponemos de varios host virtuales y que vamos a asignar los permisos adecuados solo a &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Archivos y permisos de usuario en Apache 2 y Linux"</span></a></p>
La entrada <a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Asegurar que los permisos de usuario de los archivos y carpetas de nuestro servidor web están correctamente asignados es una práctica que nos ahorrará problemas en el futuro. En esta mini entrada veremos cómo hacerlo.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://blog.ahierro.es/wp-content/uploads/2018/12/apache_permisos_ficheros.png" alt="" class="wp-image-335" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/apache_permisos_ficheros.png 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/apache_permisos_ficheros-300x168.png 300w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-328"></span>



<p>Para este artículo asumiremos que disponemos de varios host virtuales y que vamos a asignar los permisos adecuados solo a uno de ellos. La carpeta raíz es <em>/var/www/html</em> y la pública <em>/var/www/html/public</em>.</p>





<p>En caso de que tengas un servidor Apache 2 recién instalado lo habitual es que las carpetas mencionadas en el párrafo anterior sean <em>/var/www</em> y <em>/var/www/public</em> respectivamente.</p>



<p>Por último antes de entrar en materia indicar que también asumiremos que el usuario con el que trabajamos es «usuario».</p>



<h3 class="wp-block-heading">Asignamos los permisos</h3>



<p>Comenzaremos asegurándonos de que <em>/var/www/html</em> pertenezca al grupo www-data:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo chgrp www-data /var/www/html
</pre></div>


<p>Nos aseguramos también que nuestro usuario pertenezca al mismo grupo:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo usermod -a -G www-data usuario
</pre></div>


<p>Asignamos los permisos adecuados:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo chmod -R 775 /var/www/html
sudo chmod -R g+s /var/www/html
</pre></div>


<p>Y por último nos aseguramos de ser los propietarios del directorio:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo chown -R usuario /var/www/html
</pre></div>


<p>En este punto ya tenemos los permisos de usuario correctamente configurados, pero como siempre es bueno comprobarlo.</p>



<h3 class="wp-block-heading">Comprobamos que todo sea correcto</h3>



<p>Para comprobar que todo haya salidos bien accedemos a <em>/var/www</em> y listamos los archivos con detalle:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
ls -l
</pre></div>


<p>Deberíamos tener algo similar a lo siguiente:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
total 2
drwxrwxr-x 4 usuario www-data 4096 dic 19 18:01 html
drwxrwxr-x 8 usuario www-data 4096 dic 19 18:07 vhost1
</pre></div>


<p>Los archivos y/o carpetas de este directorio pueden cambiar en función de lo que tengas en <em>/var/www</em>, pero al margen de eso podemos ver que tanto el usuario, el grupo y los perisos son correctos.</p>



<p>Si entramos dentro de <em>/var/www/html</em> y hacemos lo mismo el resultado debe ser similar.</p>





<h3 class="wp-block-heading">Conclusión</h3>



<p>Una tarea sencilla y rápida que nos ahorrará posibles complicaciones futuras. Y como siempre me gusta saber tu opinión, ¿qué haces distinto al establecer los permisos? ¿Te ha servido&nbsp; este artículo para solucionar algún problema de permisos? ¿Cuál es tu experiencia en este tema?</p>



<h2 class="wp-block-heading">Créditos, referencias y artículos relacionados</h2>



<ul class="wp-block-list"><li><a href="https://blog.ahierro.es/como-configurar-virtual-hosts-en-apache-y-ubuntu/">Como configurar Virtual Hosts en Apache 2 y Ubuntu</a></li><li><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor web en Raspberry Pi y Ubuntu Mate</a></li><li><a href="https://blog.ahierro.es/debugar-php-netbeans-xcode/">Debugar PHP con NetBeans y XCode</a> </li></ul>



<p></p>La entrada <a href="https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/">Archivos y permisos de usuario en Apache 2 y Linux</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/archivos-y-permisos-de-usuario-en-apache-y-linux/feed/</wfw:commentRss>
			<slash:comments>21</slash:comments>
		
		
			</item>
		<item>
		<title>Servidor Web en Raspberry PI y Ubuntu Mate</title>
		<link>https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/</link>
					<comments>https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/#respond</comments>
		
		<dc:creator><![CDATA[Andres]]></dc:creator>
		<pubDate>Mon, 10 Dec 2018 06:15:41 +0000</pubDate>
				<category><![CDATA[Servicios]]></category>
		<category><![CDATA[Sistemas]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[mariadb]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpmyadmin]]></category>
		<category><![CDATA[raspberry pi]]></category>
		<category><![CDATA[servidor]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://www.ahierro.es/?p=148</guid>

					<description><![CDATA[<p>Un servidor web Apache 2 corriendo sobre Linux no requiere muchos recursos de hardware. Así que si queremos disponer de un servidor casero dónde poder trastear y realizar pruebas o desarrollar ese pequeño proyecto que siempre nos ronda en la cabeza, una Raspberry Pi es una buena opción. Esta entrada forma parte de la serie &#8230; </p>
<p class="link-more"><a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/" class="more-link">Continuar leyendo<span class="screen-reader-text"> "Servidor Web en Raspberry PI y Ubuntu Mate"</span></a></p>
La entrada <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></description>
										<content:encoded><![CDATA[<p>Un servidor web Apache 2 corriendo sobre Linux no requiere muchos recursos de hardware. Así que si queremos disponer de un servidor casero dónde poder trastear y realizar pruebas o desarrollar ese pequeño proyecto que siempre nos ronda en la cabeza, una Raspberry Pi es una buena opción.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/12/servidor_web.jpg" alt="Servidor web" class="wp-image-251" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/servidor_web.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/servidor_web-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/12/servidor_web-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<span id="more-148"></span>



<p>Esta entrada forma parte de la serie <a href="https://www.ahierro.es/raspberry-pi-como-herramienta-de-apoyo-para-el-desarrollo-web/">Raspberry Pi como herramienta de apoyo al desarrollo web</a>, y está pensada para un servidor de uso personal. De cualquier manera, el contenido de esta guía es perfectamente aplicable a cualquier distribución de Linux basada en Ubuntu y a Raspbian.</p>





<p>Esta documento también puede utilizarse para la configuración de un servidor de una pequeña organización, en cuyo caso sería necesario tener en cuenta algunas consideraciones:</p>



<ol class="wp-block-list"><li>Una Rasperri Pi no es el hardware más adecuado. Debería instalarse sobre un hardware fiable y acordemente dimensionado a las necesidades del uso que se le dará.</li><li>Además del contenido de este artículo, deberían realizarse una serie de configuraciones extra enfocadas en la seguridad que no entran en el ámbito ni el alcance de este documento.</li><li>Este artículo esta pensado para la instalación y configuración de un servidor web en una red local, en caso de que el servidor sea accesible directamente desde internet, el punto anterior cobra mayor importancia, además de requerir algunos ajustes más.</li></ol>



<p>Una vez que todos tenemos claro el ámbito y el alcance, vamos al lío.</p>



<h3 class="wp-block-heading">Instalamos Apache 2</h3>



<p>Este paso será muy sencillo, actualizamos los repositorios e instalamos Apache 2:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-get update
sudo apt-get install apache2
</pre></div>


<p>Si todo ha ido bien ya podremos acceder al al servidor web desde cualquier pc conectado a la red local con tan solo introducir la ip en el navegador.</p>



<p>Para el resto de la entrada asumiremos que nuestra Raspberry está configurada con la IP estática 192.168.1.10.</p>



<p>Así que si introducimos en el navegador la dirección http://192.168.1.10&nbsp; veremos la página por defecto de Apache 2:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/12/apache2_default_page.jpg" alt="Apache 2 página por defecto" class="wp-image-256" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/apache2_default_page.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/apache2_default_page-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/12/apache2_default_page-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<p>Un aspecto muy importante en la configuración de Apache es asignar los permisos adecuados a la carpeta del servidor. Podemos pasar sin hacerlo pero más pronto que tarde nos encontraremos con problemas relacionados con permisos.</p>





<p>Comenzaremos asegurándonos de que /var/www/html pertenezca al grupo www-data y que tiene los permisos adecuados:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo chgrp www-data /var/www/html
sudo chmod 775 /var/www/html
sudo chmod g+s /var/www/html
</pre></div>


<p>Agregamos nuestro usuario al grupo www-data:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo usermod -a -G www-data usuario
</pre></div>


<p>Y por último nos aseguramos de ser los propietarios del directorio</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo chown usuario /var/www/html
</pre></div>


<p>Con esto hemos concluido la instalación de Apache.</p>



<h3 class="wp-block-heading">Instalamos PHP</h3>



<p>Instalamos PHP:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-get install php7.0
</pre></div>


<p>Es posible que en función de la distribución que utilicemos en lugar del paquete php7.0 encontremos otra versión. Podemos comprobarlo fácilmente con la siguiente orden:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-cache search php
</pre></div>


<p>Y si por cualquier motivo necesitamos una versión específica de php, deberemos incluir el repositorio ondrej/php como hacemos a continuación:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update
</pre></div>


<p>En este caso he incluido la opción -y porque al intentar agregar el repositorio me mostraba un warning relacionado con la codificación de caracteres de los repositorios.</p>



<p>Acto seguido instalar la versión de php que necesitemos, en mi caso voy a instalar la versión 7.3:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-get install php7.3
</pre></div>


<p>Tras reiniciar Apache ya habremos acabado:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo service apache2 restart
</pre></div>


<p>Para comprobar que php está correctamente instalado crearemos el archivo&nbsp; /var/www/html/phpinfo.php con el siguiente contenido:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php php phpinfo(); ?&gt;
</pre></div>


<p>Si todo es correcto al acceder a http://192.168.1.10/phpinfo.php veremos algo así:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="650" height="365" src="https://www.ahierro.es/wp-content/uploads/2018/12/php_info_php73.jpg" alt="phpinfo php 7.3" class="wp-image-279" srcset="https://blog.ahierro.es/wp-content/uploads/2018/12/php_info_php73.jpg 650w, https://blog.ahierro.es/wp-content/uploads/2018/12/php_info_php73-300x168.jpg 300w, https://blog.ahierro.es/wp-content/uploads/2018/12/php_info_php73-267x150.jpg 267w" sizes="auto, (max-width: 650px) 100vw, 650px" /></figure>



<h3 class="wp-block-heading">Instalamos y configuramos MariaDB</h3>



<p>Una vez que php está instalado, continuamos con la base de datos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-get install mariadb-server
</pre></div>


<p>Durante el proceso de instalación deberemos responder responder a algunas preguntas que sin complicación alguna.</p>



<p>El primer paso tras la instalación será configurar MariaDB para que podamos acceder remotamente, pues por defecto solo acepta conexiones desde el propio host:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
</pre></div>


<p>Esfe archivo puede cambiar en función de tu distribución y de la versión de MariaDB. En ocasiones puedes encontrarlo en /etc/mysql/my.cnf, en /etc/mysql/mysql.conf.d/mysqld.cnf, etc.</p>



<p>Localizamos la siguiente línea:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
bind-address  = 127.0.0.1
</pre></div>


<p>La sustituimos por:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
bind-address  = 0.0.0.0
</pre></div>


<p>Y reiniciamos la base de datos:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo service mysql restart
</pre></div>


<p>Con esto hemos habilitado el acceso remoto a MariaDB. Ahora crearemos un nuevo usuario para evitar trabajar con root. Para ello accedemos a la consola de MariaDB:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo mysql -u root -p
</pre></div>


<p>Una vez en la consola de MariaDB creamos nuestro usuario:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
CREATE USER &#039;usuario&#039; IDENTIFIED BY &#039;contraseña&#039;;
</pre></div>


<p>Y concedemos acceso remoto y a todas las bases de datos al usuario que acabamos de crear:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
GRANT USAGE ON *.* TO &#039;usuario&#039;@&#039;%&#039; IDENTIFIED BY &#039;contraseña&#039;;
</pre></div>


<p>En este punto es buena idea comprobar que todo ha salido bien. Podemos hacerlo abriendo una conexión al servidor de bases desde nuestro equipo de trabajo con alguna herramienta como MySQL Workbench.</p>



<h3 class="wp-block-heading">Instalamos phpMyAdmin</h3>



<p>Esta es una herramienta que siempre me gusta instalar a pesar de que en la mayoría de situaciones trabajo con MySql Workbenck. Para instalar basta con:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; gutter: false; title: ; notranslate">
sudo apt-get install phpmyadmin
</pre></div>


<p>Y una vez instalado podremos acceder a ella mediante <em>http://192.168.1.10/phpmyadmin</em>.</p>





<h3 class="wp-block-heading">Conclusión</h3>



<p>Ya tenemos un servidor web completamente funcional corriendo sobre nuestra Rasperri PI, sencillo, económico y funcional. Ahora solo hay que usarlo.</p>



<p>¿Y tú?, ¿Crees que necesitamos aplicar alguna otra configuración? ¿Haces algo distinto? ¿Echas en falta algún paso? o simplemente ¿te ha servido de ayuda? Comparte tu experiencia y aprendamos todos.</p>La entrada <a href="https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/">Servidor Web en Raspberry PI y Ubuntu Mate</a> apareció primero en <a href="https://blog.ahierro.es">blog.ahierro.es, programación, internet, tecnología y otras historias</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.ahierro.es/servidor-web-en-raspberry-pi-y-ubuntu-mate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
