Tutorial de servidor LAMP en Ubuntu 18.04 (LTS) con Apache, PHP 7.2 y MySQL

LAMP es la abreviatura de Linux, Apache, MySQL, PHP. Este tutorial muestra cómo puedes instalar un servidor web Apache en un servidor Ubuntu 18.04 LTS (Bionic Beaver) con PHP 7.2 (mod_php) y soporte para MySQL / MariaDB y cómo configurar un certificado SSL con Let’s encrypt. Además, instalaré PHPMyAdmin para facilitar la administración de MySQL. Una configuración LAMP es una base perfecta para sistemas CMS populares como Joomla, WordPress o Drupal.

Nota preliminar

En este tutorial, utilizaré el nombre de host servidor1.ejemplo.com con la dirección IP 192.168.1.100. Estas configuraciones pueden ser diferentes en tu caso, por lo que deberás sustituirlas cuando corresponda.

Te recomiendo que utilices una configuración mínima de servidor Ubuntu como base para el tutorial, que puede ser una imagen de servidor virtual o raíz con una instalación mínima de Ubuntu 18.04 de una empresa de alojamiento web o que utilices nuestro tutorial de servidor mínimo para instalar un servidor desde cero.

Voy a ejecutar todos los pasos de este tutorial con privilegios de root, así que asegúrate de que has iniciado sesión como root:

sudo -s

1. Instalar la base de datos MySQL o MariaDB

Actualmente hay dos sistemas de bases de datos MySQL ampliamente utilizados, el servidor clásico «MySQL» que está desarrollado por Oracle y que ya está disponible en la versión 5.7 y la bifurcación de MySQL llamada MariaDB que está desarrollada por el desarrollador original de MySQL, Monty Widenius.

A continuación te mostraré cómo instalar ambas alternativas. Sólo tienes que seguir el capítulo 1.1 o el 1.2, pero no ambos. Utilizaré MySQL 5.7 para la imagen de la máquina virtual que se puede descargar de Howtoforge.

1.1 Instalar MySQL 5.7

Para instalar MySQL 5.7, ejecuta este comando:

apt-get -y install mysql-server mysql-client

Los paquetes mysql-server y mysql-client son los llamados «metapaquetes», que instalan siempre la última versión de MySQL disponible en Ubuntu. La última versión es actualmente MySQL 5.7.

Ya hemos establecido la contraseña de root para MySQL durante la instalación, pero me gustaría eliminar el usuario anónimo y la base de datos de prueba por razones de seguridad. Ejecuta el comando mysql_secure_installation que aparece a continuación para conseguirlo.

mysql_secure_installation

Se te harán estas preguntas:

Securing the MySQL server deployment.
Enter password for user root: <-- Enter the MySQL root password
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : <-- Choose 'y' here if you like to enable the password validation, I don't need that function, so I choose 'n' here.
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : <-- y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : <-- y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : <-- y
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : <-- y
Success.
All done!

La instalación de MySQL ya está asegurada.

1.2 Instalar MariaDB 10

Ejecuta el siguiente comando para instalar MariaDB-servidor y cliente:

apt-get -y install mariadb-server mariadb-client

Ahora establecemos una contraseña de root para MariaDB.

mysql_secure_installation

Se te harán estas preguntas:

Enter current password for root (enter for none): <-- press enter
Set root password? [Y/n] <-- y
New password: <-- Enter the new MariaDB root password here
Re-enter new password: <-- Repeat the password
Remove anonymous users? [Y/n] <-- y
Disallow root login remotely? [Y/n] <-- y
Reload privilege tables now? [Y/n] <-- y

1.3 Prueba el inicio de sesión raíz de MySQL/MariaDB

Prueba el inicio de sesión en MariaDB con el «comando mysql

mysql -u root -p

e introduce la contraseña de root de MariaDB que has establecido anteriormente. El resultado debe ser similar a la captura de pantalla que aparece a continuación:

Probando el inicio de sesión de MySQL en Ubuntu 18.04 LTS

Para salir del shell de MySQL/MariaDB, introduce el comando «quit» y pulsa enter.

2. Instalar el servidor web Apache

Apache 2 está disponible como paquete de Ubuntu, por lo que podemos instalarlo así:

apt-get -y install apache2

Ahora dirige tu navegador a http://192.168.1.100, y deberías ver la página por defecto de Apache2(¡funciona!):

La página por defecto de Apache

La raíz documental del vhost por defecto de apache es /var/www/html en Ubuntu y el archivo de configuración principal es /etc/apache2/apache2.conf. El sistema de configuración estácompletamente documentado en /usr/share/doc/apache2/README.Debian.gz.

3. Instalar PHP 7.2

Podemos instalar PHP 7.2 y el módulo PHP de Apache como sigue:

apt-get -y install php7.2 libapache2-mod-php7.2

A continuación, reinicia Apache:

systemctl restart apache2

4. Prueba PHP y obtén detalles sobre tu instalación de PHP

La raíz del documento del sitio web por defecto es /var/www/html. Ahora crearemos un pequeño archivo PHP(info.php) en ese directorio y lo llamaremos en un navegador. El archivo mostrará muchos detalles útiles sobre nuestra instalación de PHP, como la versión de PHP instalada.

nano /var/www/html/info.php
<?php
phpinfo();

A continuación, cambia el propietario del archivo info.php al usuario y grupo www-data.

chown www-data:www-data /var/www/html/info.php

Ahora llamamos a ese archivo en un navegador (por ejemplo, http://192.168.1.100/info.php):

Información sobre PHP 7.2 en Ubuntu 18.04

Como ves, PHP 7.2 está funcionando, y lo hace a través del manejador de Apache 2.0, como se muestra en la línea de la API del servidor. Si te desplazas más abajo, verás todos los módulos que ya están habilitados en PHP. MySQL no está en la lista, lo que significa que todavía no tenemos soporte para MySQL / MariaDB en PHP.

5. Conseguir soporte para MySQL / MariaDB en PHP

Para conseguir el soporte de MySQL en PHP, podemos instalar el paquete php7.2-mysql. Es una buena idea instalar también otros módulos de PHP, ya que podrías necesitarlos para tus aplicaciones. Puedes buscar los módulos de PHP disponibles así

apt-cache search php7.2

y

apt-cache search php-

ya que no todos los paquetes PHP tienen el número de versión 7.2 en su nombre.

Elige los que necesites e instálalos así:

apt-get -y install php7.2-mysql php7.2-curl php7.2-gd php7.2-intl php-pear php-imagick php7.2-imap php-memcache  php7.2-pspell php7.2-recode php7.2-sqlite3 php7.2-tidy php7.2-xmlrpc php7.2-xsl php7.2-mbstring php-gettext

Ahora reinicia Apache2:

systemctl restart apache2

PHP 7.2 con la extensión MySQL cargada

PHP 7.2 tiene ahora soporte para MySQL / MariaDB como se muestra en phpinfo() más arriba.

6. Instala la caché PHP Opcache + APCu para acelerar PHP

PHP 7 viene con un cacheador de opcode incorporado para almacenar en caché y optimizar el código intermedio de PHP, tiene el nombre de ‘opcache’ y está disponible en el paquete php7.0-opcache. Se recomienda encarecidamente tener instalado opcache para acelerar tu página PHP. Además de opcache, instalaré APCu, que es una envoltura de compatibilidad para opcache que proporciona las funciones de la caché APC, un sistema de almacenamiento en caché utilizado a menudo en las versiones de PHP 5.x y que muchos sistemas CMS siguen utilizando.

Opcache y APCu se pueden instalar de la siguiente manera:

apt-get -y install php7.2-opcache php-apcu

No te preocupes si muestra que Opcache ya está instalado.

Ahora reinicia Apache:

systemctl restart apache2

Ahora vuelve a cargar http://192.168.1.100/info.php en tu navegador y desplázate de nuevo hasta la sección de módulos. Ahora deberías encontrar muchos módulos nuevos allí:

APC y APCu habilitados en PHP 7.2

No olvides eliminar el archivo info.php cuando ya no lo necesites, ya que proporciona detalles sensibles de tu servidor. Ejecuta el siguiente comando para eliminar el archivo.

rm -f /var/www/html/info.php

7. Habilitar el sitio web SSL en apache

SSL/ TLS es una capa de seguridad para cifrar la conexión entre el navegador web y tu servidor. Actualmente, la mayoría de los navegadores web empiezan a mostrar los sitios como inseguros cuando la conexión entre el servidor y el navegador web no está cifrada con SSL. En este capítulo, te mostraré cómo asegurar tu sitio web con SSL.

Ejecuta los siguientes comandos en tu servidor para activar el soporte de SSL (https://). Ejecuta:

a2enmod ssl
a2ensite default-ssl

que habilita el módulo SSL y añade un enlace simbólico en la carpeta /etc/apache2/sites-enabled al archivo /etc/apache2/sites-available/default-ssl.conf para incluirlo en la configuración activa de apache. A continuación, reinicia apache para activar la nueva configuración:

systemctl restart apache2

Ahora prueba la conexión SSL abriendo https://192.168.1.100 en un navegador web.

Aviso de certificado SSL autofirmado

Recibirás una advertencia SSL, ya que el certificado SSL del servidor es un certificado SSL «autofirmado», lo que significa que el navegador no confía en este certificado por defecto y tienes que aceptar primero la advertencia de seguridad. Después de aceptar la advertencia, verás la página por defecto de Apache.

Apache con SSL activado

El «candado verde» cerrado delante de la URL en el navegador muestra que la conexión está cifrada.

Hay dos maneras de deshacerse de la advertencia SSL, o bien sustituir el certificado SSL autofirmado /etc/ssl/certs/ssl-cert-snakeoil.pem por un certificado SSL firmado oficialmente que compres a una Autoridad SSL o bien conseguir un certificado SSL gratuito de Let’s encrypt, que describiré en el capítulo 8.

8. Consigue un certificado SSL gratuito de Let’s Encrypt

El primer paso para asegurar el sitio web con un certificado SSL de Let’s Encrypt es instalar el paquete python3-certbot-apache. Ejecuta el siguiente comando:

apt-get -y install python3-certbot-apache

En el siguiente paso, solicitaremos un certificado SSL a Let’s Encrypt utilizando el programa cliente certbot, durante este proceso, el servidor de Let’s Encrypt intenta conectarse a tu servidor a través del nombre de dominio que le proporcionas al comando certbot. Es importante que este nombre de dominio apunte ya a tu servidor en el DNS para que el sitio web sea ya alcanzable por su nombre de dominio en el puerto 80 (http). Si el sitio web no es accesible desde Internet, la creación del certificado SSL de Let’s Encrypt fallará.

Antes de empezar a crear el certificado SSL, establece el nombre de dominio en el archivo de configuración vhost. Abre el archivo vhost por defecto con un editor

nano /etc/apache2/sites-available/000-default.conf

y añade la línea

ServerName example.com

Justo debajo de la línea ‘DocumentRoot’. Sustituye ejemplo.com por el nombre de dominio de tu propio sitio web.

A continuación, crea el certificado SSL con este comando:

certbot --apache -d example.com

Sustituye aquí de nuevo ejemplo.com por el nombre de tu dominio. El comando iniciará un asistente que te hará varias preguntas.

Introduce la dirección de correo electrónico donde se puede contactar con el administrador responsable de este sitio web.

Establecer la dirección de correo electrónico

Acepta los términos y condiciones de la autoridad Let’s Encrypt SSL.

Acepta los términos y condiciones

Certbot te preguntará ahora si quieres compartir tu dirección de correo electrónico con la Electronic Frontier Foundation. Elige aquí lo que prefieras.

Dirección de correo electrónico FSF

A continuación, elige si quieres redirigir las peticiones no SSL a https:// automáticamente. Selecciona aquí el sí para evitar problemas de contenido duplicado cuando el sitio web esté disponible como versión http:// y https://.

Redirigir las peticiones HTTP

El certificado SSL se ha emitido correctamente.

Certificado SSL emitido con éxito

Cuando accedas al sitio web ahora con un navegador, serás redirigido automáticamente a SSL y el candado verde delante de la barra de URL en el navegador muestra que ahora estamos utilizando un certificado SSL de confianza.

Sitio web con protección SSL

8.1 Encriptemos la renovación automática

Los certificados SSL de Let’s Encrypt sólo son válidos durante un breve periodo de 80 días. Por lo tanto, es necesario un cronjob para auto-renovar los certificados SSL que ejecute el comando certbot –renew comando.

Este cronjob se configura automáticamente cuando instalas certbot, el archivo cron es/etc/cron.d/certbot. Así que no hay nada más que hacer aquí. Si quieres saber cómo es el cronjob, ejecuta el comando

/etc/cron.d/certbot

El resultado es:

[email protected]:~# cat /etc/cron.d/certbot
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc. Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

9. Instalar phpMyAdmin

phpMyAdmin es una interfaz web a través de la cual puedes gestionar tus bases de datos MySQL. Es una buena idea instalarlo:

apt-get -y install phpmyadmin

IMPORTANTE: El instalador apt te hará ahora varias preguntas, una de ellas es seleccionar el tipo de servidor web. Un error común es que el tipo de servidor web sólo esté resaltado pero no seleccionado. Para seleccionar un elemento del menú de apt tienes que pulsar la barra espaciadora del teclado después de haber navegado hasta el elemento con el tabulador o las teclas del cursor. No basta con resaltarlo.

Verás las siguientes preguntas:

Web server to configure automatically: <-- Select the option: apache2
Configure database for phpmyadmin with dbconfig-common? <-- Yes
MySQL application password for phpmyadmin: <-- Press enter, apt will create a random password automatically.

9.1 Acceso root a PHPMyAdmin

MariaDB y MySQL habilitan por defecto un plugin llamado «unix_socket» para el usuario root, este plugin impide que el usuario root pueda entrar en PHPMyAdmin y que las conexiones TCP a MySQL funcionen para el usuario root. Para conseguir un usuario con privilegios para crear otros usuarios y bases de datos en PHPMyAdmin, crearé un nuevo usuario MySQL con el nombre «admin» con los mismos privilegios que el usuario root.

Accede a la base de datos MySQL como usuario root en el shell:

mysql -u root

Crea un nuevo usuario con el nombre «admin» y la contraseña «howtoforge». Sustituye la contraseña «howtoforge» por una contraseña segura en los comandos que aparecen a continuación.

CREATE USER 'admin'@'localhost' IDENTIFIED BY 'howtoforge';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit

Después, podrás acceder a phpMyAdmin en http://192.168.1.100/phpmyadmin/:

Inicio de sesión de phpMyAdmin

Inicia sesión como usuario administrativo en phpMyAdmin

10 Descarga de la imagen de la máquina virtual de este tutorial

Este tutorial está disponible como imagen de máquina virtual lista para usar en formato ovf/ova que es compatible con VMWare y Virtualbox. La imagen de la máquina virtual utiliza los siguientes datos de acceso:

Inicio de sesión SSH / Shell

Nombre de usuario: administrador
Contraseña: howtoforge

Este usuario tiene derechos sudo.

Inicio de sesión en MySQL

Nombre de usuario: root
Contraseña: howtoforge

La IP de la VM es 192.168.1.100, se puede cambiar en el archivo /etc/network/interfaces. Por favor, cambia todas las contraseñas anteriores para asegurar la máquina virtual.

11 Enlaces

También te podría gustar...