{"id":167,"date":"2022-05-11T06:42:24","date_gmt":"2022-05-11T06:42:24","guid":{"rendered":"https:\/\/collageweb.es\/portal\/?p=167"},"modified":"2022-05-11T06:43:03","modified_gmt":"2022-05-11T06:43:03","slug":"como-instalar-la-pila-linux-apache-mysql-y-php-lamp-en-ubuntu-20-04","status":"publish","type":"post","link":"https:\/\/collageweb.es\/portal\/como-instalar-la-pila-linux-apache-mysql-y-php-lamp-en-ubuntu-20-04\/","title":{"rendered":"C\u00f3mo instalar la pila Linux, Apache, MySQL y PHP (LAMP) en Ubuntu 20.04"},"content":{"rendered":"\n<h3 id=\"introduccion\">Introducci\u00f3n<\/h3>\n\n\n\n<p>Una pila \u201cLAMP\u201d es un conjunto de aplicaciones de software de c\u00f3digo abierto que se suelen instalar juntas para que un servidor pueda alojar aplicaciones y sitios web din\u00e1micos escritos en PHP. Este t\u00e9rmino es en realidad un acr\u00f3nimo que representa al sistema operativo <strong>L<\/strong>inux, con el servidor web <strong>A<\/strong>pache. Los datos del sitio se almacenan en una base de datos <strong>M<\/strong>ySQL y el contenido din\u00e1mico se procesa mediante <strong>P<\/strong>HP.<\/p>\n\n\n\n<p>En esta gu\u00eda, instalaremos una pila LAMP en un servidor Ubuntu 20.04.<\/p>\n\n\n\n<h2 id=\"requisitos-previos\">Requisitos previos<\/h2>\n\n\n\n<p>Para completar este tutorial, deber\u00e1 disponer de un servidor de Ubuntu 20.04 con una cuenta <code>sudo<\/code> non-root user y un firewall b\u00e1sico. Puede realizar esta configuraci\u00f3n siguiendo nuestra <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/initial-server-setup-with-ubuntu-20-04\">Gu\u00eda de configuraci\u00f3n inicial de servidores para Ubuntu 20.04<\/a>.<\/p>\n\n\n\n<h2 id=\"paso-1-instalar-apache-y-actualizar-el-firewall\">Paso 1: Instalar Apache y actualizar el firewall<\/h2>\n\n\n\n<p>El servidor web Apache est\u00e1 entre los m\u00e1s populares del mundo. Est\u00e1 bien documentado, tiene una comunidad de usuarios activa y ha sido muy utilizado durante gran parte de la historia de la web, por lo que es una excelente opci\u00f3n predeterminada para alojar sitios web.<\/p>\n\n\n\n<p>Instale Apache usando el administrador de paquetes de Ubuntu, <code>apt<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install apache2\n\n<\/code><\/pre>\n\n\n\n<p>Si es la primera vez que utiliza <code>sudo<\/code> en esta sesi\u00f3n, se le pedir\u00e1 que proporcione su contrase\u00f1a de usuario para confirmar que tenga los privilegios adecuados para administrar los paquetes del sistema con <code>apt<\/code>.&nbsp; Tambi\u00e9n se le solicitar\u00e1 que confirme la instalaci\u00f3n de Apache al pulsar <code>Y<\/code> y <code>ENTER<\/code>.<\/p>\n\n\n\n<p>Una vez que la instalaci\u00f3n se complete, deber\u00e1 ajustar la configuraci\u00f3n de su firewall para permitir tr\u00e1fico HTTP y HTTPS. UFW tiene diferentes perfiles de aplicaciones que puede aprovechar para hacerlo. Para enumerar todos los perfiles de aplicaciones de UFW disponibles, puede ejecutar lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw app list\n\n<\/code><\/pre>\n\n\n\n<p>Ver\u00e1 un resultado como este:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OutputAvailable applications:\n  <mark>Apache<\/mark>\n  <mark>Apache Full<\/mark>\n  <mark>Apache Secure<\/mark>\n  OpenSSH\n<\/code><\/pre>\n\n\n\n<p>A continuaci\u00f3n, explicamos cada uno de estos perfiles:<\/p>\n\n\n\n<ul><li><strong>Apache<\/strong>: este perfil abre solo el puerto <code>80<\/code> (tr\u00e1fico web normal no cifrado).<\/li><li><strong>Apache Full<\/strong>: este perfil abre los puertos <code>80<\/code> (tr\u00e1fico web normal no cifrado) y <code>443<\/code> (tr\u00e1fico TLS\/SSL cifrado).<\/li><li><strong>Apache Secure<\/strong>: este perfil abre solo el puerto <code>443<\/code> (tr\u00e1fico TLS\/SSL cifrado).<\/li><\/ul>\n\n\n\n<p>Por ahora, es mejor permitir conexiones \u00fanicamente en el puerto <code>80<\/code>, ya que se trata de una instalaci\u00f3n nueva de Apache y todav\u00eda no tiene un certificado TLS\/SSL configurado para permitir tr\u00e1fico HTTPS en su servidor.<\/p>\n\n\n\n<p>Para permitir tr\u00e1fico \u00fanicamente en el puerto <code>80<\/code> utilice el perfil <code>Apache<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw allow in \"Apache\"\n\n<\/code><\/pre>\n\n\n\n<p>Puede verificar el cambio con lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ufw status\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>OutputStatus: active\n\nTo                         Action      From\n--                         ------      ----\nOpenSSH                    ALLOW       Anywhere                                \nApache                     ALLOW       Anywhere                  \nOpenSSH (v6)               ALLOW       Anywhere (v6)                    \nApache (v6)                ALLOW       Anywhere (v6)     \n\n<\/code><\/pre>\n\n\n\n<p>Ahora, se permite tr\u00e1fico en el puerto <code>80<\/code> a trav\u00e9s del firewall.<\/p>\n\n\n\n<p>Puede realizar una verificaci\u00f3n r\u00e1pida para comprobar que todo se haya realizado seg\u00fan lo previsto dirigi\u00e9ndose a la direcci\u00f3n IP p\u00fablica de su servidor en su navegador web (consulte la nota de la siguiente secci\u00f3n para saber cu\u00e1l es su direcci\u00f3n IP p\u00fablica si no dispone de esta informaci\u00f3n):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/<mark>your_server_ip<\/mark>\n<\/code><\/pre>\n\n\n\n<p>Ver\u00e1 la p\u00e1gina web predeterminada de Apache para Ubuntu 20.04, que se encuentra all\u00ed para fines informativos y de prueba. Deber\u00eda tener un aspecto similar a este:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/assets.digitalocean.com\/articles\/how-to-install-lamp-ubuntu-18\/small_apache_default_1804.png\" alt=\"P\u00e1gina predeterminada de Apache para Ubuntu 20.04\"\/><\/figure>\n\n\n\n<p>Si ve esta p\u00e1gina, su servidor web estar\u00e1 correctamente instalado y el acceso a \u00e9l ser\u00e1 posible a trav\u00e9s de su firewall.<\/p>\n\n\n\n<h3 id=\"como-averiguar-la-direccion-ip-publica-de-su-servidor\">C\u00f3mo averiguar la direcci\u00f3n IP p\u00fablica de su servidor<\/h3>\n\n\n\n<p>Si no conoce la direcci\u00f3n IP p\u00fablica de su servidor, hay varias formas de encontrarla. Por lo general, es la direcci\u00f3n que utiliza para establecer conexi\u00f3n con su servidor a trav\u00e9s de SSH.<\/p>\n\n\n\n<p>Existen varias formas de hacerlo desde la l\u00ednea de comandos. Primero, podr\u00eda usar las herramientas de <code>iproute2<\/code> para obtener su direcci\u00f3n IP escribiendo esto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's\/\\\/.*$\/\/'\n\n<\/code><\/pre>\n\n\n\n<p>Esto nos brindar\u00e1 dos o tres l\u00edneas. Todas estas direcciones son correctas, pero su computadora puede usar una de ellas. Por ello, no dude en probarlas todas.<\/p>\n\n\n\n<p>Un m\u00e9todo alternativo consiste en usar la utilidad <code>curl<\/code> para contactar a una parte externa a fin de que le indique <em>su<\/em> evaluaci\u00f3n del servidor. Esto se hace solicitando a un servidor espec\u00edfico su direcci\u00f3n IP:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl http:\/\/icanhazip.com\n\n<\/code><\/pre>\n\n\n\n<p>Independientemente del m\u00e9todo que utilice para obtener su direcci\u00f3n IP, escr\u00edbala en la barra de direcciones de su navegador web para ver la p\u00e1gina predeterminada de Apache.<\/p>\n\n\n\n<h2 id=\"paso-2-instalar-mysql\">Paso 2: Instalar MySQL<\/h2>\n\n\n\n<p>Ahora que dispone de un servidor web funcional, deber\u00e1 instalar un sistema de base de datos para poder almacenar y gestionar los datos de su sitio. MySQL es un sistema de administraci\u00f3n de bases de datos popular que se utiliza en entornos PHP.<\/p>\n\n\n\n<p>Una vez m\u00e1s, utilice <code>apt<\/code> para adquirir e instalar este software:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install mysql-server\n\n<\/code><\/pre>\n\n\n\n<p>Cuando se le solicite, confirme la instalaci\u00f3n al escribir <code>Y<\/code> y, luego, <code>ENTER<\/code>.<\/p>\n\n\n\n<p>Cuando la instalaci\u00f3n se complete, se recomienda ejecutar una secuencia de comandos de seguridad que viene preinstalada en MySQL Con esta secuencia de comandos se eliminar\u00e1n algunos ajustes predeterminados poco seguros y se bloquear\u00e1 el acceso a su sistema de base de datos. Inicie la secuencia de comandos interactiva ejecutando lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql_secure_installation\n\n<\/code><\/pre>\n\n\n\n<p>Se le preguntar\u00e1 si desea configurar el <code>VALIDATE PASSWORD PLUGIN<\/code>.<\/p>\n\n\n\n<p><strong>Nota<\/strong>: La habilitaci\u00f3n de esta caracter\u00edstica queda a discreci\u00f3n del usuario. Si se habilita, MySQL rechazar\u00e1 con un mensaje de error las contrase\u00f1as que no coincidan con los criterios especificados. Dejar la validaci\u00f3n desactivada ser\u00e1 una opci\u00f3n segura, pero siempre deber\u00e1 utilizar contrase\u00f1as seguras y \u00fanicas para credenciales de bases de datos.<\/p>\n\n\n\n<p>Elija <code>Y<\/code> para indicar que s\u00ed, o cualquier otra cosa para continuar sin la habilitaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>VALIDATE PASSWORD PLUGIN can be used to test passwords\nand improve security. It checks the strength of password\nand allows the users to set only those passwords which are\nsecure enough. Would you like to setup VALIDATE PASSWORD plugin?\n\nPress y|Y for Yes, any other key for No:\n<\/code><\/pre>\n\n\n\n<p>Si responde \u201cs\u00ed\u201d, se le solicitar\u00e1 que seleccione un nivel de validaci\u00f3n de contrase\u00f1a. Tenga en cuenta que, si ingresa <code>2<\/code> para indicar el nivel m\u00e1s seguro, recibir\u00e1 mensajes de error al intentar establecer cualquier contrase\u00f1a que no contenga n\u00fameros, letras en may\u00fascula y min\u00fascula, y caracteres especiales, o que se base en palabras comunes del diccionario.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>There are three levels of password validation policy:\n\nLOW    Length &gt;= 8\nMEDIUM Length &gt;= 8, numeric, mixed case, and special characters\nSTRONG Length &gt;= 8, numeric, mixed case, special characters and dictionary              file\n\nPlease enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: <mark>1<\/mark>\n<\/code><\/pre>\n\n\n\n<p>Independientemente de que haya elegido instalar el <code>VALIDATE PASSWORD PLUGIN<\/code>, su servidor le solicitar\u00e1, a continuaci\u00f3n, que seleccione y confirme una contrase\u00f1a para el <strong>root<\/strong> user de MySQL. No debe confundirse con el <strong>root del sistema<\/strong>. El <strong>root user de base de datos<\/strong> es un usuario administrativo con privilegios completos sobre el sistema de base de datos. Si bien el m\u00e9todo de autenticaci\u00f3n predeterminado del root user de MySQL no requiere el uso de una contrase\u00f1a, <strong>incluso si hay una establecida<\/strong>, deber\u00e1 definir una contrase\u00f1a segura en este punto como una medida de seguridad adicional. Hablaremos de esto en breve.<\/p>\n\n\n\n<p>Si habilit\u00f3 la validaci\u00f3n de contrase\u00f1a, se le indicar\u00e1 la seguridad de la contrase\u00f1a del root user que acaba de ingresar y su servidor le preguntar\u00e1 si desea continuar us\u00e1ndola. Si est\u00e1 conforme con su contrase\u00f1a actual, ingrese <code>Y<\/code> para indicar \u201cs\u00ed\u201d en la solicitud:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Estimated strength of the password: <mark>100<\/mark>\nDo you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : <mark>y<\/mark>\n<\/code><\/pre>\n\n\n\n<p>Para el resto de las preguntas, presione <code>Y<\/code> y <code>ENTER<\/code> en cada mensaje. Con esto, se eliminar\u00e1n algunos usuarios an\u00f3nimos y la base de datos de prueba, se deshabilitar\u00e1n las credenciales de inicio de sesi\u00f3n remoto de root y se cargar\u00e1n estas nuevas reglas para que MySQL aplique de inmediato los cambios que realiz\u00f3.<\/p>\n\n\n\n<p>Cuando termine, compruebe si puede iniciar sesi\u00f3n en la consola de MySQL al escribir lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql\n\n<\/code><\/pre>\n\n\n\n<p>Esto permitir\u00e1 establecer conexi\u00f3n con el servidor de MySQL como <strong>root<\/strong> user de la base de datos administrativa, lo que se infiere del uso de <code>sudo<\/code> cuando se ejecuta este comando. Deber\u00eda ver el siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OutputWelcome to the MySQL monitor.  Commands end with ; or \\g.\nYour MySQL connection id is 22\nServer version: 8.0.19-0ubuntu5 (Ubuntu)\n\nCopyright (c) 2000, 2020, Oracle and\/or its affiliates. All rights reserved.\n\nOracle is a registered trademark of Oracle Corporation and\/or its\naffiliates. Other names may be trademarks of their respective\nowners.\n\nType 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n\nmysql&gt;\n<\/code><\/pre>\n\n\n\n<p>Para salir de la consola de MySQL, escriba lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit\n\n<\/code><\/pre>\n\n\n\n<p>Observe que no necesit\u00f3 proporcionar una contrase\u00f1a para conectarse como <strong>root<\/strong> user, a pesar de que defini\u00f3 una al ejecutar la secuencia de comandos <code>mysql_secure_installation<\/code>. Esto se debe a que el m\u00e9todo de autenticaci\u00f3n predeterminado para el usuario administrativo de MySQL es <code>unix_socket<\/code> en vez de <code>password<\/code>. Si bien esto puede parecer un problema de seguridad inicialmente, hace que el servidor de la base de datos sea m\u00e1s seguro porque los \u00fanicos usuarios que pueden iniciar sesi\u00f3n como <strong>root<\/strong> user de My SQL son los usuarios del sistema con privilegios sudo que establecen conexi\u00f3n desde la consola o mediante una aplicaci\u00f3n que se ejecute con los mismos privilegios. En t\u00e9rminos pr\u00e1cticos, eso significa que no podr\u00e1 usar el usuario <strong>root<\/strong> de la base de datos administrativa para establecer conexi\u00f3n desde su aplicaci\u00f3n PHP. Establecer una contrase\u00f1a para la cuenta <strong>root<\/strong> de MySQL es una medida de protecci\u00f3n, en caso de que el m\u00e9todo de autenticaci\u00f3n predeterminado se cambie de <code>unix_socket<\/code> a <code>password<\/code>.<\/p>\n\n\n\n<p>Para mayor seguridad, es mejor disponer de cuentas de usuario dedicadas con privilegios de menor alcance configurados para cada base de datos, en especial si planea disponer de varias bases de datos alojadas en su servidor.<\/p>\n\n\n\n<p><strong>Nota:<\/strong> Al momento de la redacci\u00f3n de este art\u00edculo, la biblioteca PHP nativa de MySQL <code>mysqlnd<\/code> <a href=\"https:\/\/www.php.net\/manual\/en\/ref.pdo-mysql.php\">no admite<\/a> <code>caching_sha2_authentication<\/code>, el m\u00e9todo de autenticaci\u00f3n predeterminado de MySQL 8. Por este motivo, al crear usuarios de bases de datos para aplicaciones PHP en MySQL 8, deber\u00e1 asegurarse de que est\u00e9n configurados para usar <code>mysql_native_password<\/code> en su lugar. Demostraremos c\u00f3mo hacerlo en el <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-20-04-es#step-6-%E2%80%94-testing-database-connection-from-php-(optional)\">paso 6<\/a>.<\/p>\n\n\n\n<p>Ahora, su servidor de MySQL est\u00e1 instalado y protegido. A continuaci\u00f3n, instalaremos PHP, el componente final de la pila LAMP.<\/p>\n\n\n\n<h2 id=\"paso-3-instalar-php\">Paso 3: Instalar PHP<\/h2>\n\n\n\n<p>Instal\u00f3 Apache para presentar su contenido y MySQL para almacenar y gestionar sus datos. PHP es el componente de nuestra configuraci\u00f3n que procesar\u00e1 el c\u00f3digo para mostrar contenido din\u00e1mico al usuario final. Adem\u00e1s del paquete <code>php<\/code>, necesitar\u00e1 <code>php-mysql<\/code>, un m\u00f3dulo PHP que permite que este se comunique con bases de datos basadas en MySQL. Tambi\u00e9n necesitar\u00e1 <code>libapache2-mod-php<\/code> para habilitar Apache para gestionar archivos PHP. Los paquetes PHP b\u00e1sicos se instalar\u00e1n autom\u00e1ticamente como dependencias.<\/p>\n\n\n\n<p>Para instalar estos paquetes, ejecute lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install php libapache2-mod-php php-mysql\n\n<\/code><\/pre>\n\n\n\n<p>Una vez que la instalaci\u00f3n se complete, podr\u00e1 ejecutar el siguiente comando para confirmar su versi\u00f3n de PHP:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>php -v\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>OutputPHP 7.4.3 (cli) (built: Mar 26 2020 20:24:23) ( NTS )\nCopyright (c) The PHP Group\nZend Engine v3.4.0, Copyright (c) Zend Technologies\n    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies\n<\/code><\/pre>\n\n\n\n<p>En este punto, su pila LAMP est\u00e1 plenamente operativa, pero, para poder probar su configuraci\u00f3n con una secuencia de comandos PHP, lo mejor es instalar un <a href=\"https:\/\/httpd.apache.org\/docs\/current\/vhosts\/\">host virtual de Apache<\/a> adecuado para almacenar los archivos y las carpetas de su sitio web. Lo haremos en el siguiente paso.<\/p>\n\n\n\n<h2 id=\"paso-4-crear-un-host-virtual-para-su-sitio-web\">Paso 4: Crear un host virtual para su sitio web<\/h2>\n\n\n\n<p>Al emplear el servidor web Apache, puede crear <em>hosts virtuales<\/em> (similares a los bloques de servidor en Nginx) para encapsular detalles de configuraci\u00f3n y alojar m\u00e1s de un dominio desde un \u00fanico servidor. En esta gu\u00eda, configurar\u00e1 un dominio llamado <strong>your_domain<\/strong>, <strong>pero deber\u00e1 cambiar este nombre por el de su dominio propio<\/strong>.<\/p>\n\n\n\n<p><strong>Nota<\/strong>: En caso de que utilice DigitalOcean como proveedor de hosting de DNS, puede consultar nuestros <a href=\"https:\/\/www.digitalocean.com\/docs\/networking\/dns\/how-to\/manage-records\/#a-records\">documentos sobre productos<\/a> para hallar instrucciones detalladas sobre c\u00f3mo configurar un nuevo nombre de dominio y orientarlo hacia su servidor.<\/p>\n\n\n\n<p>Ubuntu 20.04 tiene habilitado un bloque de servidor por defecto, que est\u00e1 configurado para proporcionar documentos del directorio <code>\/var\/www\/html<\/code>. Si bien esto funciona bien para un solo sitio, puede ser dif\u00edcil de manejar si aloja varios. En lugar de modificar <code>\/var\/www\/html<\/code>, crearemos una estructura de directorio dentro de <code>\/var\/www<\/code> para el sitio <strong>your_domain<\/strong> y dejaremos <code>\/var\/www\/html<\/code> establecido como directorio predeterminado que se presentar\u00e1 si una solicitud de cliente no coincide con ning\u00fan otro sitio.<\/p>\n\n\n\n<p>Cree el directorio para <strong>your_domain<\/strong> de la siguiente manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir \/var\/www\/<mark>your_domain<\/mark>\n\n<\/code><\/pre>\n\n\n\n<p>A continuaci\u00f3n, asigne la propiedad del directorio con la variable de entorno <code>$USER<\/code>, que har\u00e1 referencia a su usuario de sistema actual:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R $USER:$USER \/var\/www\/<mark>your_domain<\/mark>\n\n<\/code><\/pre>\n\n\n\n<p>Luego, abra un nuevo archivo de configuraci\u00f3n en el directorio <code>sites-available<\/code> de Apache usando el editor de l\u00ednea de comandos que prefiera. En este caso, utilizaremos <code>nano<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/apache2\/sites-available\/<mark>your_domain<\/mark>.conf\n\n<\/code><\/pre>\n\n\n\n<p>De esta manera, se crear\u00e1 un nuevo archivo en blanco. Pegue la siguiente configuraci\u00f3n b\u00e1sica: \/etc\/apache2\/sites-available\/your_domain.conf<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;VirtualHost *:80&gt;\n    ServerName <mark>your_domain<\/mark>\n    ServerAlias www.<mark>your_domain<\/mark>\n    ServerAdmin webmaster@localhost\n    DocumentRoot \/var\/www\/<mark>your_domain<\/mark>\n    ErrorLog ${APACHE_LOG_DIR}\/error.log\n    CustomLog ${APACHE_LOG_DIR}\/access.log combined\n&lt;\/VirtualHost&gt;\n<\/code><\/pre>\n\n\n\n<p>Con esta configuraci\u00f3n de <code>VirtualHost<\/code>, le indicamos a Apache que proporcione <code><mark>your_domain<\/mark><\/code> usando <code>\/var\/www\/<mark>your_domain<\/mark><\/code> como directorio root web. Si desea probar Apache sin un nombre de dominio, puede eliminar o convertir en comentario las opciones <code>ServerName<\/code> y <code>ServerAlias<\/code> a\u00f1adiendo un car\u00e1cter <code>#<\/code> al principio de las l\u00edneas de cada opci\u00f3n.<\/p>\n\n\n\n<p>Ahora, puede usar <code>a2ensite<\/code> para habilitar el nuevo host virtual:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo a2ensite <mark>your_domain<\/mark>\n\n<\/code><\/pre>\n\n\n\n<p>Puede ser conveniente deshabilitar el sitio web predeterminado que viene instalado con Apache. Es necesario hacerlo si no se utiliza un nombre de dominio personalizado, dado que, en este caso, la configuraci\u00f3n predeterminada de Apache sobrescribir\u00e1 su host virtual. Para deshabilitar el sitio web predeterminado de Apache, escriba lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo a2dissite 000-default\n\n<\/code><\/pre>\n\n\n\n<p>Para asegurarse de que su archivo de configuraci\u00f3n no contenga errores de sintaxis, ejecute lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apache2ctl configtest\n\n<\/code><\/pre>\n\n\n\n<p>Por \u00faltimo, vuelva a cargar Apache para que estos cambios surtan efecto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl reload apache2\n\n<\/code><\/pre>\n\n\n\n<p>Ahora, su nuevo sitio web est\u00e1 activo, pero el directorio root web <code>\/var\/www\/<mark>your_domain<\/mark><\/code> todav\u00eda est\u00e1 vac\u00edo. Cree un archivo <code>index.html<\/code> en esa ubicaci\u00f3n para poder probar que el host virtual funcione seg\u00fan lo previsto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/var\/www\/<mark>your_domain<\/mark>\/index.html\n\n<\/code><\/pre>\n\n\n\n<p>Incluya el siguiente contenido en este archivo: \/var\/www\/your_domain\/index.html<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;h1&gt;It works!&lt;\/h1&gt;\n\n&lt;p&gt;This is the landing page of &lt;strong&gt;<mark>your_domain<\/mark>&lt;\/strong&gt;.&lt;\/p&gt;\n<\/code><\/pre>\n\n\n\n<p>Ahora, dir\u00edjase a su navegador y acceda al nombre de dominio o la direcci\u00f3n IP de su servidor una vez m\u00e1s:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/<mark>server_domain_or_IP<\/mark>\n<\/code><\/pre>\n\n\n\n<p>Ver\u00e1 una p\u00e1gina como la siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/assets.digitalocean.com\/articles\/lamp_ubuntu2004\/vhost_ok.png\" alt=\"Prueba de host virtual de Apache\"\/><\/figure>\n\n\n\n<p>Si ve esta p\u00e1gina, su host virtual de Apache est\u00e1 funcionando seg\u00fan lo previsto.<\/p>\n\n\n\n<p>Puede dejar este archivo establecido como p\u00e1gina de destino temporal de su aplicaci\u00f3n hasta que configure un archivo <code>index.php<\/code> que lo sustituya. Cuando lo haga, recuerde eliminar el archivo <code>index.html<\/code> de su root de documentos, o cambiarle el nombre, ya que tendr\u00eda precedencia sobre un archivo <code>index.php<\/code> por defecto.<\/p>\n\n\n\n<h3 id=\"nota-sobre-directoryindex-en-apache\">Nota sobre <code>DirectoryIndex<\/code> en Apache<\/h3>\n\n\n\n<p>Con la configuraci\u00f3n predeterminada de <code>DirectoryIndex<\/code> en Apache, un archivo denominado <code>index.html<\/code> siempre tendr\u00e1 prioridad sobre un archivo <code>index.php<\/code>. Esto es \u00fatil para establecer p\u00e1ginas de mantenimiento en aplicaciones PHP, dado que se puede crear un archivo <code>index.html<\/code> temporal que contenga un mensaje informativo para los visitantes. Como esta p\u00e1gina tendr\u00e1 precedencia sobre la p\u00e1gina <code>index.php<\/code>, se convertir\u00e1 en la p\u00e1gina de destino de la aplicaci\u00f3n. Una vez que el mantenimiento se completa, el archivo <code>index.html<\/code> se elimina del root de documentos, o se le cambia el nombre, para volver mostrar la p\u00e1gina habitual de la aplicaci\u00f3n.<\/p>\n\n\n\n<p>Si desea cambiar este comportamiento, deber\u00e1 editar el archivo <code>\/etc\/apache2\/mods-enabled\/dir.conf<\/code> y modificar el orden en el que el archivo <code>index.php<\/code> se enumera en la directiva <code>DirectoryIndex<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/etc\/apache2\/mods-enabled\/dir.conf\n\n<\/code><\/pre>\n\n\n\n<p>\/etc\/apache2\/mods-enabled\/dir.conf<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;IfModule mod_dir.c&gt;\n        DirectoryIndex <mark>index.php<\/mark> index.html index.cgi index.pl index.xhtml index.htm\n&lt;\/IfModule&gt;\n<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s de guardar y cerrar el archivo, deber\u00e1 volver a cargar Apache para que los cambios surtan efecto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl reload apache2\n\n<\/code><\/pre>\n\n\n\n<p>En el siguiente paso, crearemos una secuencia de comandos PHP para probar que PHP est\u00e9 correctamente instalado y configurado en su servidor.<\/p>\n\n\n\n<h2 id=\"paso-4-probar-el-procesamiento-de-php-en-su-servidor-web\">Paso 4: Probar el procesamiento de PHP en su servidor web<\/h2>\n\n\n\n<p>Ahora que dispone de una ubicaci\u00f3n personalizada para alojar los archivos y las carpetas de su sitio web, crearemos una secuencia de comandos PHP de prueba para verificar que Apache pueda gestionar solicitudes y procesar solicitudes de archivos PHP.<\/p>\n\n\n\n<p>Cree un archivo nuevo llamado <code>info.php<\/code> dentro de su carpeta root web personalizada:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/var\/www\/<mark>your_domain<\/mark>\/info.php\n\n<\/code><\/pre>\n\n\n\n<p>Con esto se abrir\u00e1 un archivo vac\u00edo. A\u00f1ada el siguiente texto, que es el c\u00f3digo PHP v\u00e1lido, dentro del archivo: \/var\/www\/your_domain\/info.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nphpinfo();\n<\/code><\/pre>\n\n\n\n<p>Cuando termine, guarde y cierre el archivo.<\/p>\n\n\n\n<p>Para probar esta secuencia de comandos, dir\u00edjase a su navegador web y acceda al nombre de dominio o la direcci\u00f3n IP de su servidor, seguido del nombre de la secuencia de comandos, que en este caso es <code>info.php<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/<mark>server_domain_or_IP<\/mark>\/info.php\n<\/code><\/pre>\n\n\n\n<p>Ver\u00e1 una p\u00e1gina similar a la siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/assets.digitalocean.com\/articles\/lamp_ubuntu2004\/phpinfo.png\" alt=\"Informaci\u00f3n de PHP de Ubuntu 20.04\"\/><\/figure>\n\n\n\n<p>En esta p\u00e1gina, se proporciona informaci\u00f3n b\u00e1sica sobre su servidor desde la perspectiva de PHP. Es \u00fatil para la depuraci\u00f3n y para asegurarse de que sus ajustes se apliquen correctamente.<\/p>\n\n\n\n<p>Si puede ver esta p\u00e1gina en su navegador, su instalaci\u00f3n de PHP funciona seg\u00fan lo previsto.<\/p>\n\n\n\n<p>Tras comprobar la informaci\u00f3n pertinente sobre su servidor PHP a trav\u00e9s de esa p\u00e1gina, es recomendable que elimine el archivo que cre\u00f3, dado que contiene informaci\u00f3n confidencial sobre su entorno PHP y su servidor de Ubuntu. Puede usar <code>rm<\/code> para hacerlo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo rm \/var\/www\/<mark>your_domain<\/mark>\/info.php\n\n<\/code><\/pre>\n\n\n\n<p>Siempre puede recrear esta p\u00e1gina si necesita acceder a la informaci\u00f3n posteriormente.<\/p>\n\n\n\n<h2 id=\"paso-6-probar-la-conexion-con-la-base-de-datos-desde-php-opcional\">Paso 6: Probar la conexi\u00f3n con la base de datos desde PHP (opcional)<\/h2>\n\n\n\n<p>Si desea probar si PHP puede establecer conexi\u00f3n con MySQL y ejecutar consultas a la base de datos, puede crear una tabla de prueba con datos ficticios y realizar consultas relacionadas con su contenido con una secuencia de comandos PHP. Para poder hacerlo, debemos crear una base de datos de prueba y un nuevo usuario de MySQL debidamente configurado para acceder a ella.<\/p>\n\n\n\n<p>Al momento de la redacci\u00f3n de este art\u00edculo, la biblioteca PHP nativa de MySQL <code>mysqlnd<\/code> <a href=\"https:\/\/www.php.net\/manual\/en\/ref.pdo-mysql.php\">no admite<\/a> <code>caching_sha2_authentication<\/code>, el m\u00e9todo de autenticaci\u00f3n predeterminado de MySQL 8. Vamos a tener que crear un usuario nuevo con el m\u00e9todo de autenticaci\u00f3n <code>mysql_native_password<\/code> para poder establecer conexi\u00f3n con la base de datos de MySQL desde PHP.<\/p>\n\n\n\n<p>Crearemos una base de datos denominada <strong>example_database<\/strong> y un usuario llamado <strong>example_user<\/strong>, pero puede sustituir estos nombres por valores diferentes.<\/p>\n\n\n\n<p>Primero, establezca conexi\u00f3n con la consola de MySQL usando la cuenta <strong>root<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql\n\n<\/code><\/pre>\n\n\n\n<p>Para crear una base de datos nueva, ejecute el siguiente comando desde su consola de MySQL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE <mark>example_database<\/mark>;\n\n<\/code><\/pre>\n\n\n\n<p>Ahora puede crear un nuevo usuario y concederle privilegios completos sobre la base de datos personalizada que acaba de crear.<\/p>\n\n\n\n<p>El siguiente comando crea un usuario nuevo llamado <code><mark>example_user<\/mark><\/code>, que utiliza <code>mysql_native_password<\/code> como m\u00e9todo de autenticaci\u00f3n predeterminado. Definimos la contrase\u00f1a de este usuario como <code><mark>password<\/mark><\/code>, pero debe sustituir este valor por una contrase\u00f1a segura de su elecci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE USER '<mark>example_user<\/mark>'@'%' IDENTIFIED WITH mysql_native_password BY '<mark>password<\/mark>';\n\n<\/code><\/pre>\n\n\n\n<p>Ahora, debemos darle permiso a este usuario a la base de datos <code>example_database<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GRANT ALL ON example_database.* TO 'example_user'@'%';\n\n<\/code><\/pre>\n\n\n\n<p>Esto proporcionar\u00e1 al usuario <strong>example_user<\/strong> privilegios completos sobre la base de datos <strong>example_database<\/strong> y, al mismo tiempo, evitar\u00e1 que este usuario cree o modifique otras bases de datos en su servidor.<\/p>\n\n\n\n<p>Ahora, cierre el shell de MySQL con lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit\n\n<\/code><\/pre>\n\n\n\n<p>Puede verificar si el usuario nuevo tiene los permisos adecuados al volver a iniciar sesi\u00f3n en la consola de MySQL, esta vez, con las credenciales de usuario personalizadas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql -u <mark>example_user<\/mark> -p\n\n<\/code><\/pre>\n\n\n\n<p>Observe el indicador <code>-p<\/code> en este comando, que le solicitar\u00e1 la contrase\u00f1a que utiliz\u00f3 cuando cre\u00f3 el usuario <strong>example_user<\/strong>. Despu\u00e9s de iniciar sesi\u00f3n en la consola de MySQL, confirme que tenga acceso a la base de datos <strong>example_database<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SHOW DATABASES;\n\n<\/code><\/pre>\n\n\n\n<p>Con esto se generar\u00e1 el siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Output+--------------------+\n| Database           |\n+--------------------+\n| <mark>example_database<\/mark>   |\n| information_schema |\n+--------------------+\n2 rows in set (0.000 sec)\n<\/code><\/pre>\n\n\n\n<p>A continuaci\u00f3n, crearemos una tabla de prueba denominada <strong>todo_list<\/strong>: Desde la consola de MySQL, ejecute la siguiente instrucci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE <mark>example_database<\/mark>.<mark>todo_list<\/mark> (\n\titem_id INT AUTO_INCREMENT,\n\tcontent VARCHAR(255),\n\tPRIMARY KEY(item_id)\n);\n\n<\/code><\/pre>\n\n\n\n<p>Inserte algunas filas de contenido en la tabla de prueba. Es posible que quiera repetir el siguiente comando algunas veces, usando valores diferentes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO <mark>example_database<\/mark>.<mark>todo_list<\/mark> (content) VALUES (\"<mark>My first important item<\/mark>\");\n\n<\/code><\/pre>\n\n\n\n<p>Para confirmar que los datos se guardaron correctamente en su tabla, ejecute lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM <mark>example_database<\/mark>.<mark>todo_list<\/mark>;\n\n<\/code><\/pre>\n\n\n\n<p>Ver\u00e1 el siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Output+---------+--------------------------+\n| item_id | content                  |\n+---------+--------------------------+\n|       1 | My first important item  |\n|       2 | My second important item |\n|       3 | My third important item  |\n|       4 | and this one more thing  |\n+---------+--------------------------+\n4 rows in set (0.000 sec)\n\n<\/code><\/pre>\n\n\n\n<p>Despu\u00e9s de confirmar que haya datos v\u00e1lidos en su tabla de prueba, puede cerrar la consola de MySQL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exit\n\n<\/code><\/pre>\n\n\n\n<p>Ahora, podr\u00e1 crear una secuencia de comandos PHP que se conecte a MySQL y realice consultas relacionadas con su contenido. Cree un nuevo archivo PHP en su directorio web root personalizado usando su editor preferido. En este caso, usaremos <code>nano<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/var\/www\/<mark>your_domain<\/mark>\/<mark>todo_list.php<\/mark>\n\n<\/code><\/pre>\n\n\n\n<p>La siguiente secuencia de comandos PHP establece conexi\u00f3n con la base de datos de MySQL, realiza consultas relacionadas con el contenido de la tabla <strong>todo_list<\/strong> y muestra los resultados en una lista. Si hay un problema con la conexi\u00f3n de la base de datos, generar\u00e1 una excepci\u00f3n. Copie este contenido en su secuencia de comandos <code>todo_list.php<\/code>: \/var\/www\/your_domain\/todo_list.php<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$user = \"<mark>example_user<\/mark>\";\n$password = \"<mark>password<\/mark>\";\n$database = \"<mark>example_database<\/mark>\";\n$table = \"<mark>todo_list<\/mark>\";\n\ntry {\n  $db = new PDO(\"mysql:host=localhost;dbname=$database\", $user, $password);\n  echo \"&lt;h2&gt;TODO&lt;\/h2&gt;&lt;ol&gt;\";\n  foreach($db-&gt;query(\"SELECT content FROM $table\") as $row) {\n    echo \"&lt;li&gt;\" . $row&#91;'content'] . \"&lt;\/li&gt;\";\n  }\n  echo \"&lt;\/ol&gt;\";\n} catch (PDOException $e) {\n    print \"Error!: \" . $e-&gt;getMessage() . \"&lt;br\/&gt;\";\n    die();\n}\n<\/code><\/pre>\n\n\n\n<p>Guarde y cierre el archivo cuando finalice la edici\u00f3n.<\/p>\n\n\n\n<p>Ahora, puede acceder a esta p\u00e1gina en su navegador web al visitar el nombre de dominio o la direcci\u00f3n IP p\u00fablica de su sitio web seguido de <code>\/todo_list.php<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:\/\/<mark>your_domain<\/mark>\/todo_list.php\n<\/code><\/pre>\n\n\n\n<p>Deber\u00eda ver una p\u00e1gina como esta, en la que se muestra el contenido que insert\u00f3 en su tabla de prueba:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/assets.digitalocean.com\/articles\/lemp_debian10\/todo_list.png\" alt=\"Ejemplo de la lista \u201ctodo\u201d PHP\"\/><\/figure>\n\n\n\n<p>Eso significa que su entorno PHP est\u00e1 listo para establecer conexi\u00f3n con su servidor de MySQL e interactuar con \u00e9l.<\/p>\n\n\n\n<h2 id=\"conclusion\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>En esta gu\u00eda, creamos una base flexible para presentar sitios web y aplicaciones PHP a sus visitantes usando Apache como servidor web y MySQL como sistema de base de datos.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Una pila \u201cLAMP\u201d es un conjunto de aplicaciones de software de c\u00f3digo abierto que se suelen instalar juntas para que un servidor pueda alojar aplicaciones y sitios web din\u00e1micos<\/p>\n<p class=\"more-link\"><a href=\"https:\/\/collageweb.es\/portal\/como-instalar-la-pila-linux-apache-mysql-y-php-lamp-en-ubuntu-20-04\/\" class=\"readmore\">Seguir leyendo<svg class=\"icon icon-arrow-right\" aria-hidden=\"true\" role=\"img\"> <use href=\"#icon-arrow-right\" xlink:href=\"#icon-arrow-right\"><\/use> <\/svg><span class=\"screen-reader-text\">C\u00f3mo instalar la pila Linux, Apache, MySQL y PHP (LAMP) en Ubuntu 20.04<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":160,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/posts\/167"}],"collection":[{"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/comments?post=167"}],"version-history":[{"count":1,"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/posts\/167\/revisions"}],"predecessor-version":[{"id":168,"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/posts\/167\/revisions\/168"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/media\/160"}],"wp:attachment":[{"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/media?parent=167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/categories?post=167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/collageweb.es\/portal\/wp-json\/wp\/v2\/tags?post=167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}