Una versión anterior de este tutorial fue escrita por Brennan Bearnes.

Introducción

Una pila «LAMP» es un grupo de software de código abierto que suele instalarse conjuntamente para permitir que un servidor aloje sitios web dinámicos y aplicaciones web. Este término es en realidad un acrónimo que representa el sistema operativo Linux, con el servidor web Apache. Los datos del sitio se almacenan en una base de datos MySQL, y el contenido dinámico es procesado por PHP.

En esta guía, instalaremos una pila LAMP en un servidor Ubuntu 18.04.

Requisitos previos

Para completar este tutorial, necesitarás tener un servidor Ubuntu 18.04 con una cuenta de usuario no root sudohabilitada y un firewall básico. Esto se puede configurar utilizando nuestra guía de configuración inicial del servidor para Ubuntu 18.04.

Paso 1 – Instalar Apache y actualizar el Firewall

El servidor web Apache está entre los servidores web más populares del mundo. Está bien documentado y ha sido ampliamente utilizado durante gran parte de la historia de la web, lo que lo convierte en una gran opción por defecto para alojar un sitio web.

Instale Apache utilizando el gestor de paquetes de Ubuntu, apt:

  • sudo apt update
  • sudo apt install apache2

Como este es un comando sudo, estas operaciones se ejecutan con privilegios de root. Te pedirá la contraseña de tu usuario habitual para verificar tus intenciones.

Una vez que hayas introducido tu contraseña, apt te dirá qué paquetes planea instalar y cuánto espacio extra en disco ocuparán. Presione Y y pulse ENTER para continuar, y la instalación procederá.

Ajuste el cortafuegos para permitir el tráfico web

A continuación, suponiendo que ha seguido las instrucciones de configuración inicial del servidor y ha habilitado el cortafuegos de UFW, asegúrese de que su cortafuegos permite el tráfico HTTP y HTTPS. Puede comprobar que UFW tiene un perfil de aplicación para Apache así:

  • sudo ufw app list
Output
Available applications: Apache Apache Full Apache Secure OpenSSH

Si mira el perfil Apache Full, debería mostrar que permite el tráfico a los puertos 80 y 443:

  • sudo ufw app info "Apache Full"
Output
Profile: Apache FullTitle: Web Server (HTTP,HTTPS)Description: Apache v2 is the next generation of the omnipresent Apache webserver.Ports: 80,443/tcp

Permita el tráfico entrante HTTP y HTTPS para este perfil:

  • sudo ufw allow in "Apache Full"

Puede hacer una comprobación puntual de inmediato para verificar que todo ha ido según lo previsto visitando la dirección IP pública de su servidor en su navegador web (consulte la nota del siguiente epígrafe para saber cuál es su dirección IP pública si aún no tiene esta información):

http://your_server_ip

Verá la página web predeterminada de Ubuntu 18.04 página web de Apache, que está ahí para fines informativos y de prueba. Debería ser algo así:

Ubuntu 18.04 Apache por defecto

Si ves esta página, entonces tu servidor web está ahora correctamente instalado y accesible a través de tu firewall.

Cómo encontrar la dirección IP pública de tu servidor

Si no sabes cuál es la dirección IP pública de tu servidor, hay varias maneras de encontrarla. Por lo general, esta es la dirección que se utiliza para conectarse a su servidor a través de SSH.

Hay algunas maneras diferentes de hacer esto desde la línea de comandos. En primer lugar, puede utilizar las herramientas iproute2 para obtener su dirección IP escribiendo lo siguiente:

  • ip addr show eth0 | grep inet | awk '{ print ; }' | sed 's/\/.*$//'

Esto le devolverá dos o tres líneas. Todas las direcciones son correctas, pero es posible que tu ordenador sólo pueda utilizar una de ellas, así que no dudes en probar cada una.

Un método alternativo es utilizar la utilidad curl para contactar con una parte externa que te diga cómo ve tu servidor. Esto se hace preguntando a un servidor específico cuál es su dirección IP:

  • sudo apt install curl
  • curl http://icanhazip.com

Independientemente del método que utilice para obtener su dirección IP, escríbala en la barra de direcciones de su navegador web para ver la página predeterminada de Apache.

Paso 2 – Instalar MySQL

Ahora que tiene su servidor web en funcionamiento, es el momento de instalar MySQL. MySQL es un sistema de gestión de bases de datos. Básicamente, organizará y proporcionará acceso a las bases de datos donde su sitio puede almacenar información.

De nuevo, utilice apt para adquirir e instalar este software:

  • sudo apt install mysql-server

Nota: En este caso, no tiene que ejecutar sudo apt update antes del comando. Esto se debe a que lo has ejecutado recientemente en los comandos anteriores para instalar Apache. El índice de paquetes de su ordenador ya debería estar actualizado.

Este comando, también, le mostrará una lista de los paquetes que se instalarán, junto con la cantidad de espacio en disco que ocuparán. Introduzca Y para continuar.

Cuando la instalación esté completa, ejecute un sencillo script de seguridad que viene preinstalado con MySQL y que eliminará algunos valores predeterminados peligrosos y bloqueará el acceso a su sistema de base de datos. Inicie el script interactivo ejecutando:

  • sudo mysql_secure_installation

Esto le preguntará si desea configurar el VALIDATE PASSWORD PLUGIN.

Nota: Habilitar esta característica es una especie de decisión. Si se activa, las contraseñas que no coincidan con los criterios especificados serán rechazadas por MySQL con un error. Esto causará problemas si utiliza una contraseña débil junto con software que configura automáticamente las credenciales de usuario de MySQL, como los paquetes de Ubuntu para phpMyAdmin. Es seguro dejar la validación deshabilitada, pero siempre debe usar contraseñas fuertes y únicas para las credenciales de la base de datos.

Responda Y para sí, o cualquier otra cosa para continuar sin habilitar.

VALIDATE PASSWORD PLUGIN can be used to test passwordsand improve security. It checks the strength of passwordand allows the users to set only those passwords which aresecure enough. Would you like to setup VALIDATE PASSWORD plugin?Press y|Y for Yes, any other key for No:

Si responde «sí», se le pedirá que seleccione un nivel de validación de contraseña. Tenga en cuenta que si introduce 2 para el nivel más fuerte, recibirá errores al intentar establecer cualquier contraseña que no contenga números, letras mayúsculas y minúsculas, y caracteres especiales, o que esté basada en palabras comunes del diccionario.

There are three levels of password validation policy:LOW Length >= 8MEDIUM Length >= 8, numeric, mixed case, and special charactersSTRONG Length >= 8, numeric, mixed case, special characters and dictionary filePlease enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Independientemente de si eligió configurar el VALIDATE PASSWORD PLUGIN, su servidor le pedirá a continuación que seleccione y confirme una contraseña para el usuario raíz de MySQL. Esta es una cuenta administrativa en MySQL que tiene mayores privilegios. Piensa que es similar a la cuenta raíz del propio servidor (aunque la que estás configurando ahora es una cuenta específica de MySQL). Asegúrese de que es una contraseña fuerte y única, y no la deje en blanco.

Si habilitó la validación de contraseñas, se le mostrará la fuerza de la contraseña de la cuenta raíz que acaba de introducir y su servidor le preguntará si desea cambiar esa contraseña. Si está satisfecho con su contraseña actual, introduzca N para «no» en la pregunta:

Using existing password for root.Estimated strength of the password: 100Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

Para el resto de las preguntas, presione Y y pulse la tecla ENTER en cada pregunta. Esto eliminará algunos usuarios anónimos y la base de datos de prueba, deshabilitará los inicios de sesión de la raíz remota y cargará estas nuevas reglas para que MySQL respete inmediatamente los cambios que ha hecho.

Note que en los sistemas Ubuntu que ejecutan MySQL 5.7 (y versiones posteriores), el usuario raíz de MySQL está configurado para autenticarse usando el plugin auth_socket por defecto en lugar de con una contraseña. Esto permite una mayor seguridad y usabilidad en muchos casos, pero también puede complicar las cosas cuando se necesita permitir que un programa externo (por ejemplo, phpMyAdmin) acceda al usuario.

Si prefiere utilizar una contraseña al conectarse a MySQL como root, tendrá que cambiar su método de autenticación de auth_socket a mysql_native_password. Para ello, abra el prompt de MySQL desde su terminal:

  • sudo mysql

A continuación, compruebe qué método de autenticación utiliza cada una de sus cuentas de usuario de MySQL con el siguiente comando:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+| user | authentication_string | plugin | host |+------------------+-------------------------------------------+-----------------------+-----------+| root | | auth_socket | localhost || mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost || mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost || debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |+------------------+-------------------------------------------+-----------------------+-----------+4 rows in set (0.00 sec)

En este ejemplo, puede ver que el usuario root se autentifica efectivamente utilizando el complemento auth_socket. Para configurar la cuenta root para que se autentique con una contraseña, ejecute el siguiente comando ALTER USER. Asegúrese de cambiar password a una contraseña fuerte de su elección:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Luego, ejecute FLUSH PRIVILEGES que le dice al servidor que recargue las tablas de concesión y ponga sus nuevos cambios en efecto:

  • FLUSH PRIVILEGES;

Vuelva a comprobar los métodos de autenticación empleados por cada uno de sus usuarios para confirmar que root ya no se autentifica usando el plugin auth_socket:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+| user | authentication_string | plugin | host |+------------------+-------------------------------------------+-----------------------+-----------+| root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost || mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost || mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost || debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |+------------------+-------------------------------------------+-----------------------+-----------+4 rows in set (0.00 sec)

Puede ver en este ejemplo que el usuario root de MySQL ahora se autentifica usando una contraseña. Una vez que confirme esto en su propio servidor, puede salir del shell de MySQL:

  • exit

En este punto, su sistema de base de datos está ahora configurado y puede pasar a la instalación de PHP, el componente final de la pila LAMP.

Paso 3 – Instalación de PHP

PHP es el componente de su configuración que procesará el código para mostrar contenido dinámico. Puede ejecutar scripts, conectarse a sus bases de datos MySQL para obtener información, y entregar el contenido procesado a su servidor web para mostrarlo.

Una vez más, aproveche el sistema apt para instalar PHP. Además, incluya algunos paquetes de ayuda esta vez para que el código PHP pueda ejecutarse bajo el servidor Apache y hablar con su base de datos MySQL:

  • sudo apt install php libapache2-mod-php php-mysql

Esto debería instalar PHP sin problemas. Lo probaremos en un momento.

En la mayoría de los casos, querrá modificar la forma en que Apache sirve los archivos cuando se solicita un directorio. Actualmente, si un usuario solicita un directorio al servidor, Apache buscará primero un fichero llamado index.html. Queremos decirle al servidor web que prefiera los archivos PHP sobre otros, así que haz que Apache busque primero un archivo index.php.

Para hacer esto, escribe este comando para abrir el archivo dir.conf en un editor de texto con privilegios de root:

  • sudo nano /etc/apache2/mods-enabled/dir.conf

Se verá así:

/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c> DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm</IfModule>

Mueva el archivo de índice PHP (resaltado arriba) a la primera posición después de la especificación DirectoryIndex, así:

/etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm</IfModule>

Cuando haya terminado, guarde y cierre el archivo pulsando CTRL+X. Confirme el guardado escribiendo Y y luego pulse ENTER para verificar la ubicación del archivo guardado.

Después de esto, reinicie el servidor web Apache para que sus cambios sean reconocidos. Haga esto escribiendo esto:

  • sudo systemctl restart apache2

También puede comprobar el estado del servicio apache2 utilizando systemctl:

  • sudo systemctl status apache2
Sample Output
● apache2.service - LSB: Apache2 web server Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Tue 2018-04-23 14:28:43 EDT; 45s ago Docs: man:systemd-sysv-generator(8) Process: 13581 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS) Process: 13605 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS) Tasks: 6 (limit: 512) CGroup: /system.slice/apache2.service ├─13623 /usr/sbin/apache2 -k start ├─13626 /usr/sbin/apache2 -k start ├─13627 /usr/sbin/apache2 -k start ├─13628 /usr/sbin/apache2 -k start ├─13629 /usr/sbin/apache2 -k start └─13630 /usr/sbin/apache2 -k start

Pulse Q para salir de esta salida de estado.

Para mejorar la funcionalidad de PHP, tiene la opción de instalar algunos módulos adicionales. Para ver las opciones disponibles para los módulos y bibliotecas de PHP, canalice los resultados de apt search en less, un paginador que le permite desplazarse a través de la salida de otros comandos:

  • apt search php- | less

Use las teclas de flecha para desplazarse hacia arriba y hacia abajo, y pulse Q para salir.

Los resultados son todos los componentes opcionales que puede instalar. Le dará una breve descripción de cada uno:

bandwidthd-pgsql/bionic 2.0.1+cvs20090917-10ubuntu1 amd64 Tracks usage of TCP/IP and builds html files with graphsbluefish/bionic 2.2.10-1 amd64 advanced Gtk+ text editor for web and software developmentcacti/bionic 1.1.38+ds1-1 all web interface for graphing of monitoring systemsganglia-webfrontend/bionic 3.6.1-3 all cluster monitoring toolkit - web front-endgolang-github-unknwon-cae-dev/bionic 0.0~git20160715.0.c6aac99-4 all PHP-like Compression and Archive Extensions in Gohaserl/bionic 0.9.35-2 amd64 CGI scripting program for embedded environmentskdevelop-php-docs/bionic 5.2.1-1ubuntu2 all transitional package for kdevelop-phpkdevelop-php-docs-l10n/bionic 5.2.1-1ubuntu2 all transitional package for kdevelop-php-l10n…:

Para saber más sobre lo que hace cada módulo, puede buscar en Internet más información sobre ellos. Alternativamente, mira la descripción larga del paquete escribiendo:

  • apt show package_name

Habrá un montón de salidas, con un campo llamado Description que tendrá una explicación más larga de la funcionalidad que el módulo proporciona.

Por ejemplo, para averiguar lo que hace el módulo php-cli, podrías escribir esto:

  • apt show php-cli

Además de una gran cantidad de otra información, encontrarás algo que se parece a esto:

Output
…Description: command-line interpreter for the PHP scripting language (default) This package provides the /usr/bin/php command interpreter, useful for testing PHP scripts from a shell or performing general shell scripting tasks. . PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. . This package is a dependency package, which depends on Ubuntu's default PHP version (currently 7.2).…

Si, después de investigar, decides que te gustaría instalar un paquete, puedes hacerlo usando el comando apt install como has estado haciendo para el otro software.

Si decides que php-cli es algo que necesitas, puedes escribir:

  • sudo apt install php-cli

Si quieres instalar más de un módulo, puedes hacerlo listando cada uno, separado por un espacio, siguiendo el comando apt install, así:

  • sudo apt install package1 package2 ...

En este punto, tu pila LAMP está instalada y configurada. Antes de hacer cualquier otra cosa, le recomendamos que configure un host virtual de Apache donde pueda almacenar los detalles de configuración de su servidor.

Paso 4 – Configurar hosts virtuales (recomendado)

Cuando se utiliza el servidor web Apache, se pueden utilizar hosts virtuales (similares a los bloques de servidor en Nginx) para encapsular los detalles de configuración y alojar más de un dominio desde un único servidor. Vamos a configurar un dominio llamado tu_dominio, pero deberías sustituirlo por tu propio nombre de dominio. Para saber más sobre cómo configurar un nombre de dominio con DigitalOcean, consulta nuestra Introducción al DNS de DigitalOcean.

Apache en Ubuntu 18.04 tiene un bloque de servidor habilitado por defecto que está configurado para servir documentos desde el directorio /var/www/html. Mientras que esto funciona bien para un solo sitio, puede llegar a ser difícil de manejar si está alojando varios sitios. En lugar de modificar /var/www/html, vamos a crear una estructura de directorios dentro de /var/www para nuestro sitio de tu_dominio, dejando /var/www/html en su lugar como el directorio por defecto para ser servido si una solicitud del cliente no coincide con ningún otro sitio.

Crea el directorio para tu_dominio de la siguiente manera:

sudo mkdir /var/www/your_domain

A continuación, asigna la propiedad del directorio con la variable de entorno $USER:

  • sudo chown -R $USER:$USER /var/www/your_domain

Los permisos de tus raíces web deberían ser correctos si no has modificado tu valor unmask, pero puedes asegurarte escribiendo:

  • sudo chmod -R 755 /var/www/your_domain

A continuación, crea una página index.html de ejemplo utilizando nano o tu editor favorito:

  • nano /var/www/your_domain/index.html

Dentro, añade el siguiente HTML de ejemplo:

/var/www/su_dominio/index.html
<html> <head> <title>Welcome to Your_domain!</title> </head> <body> <h1>Success! The your_domain server block is working!</h1> </body></html>

Guarda y cierra el archivo cuando hayas terminado.

Para que Apache pueda servir este contenido, es necesario crear un archivo de host virtual con las directivas correctas. En lugar de modificar directamente el fichero de configuración por defecto situado en /etc/apache2/sites-available/000-default.conf, vamos a hacer uno nuevo en /etc/apache2/sites-available/your_domain.conf:

  • sudo nano /etc/apache2/sites-available/your_domain.conf

Pegamos el siguiente bloque de configuración, que es similar al predeterminado, pero actualizado para nuestro nuevo directorio y nombre de dominio:

/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined</VirtualHost>

Nota que hemos actualizado el DocumentRoot a nuestro nuevo directorio y el ServerAdmin a un correo electrónico al que puede acceder el administrador del sitio your_domain. También hemos añadido dos directivas: ServerName, que establece el dominio base que debe coincidir para esta definición de host virtual, y ServerAlias, que define más nombres que deben coincidir como si fueran el nombre base.

Guarda y cierra el archivo cuando hayas terminado.

Habilitemos el archivo con la herramienta a2ensite:

  • sudo a2ensite your_domain.conf

Desactivemos el sitio por defecto definido en 000-default.conf:

  • sudo a2dissite 000-default.conf

A continuación, comprobemos si hay errores de configuración:

  • sudo apache2ctl configtest

Debería ver la siguiente salida:

Output
Syntax OK

Reinicie Apache para implementar sus cambios:

  • sudo systemctl restart apache2

Apache debería servir ahora su nombre de dominio. Puede probar esto navegando a http://your_domain, donde debería ver algo como esto:

Ejemplo de host virtual de Apache

Con esto, su host virtual está completamente configurado. Sin embargo, antes de hacer más cambios o desplegar una aplicación, sería útil probar proactivamente su configuración de PHP en caso de que haya algún problema que deba ser abordado.

Paso 5 – Probar el procesamiento de PHP en su servidor web

Para probar que su sistema está configurado correctamente para PHP, cree un script PHP muy básico llamado info.php. Para que Apache encuentre este archivo y lo sirva correctamente, debe ser guardado en el directorio raíz de su web.

Cree el archivo en la raíz de la web que creó en el paso anterior ejecutando:

  • sudo nano /var/www/your_domain/info.php

Esto abrirá un archivo en blanco. Añade el siguiente texto, que es código PHP válido, dentro del archivo:

info.php
<?phpphpinfo();?>

Cuando hayas terminado, guarda y cierra el archivo.

Ahora puedes probar si tu servidor web es capaz de mostrar correctamente el contenido generado por este script PHP. Para probarlo, visite esta página en su navegador web. Necesitará de nuevo la dirección IP pública de su servidor.

La dirección que querrá visitar es:

http://your_domain/info.php

La página a la que llegue debería ser algo así:

Información PHP por defecto de Ubuntu 18.04

Esta página proporciona alguna información básica sobre su servidor desde la perspectiva de PHP. Es útil para la depuración y para asegurarse de que su configuración se está aplicando correctamente.

Si puede ver esta página en su navegador, entonces su PHP está funcionando como se espera.

Probablemente quiera eliminar este archivo después de esta prueba porque en realidad podría dar información sobre su servidor a usuarios no autorizados. Para hacer esto, ejecute el siguiente comando:

  • sudo rm /var/www/your_domain/info.php

Siempre puede recrear esta página si necesita acceder a la información de nuevo más tarde.

Conclusión

Ahora que tiene una pila LAMP instalada, tiene muchas opciones para qué hacer a continuación. Básicamente, has instalado una plataforma que te permitirá instalar la mayoría de los tipos de sitios web y software web en tu servidor.

Como siguiente paso inmediato, debes asegurarte de que las conexiones a tu servidor web sean seguras, sirviéndolas a través de HTTPS. La opción más fácil aquí es utilizar Let’s Encrypt para asegurar su sitio con un certificado TLS/SSL gratuito.

Algunas otras opciones populares son:

  • Instalar WordPress el sistema de gestión de contenidos más popular en Internet.
  • Configurar PHPMyAdmin para ayudar a gestionar sus bases de datos MySQL desde el navegador web.
  • Aprender a utilizar SFTP para transferir archivos hacia y desde su servidor.