Práctica 1.6

Implantación de Aplicaciones Web

José Juan Sánchez Hernández

Curso 2023/2024



1 Instalación de WordPress en una instancia EC2 de AWS

En esta práctica tendremos que realizar la instalación de WordPress en una instancia EC2 de Amazon Web Services (AWS).

Amazon Web Services (AWS) es una colección de servicios de computación en la nube pública que en conjunto forman una plataforma de computación en la nube, ofrecidas a través de Internet por Amazon.

1.1 ¿Qué es un Sistema de Gestión de Contenidos (CMS - Content Management System)?

Un Sistema de Gestión de Contenidos (CMS) es un software que permite a los usuarios crear, editar y gestionar de una forma sencilla el contenido de un sitio web. Algunos ejemplos de CMS son: WordPress, Joomla y Drupal.

1.2 ¿Qué es WordPress?

WordPress es un sistema de gestión de contenidos (CMS) muy utilizado para crear sitios webs y blogs. Es software libre y gratuito, y está desarrollado en PHP. Además cuenta con una gran cantidad de plugins y temas que permiten añadir nuevas sus funcionalidades y personalizar su diseño de una forma muy sencilla.

1.3 Instalación de WordPress en el directorio raíz

En esta sección se explica los pasos que hay que llevar a cabo para instalar WordPress en directorio raíz de Apache. Por ejemplo: /var/www/html.

  1. Descargamos la última versión de WordPress con el comando wget.
wget http://wordpress.org/latest.tar.gz -P /tmp

El parámetro -P indica la ruta donde se guardará el archivo.

  1. Descomprimimos el archivo .tar.gz que acabamos de descargar con el comando tar.
tar -xzvf /tmp/latest.tar.gz -C /tmp

Utilizamos los siguientes parámetros:

  1. El contenido se ha descomprimido en una carpeta que se llama wordpress. Ahora, movemos el contenido de /tpm/wordpress a /var/www/html.
mv -f /tmp/wordpress/* /var/www/html
  1. Creamos la base de datos y el usuario para WordPress.
mysql -u root <<< "DROP DATABASE IF EXISTS $WORDPRESS_DB_NAME"
mysql -u root <<< "CREATE DATABASE $WORDPRESS_DB_NAME"
mysql -u root <<< "DROP USER IF EXISTS $WORDPRESS_DB_USER@$IP_CLIENTE_MYSQL"
mysql -u root <<< "CREATE USER $WORDPRESS_DB_USER@$IP_CLIENTE_MYSQL IDENTIFIED BY '$WORDPRESS_DB_PASSWORD'"
mysql -u root <<< "GRANT ALL PRIVILEGES ON $WORDPRESS_DB_NAME.* TO $WORDPRESS_DB_USER@$IP_CLIENTE_MYSQL"

Tenga en cuenta que las variables $WORDPRESS_DB_NAME, $WORDPRESS_DB_USER, $WORDPRESS_DB_PASSWORD y $IP_CLIENTE_MYSQL estarán definidas en el archivo .env.

El valor de la variable $IP_CLIENTE_MYSQL puede ser:

  1. Creamos un archivo de configuración wp-config.php a partir del archivo de ejemplo wp-config-sample.php.
cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
  1. En este paso tenemos que configurar las variables de configuración del archivo de configuración de WordPress. El contenido original del archivo wp-config.php será similar a este:
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

Por lo tanto, lo que haremos será reemplazar el texto database_name_here, username_here, password_here y localhost por los valores de las variables $WORDPRESS_DB_NAME, $WORDPRESS_DB_USER, $WORDPRESS_DB_PASSWORD y $WORDPRESS_DB_HOST respectivamente.

Para realizar este paso utilizaremos el comando sed.

sed -i "s/database_name_here/$WORDPRESS_DB_NAME/" /var/www/html/wp-config.php
sed -i "s/username_here/$WORDPRESS_DB_USER/" /var/www/html/wp-config.php
sed -i "s/password_here/$WORDPRESS_DB_PASSWORD/" /var/www/html/wp-config.php
sed -i "s/localhost/$WORDPRESS_DB_HOST/" /var/www/html/wp-config.php

Tenga en cuenta que las variables $WORDPRESS_DB_NAME, $WORDPRESS_DB_USER, $WORDPRESS_DB_PASSWORD y $WORDPRESS_DB_HOST estarán definidas en el archivo .env.

  1. Cambiamos el propietario y el grupo al directorio /var/www/html.
chown -R www-data:www-data /var/www/html/
  1. Preparamos la configuración para los enlaces permanentes de WordPress. En este paso tendremos que crear un archivo .htaccess en el directorio /var/www/html con un contenido similar a este.
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

A continuación, se explica cada una de las directivas que se han utilizado:

Por lo tanto, este archivo hará que todas las peticiones que llegen a este directorio, si no son un archivo o un directorio entonces se redirigen a index.php.

Nota:Tenga en cuenta que para que el servidor web Apache pueda leer el archivo .htaccess tendremos que configurar la directiva AllowOverride como AllowOverride All. Esta configuración se tendrá que realizar en el archivo de configuración del VirtualHost de Apache.

  1. Habilitamos el módulo mod_rewrite de Apache.
a2enmod rewrite
  1. Después de habilitar el módulo deberá reiniciar el servicio de Apache.
sudo systemctl restart apache2

1.4 Instalación de WordPress en su propio directorio

En esta sección se explica los pasos que hay que llevar a cabo para instalar WordPress en su propio directorio. Por ejemplo: /var/www/html/wordpress.

  1. Descargamos la última versión de WordPress con el comando wget.
wget http://wordpress.org/latest.tar.gz -P /tmp

El parámetro -P indica la ruta donde se guardará el archivo.

  1. Descomprimimos el archivo .tar.gz que acabamos de descargar con el comando tar.
tar -xzvf /tmp/latest.tar.gz -C /tmp

Utilizamos los siguientes parámetros:

  1. El contenido se ha descomprimido en una carpeta que se llama wordpress. Ahora, movemos el contenido de /tpm/wordpress a /var/www/html.
mv -f /tmp/wordpress /var/www/html
  1. Creamos la base de datos y el usuario para WordPress.
mysql -u root <<< "DROP DATABASE IF EXISTS $WORDPRESS_DB_NAME"
mysql -u root <<< "CREATE DATABASE $WORDPRESS_DB_NAME"
mysql -u root <<< "DROP USER IF EXISTS $WORDPRESS_DB_USER@$IP_CLIENTE_MYSQL"
mysql -u root <<< "CREATE USER $WORDPRESS_DB_USER@$IP_CLIENTE_MYSQL IDENTIFIED BY '$WORDPRESS_DB_PASSWORD'"
mysql -u root <<< "GRANT ALL PRIVILEGES ON $WORDPRESS_DB_NAME.* TO $WORDPRESS_DB_USER@$IP_CLIENTE_MYSQL"

Tenga en cuenta que las variables $WORDPRESS_DB_NAME, $WORDPRESS_DB_USER, $WORDPRESS_DB_PASSWORD y $IP_CLIENTE_MYSQL estarán definidas en el archivo .env.

El valor de la variable $IP_CLIENTE_MYSQL puede ser:

  1. Creamos un archivo de configuración wp-config.php a partir del archivo de ejemplo wp-config-sample.php.
cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php
  1. En este paso tenemos que configurar las variables de configuración del archivo de configuración de WordPress. El contenido original del archivo wp-config.php será similar a este:
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'database_name_here' );

/** Database username */
define( 'DB_USER', 'username_here' );

/** Database password */
define( 'DB_PASSWORD', 'password_here' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

Por lo tanto, lo que haremos será reemplazar el texto database_name_here, username_here, password_here y localhost por los valores de las variables $WORDPRESS_DB_NAME, $WORDPRESS_DB_USER, $WORDPRESS_DB_PASSWORD y $WORDPRESS_DB_HOST respectivamente.

Para realizar este paso utilizaremos el comando sed.

sed -i "s/database_name_here/$WORDPRESS_DB_NAME/" /var/www/html/wordpress/wp-config.php
sed -i "s/username_here/$WORDPRESS_DB_USER/" /var/www/html/wordpress/wp-config.php
sed -i "s/password_here/$WORDPRESS_DB_PASSWORD/" /var/www/html/wordpress/wp-config.php
sed -i "s/localhost/$WORDPRESS_DB_HOST/" /var/www/html/wordpress/wp-config.php

Tenga en cuenta que las variables $WORDPRESS_DB_NAME, $WORDPRESS_DB_USER, $WORDPRESS_DB_PASSWORD y $WORDPRESS_DB_HOST estarán definidas en el archivo .env.

  1. Cuando realizamos la instalación de WordPress en su propio directorio, es necesario configurar estas dos variables de configuración:

Las variables de Dirección de WordPress (WP_SITEURL) y Dirección del sitio (WP_HOME) se pueden configurar:

Si hemos realizado la instalación de WordPress en el directorio wordpress tendremos que asignarles los siguientes valores:

Donde NOMBRE_DEL_DOMINIO será el nombre de dominio que ha reservado para su sitio web. Observe que hemos utilizado https, porque su sitio web tendrá que utilizar un certificado HTTPS.

Si quiere realizar pruebas sin tener un nombre de dominio, puede hacerlas utilizando en su lugar la dirección IP púbica del servidor web.

Para automatizar la configuración de las variables WP_SITEURL y WP_HOME podemos utilizar el comando sed.

sed -i "/DB_COLLATE/a define('WP_SITEURL', 'https://$CERTIFICATE_DOMAIN/wordpress');" /var/www/html/wordpress/wp-config.php
sed -i "/WP_SITEURL/a define('WP_HOME', 'https://$CERTIFICATE_DOMAIN');" /var/www/html/wordpress/wp-config.php

Tenga en cuenta que la variable $CERTIFICATE_DOMAIN estará definida en el archivo .env.

  1. Copiamos el archivo /var/www/html/wordpress/index.php a /var/www/html.
cp /var/www/html/wordpress/index.php /var/www/html
  1. El contenido original del archivo index.php será similar a este:
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

Y tenemos que reemplazarlo por este otro:

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wordpress/wp-blog-header.php' );

Donde wordpress es el directorio donde se encuentra el código fuente de WordPress que hemos descomprimido en pasos anteriores.

Por lo tanto, para realizar este paso utilizaremos el comando sed.

sed -i "s#wp-blog-header.php#wordpress/wp-blog-header.php#" /var/www/html/index.php 
  1. Preparamos la configuración para los enlaces permanentes de WordPress. En este paso tendremos que crear un archivo .htaccess en el directorio /var/www/html con un contenido similar a este.
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

A continuación, se explica cada una de las directivas que se han utilizado:

Por lo tanto, este archivo hará que todas las peticiones que llegen a este directorio, si no son un archivo o un directorio entonces se redirigen a index.php.

Nota:Tenga en cuenta que para que el servidor web Apache pueda leer el archivo .htaccess tendremos que configurar la directiva AllowOverride como AllowOverride All. Esta configuración se tendrá que realizar en el archivo de configuración del VirtualHost de Apache.

  1. Habilitamos el módulo mod_rewrite de Apache.
a2enmod rewrite
  1. Después de habilitar el módulo deberá reiniciar el servicio de Apache.
sudo systemctl restart apache2

1.5 Configuración de las security keys de WordPress

El archivo de configuración wp-config.php de WordPress incluye una sección para configurar unas security keys que se utilizan para mejorar la seguridad de las sesiones y generar cookies seguras.

Se recomienda que cada instalación genere unas claves que sean únicas para esa instalación.

  1. En primer lugar, eliminamos los valores por defecto de las security keys que aparecen en el archivo de configuración.
sed -i "/AUTH_KEY/d" /var/www/html/wordpress/wp-config.php
sed -i "/SECURE_AUTH_KEY/d" /var/www/html/wordpress/wp-config.php
sed -i "/LOGGED_IN_KEY/d" /var/www/html/wordpress/wp-config.php
sed -i "/NONCE_KEY/d" /var/www/html/wordpress/wp-config.php
sed -i "/AUTH_SALT/d" /var/www/html/wordpress/wp-config.php
sed -i "/SECURE_AUTH_SALT/d" /var/www/html/wordpress/wp-config.php
sed -i "/LOGGED_IN_SALT/d" /var/www/html/wordpress/wp-config.php
sed -i "/NONCE_SALT/d" /var/www/html/wordpress/wp-config.php
  1. Vamos a hacer uso de la API que nos ofrece WordPress para generar unas security keys. La URL de la API es:

Hacemos una llamada a la API de wordpress para obtener las security keys y almacenamos el resultado en una variable de entorno.

SECURITY_KEYS=$(curl https://api.wordpress.org/secret-key/1.1/salt/)
  1. Las nuevas security keys que acabamos de generar pueden contener el carácter / y este carácter puede darnos problemas a la hora de utilizar el comando sed para añadirlas al archivo de configuración.

Para evitar posibles problemas con el carácter / vamos a reemplazarlo por el carácter _.

SECURITY_KEYS=$(echo $SECURITY_KEYS | tr / _)
  1. Añadimos las security keys al archivo de configuración.
sed -i "/@-/a $SECURITY_KEYS" /var/www/html/wordpress/wp-config.php
  1. Cambiamos el propietario y el grupo al directorio /var/www/html.
chown -R www-data:www-data /var/www/html/

1.6 Tareas a realizar

En esta práctica tendremos que realizar la instalación de WordPress en una instancia EC2 de Amazon Web Services (AWS).

A continuación se describen muy brevemente algunas de las tareas que tendrá que realizar.

  1. Crea una instancia EC2 en AWS.

  2. La Amazon Machine Image (AMI) que vamos a seleccionar para esta práctica será una Community AMI con la última versión de Ubuntu Server.

  3. Cuando esté creando la instancia deberá configurar los puertos que estarán abiertos para poder conectarnos por SSH y para poder acceder por HTTP/HTTPS.

    • SSH (TCP)
    • HTTP (TCP)
    • HTTPS (TCP)
  4. Crea un par de claves (pública y privada) para conectar por SSH con la instancia. También puedes hacer uso de las claves que te proporciona AWS Academy (vockey.pem).

  5. Crea una dirección IP elástica y asígnala a la instancia EC2.

  6. Una vez que haya iniciado su instancia deberá hacer uso de los scripts de bash que diseñó en las prácticas anteriores para automatizar la instalación de la pila LAMP.

  7. Automatice la instalación de WordPress.

  8. Busque cuál es la dirección IP elástica de su instancia y compruebe que puede acceder a ella desde una navegador web.

1.7 Entregables

Deberá crear un repositorio en GitHub con el nombre de la práctica y añadir al profesor como colaborador.

El repositorio debe tener el siguiente contenido:

Además del contenido anterior puede ser necesario crear otros archivos de configuración. A continuación se muestra un ejemplo de cómo puede ser la estructura del repositorio:

.
├── README.md
├── conf
│   └── 000-default.conf
├── htaccess
│   └── .htaccess
└── scripts
    ├── .env
    ├── install_lamp.sh
    ├── setup_letsencrypt_https.sh
    ├── deploy_wordpress_root_directory.sh    
    └── deploy_wordpress_own_directory.sh

1.7.1 Documento técnico

El documento técnico README.md tiene que estar escrito en Markdown y debe incluir como mínimo los siguientes contenidos:

1.7.2 Scripts de Bash

El directorio scripts debe incluir los siguientes archivos:

2 Referencias

3 Licencia

Licencia de Creative Commons
Esta página forma parte del curso Implantación de Aplicaciones Web de José Juan Sánchez Hernández y su contenido se distribuye bajo una licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.