Implantación de Aplicaciones Web
José Juan Sánchez Hernández
Curso 2024/2025
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.
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.
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.
En esta sección se explican los pasos que hay que llevar a cabo para
instalar WordPress en directorio raíz de Apache. Por ejemplo:
/var/www/html
.
wget
.El parámetro -P
indica la ruta donde se guardará el
archivo.
.tar.gz
que acabamos de
descargar con el comando tar
.Utilizamos los siguientes parámetros:
-x
: Indica que queremos extraer el contenido del
archivo.-z
: Indica que queremos descomprimir el archivo.-v
: Habilita el modo verboso para mostrar por pantalla
el proceso de descompresión.-f
: Se utiliza para indicar cuál es el nombre del
archivo de entrada.-C
: Se utiliza para indicar cuál es el diretorio
destino.wordpress
. Ahora, movemos el contenido de
/tpm/wordpress
a /var/www/html
.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:
localhost
: Para permitir que el usuario sólo puede
conectarse desde el servidor MySQL.%
: Para permitir que el usuario pueda conectarse desde
cualquier dirección IP.172.31.80.67
.172.31.%
.wp-config.php
a
partir del archivo de ejemplo wp-config-sample.php
.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
.
/var/www/html
..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:
RewriteEngine On
: Habilita el motor de reesscritura de
URLs.RewriteBase /
: Define la ruta base que se utilizará
para las reglas de reescritura.RewriteRule ^index\.php$ - [L]
: Esta regla indica que
si la petición que se está evaluando coincide con index.php
entonces no se realiza ninguna acción. El carácter -
indica
que no se hará ninguna acción y el flag [L]
(Last) indica que será la última regla que se aplique en esta
evaluación.RewriteCond %{REQUEST_FILENAME} !-f
: Esta condición
comprueba si la petición que se está evaluando no es un archivo. Si no
lo es, entonces se aplica la siguiente regla de reescritura.RewriteCond %{REQUEST_FILENAME} !-d
: Esta condición
comprueba si la petición que se está evaluando no es un directorio. Si
no lo es, entonces se aplica la siguiente regla de reescritura.RewriteRule . /index.php [L]
: Esta regla se aplicará
cuando se cumplan las dos condiciones anteriores. Si la petición no es
un archivo y no es un directorio, entonces se hace una redirección a
index.php
.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.
mod_rewrite
de Apache.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
.
wget
.El parámetro -P
indica la ruta donde se guardará el
archivo.
.tar.gz
que acabamos de
descargar con el comando tar
.Utilizamos los siguientes parámetros:
-x
: Indica que queremos extraer el contenido del
archivo.-z
: Indica que queremos descomprimir el archivo.-v
: Habilita el modo verboso para mostrar por pantalla
el proceso de descompresión.-f
: Se utiliza para indicar cuál es el nombre del
archivo de entrada.-C
: Se utiliza para indicar cuál es el diretorio
destino.wordpress
. Ahora, movemos el contenido de
/tpm/wordpress
a /var/www/html
.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:
localhost
: Para permitir que el usuario sólo puede
conectarse desde el servidor MySQL.%
: Para permitir que el usuario pueda conectarse desde
cualquier dirección IP.172.31.80.67
.172.31.%
.wp-config.php
a
partir del archivo de ejemplo wp-config-sample.php
.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
.
WP_SITEURL
):
Es la URL que incluye el directorio donde está instalado el código
fuente de WordPress.WP_HOME
): Es la
URL que queremos que usen los usuarios para acceder a WordPress.Las variables de Dirección de WordPress
(WP_SITEURL
) y Dirección del sitio
(WP_HOME
) se pueden configurar:
wp-config.php
.Si hemos realizado la instalación de WordPress en el directorio
wordpress
tendremos que asignarles los siguientes
valores:
WP_SITEURL
):
https://NOMBRE_DE_DOMINIO/wordpress
WP_HOME
):
https://NOMBRE_DE_DOMINIO
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.
WP_SITEURL
):
http://IP_PUBLICA_SERVIDOR_WEB/wordpress
WP_HOME
):
http://IP_PUBLICA_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
.
/var/www/html/wordpress/index.php
a
/var/www/html
.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
.
.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:
RewriteEngine On
: Habilita el motor de reesscritura de
URLs.RewriteBase /
: Define la ruta base que se utilizará
para las reglas de reescritura.RewriteRule ^index\.php$ - [L]
: Esta regla indica que
si la petición que se está evaluando coincide con index.php
entonces no se realiza ninguna acción. El carácter -
indica
que no se hará ninguna acción y el flag [L]
(Last) indica que será la última regla que se aplique en esta
evaluación.RewriteCond %{REQUEST_FILENAME} !-f
: Esta condición
comprueba si la petición que se está evaluando no es un archivo. Si no
lo es, entonces se aplica la siguiente regla de reescritura.RewriteCond %{REQUEST_FILENAME} !-d
: Esta condición
comprueba si la petición que se está evaluando no es un directorio. Si
no lo es, entonces se aplica la siguiente regla de reescritura.RewriteRule . /index.php [L]
: Esta regla se aplicará
cuando se cumplan las dos condiciones anteriores. Si la petición no es
un archivo y no es un directorio, entonces se hace una redirección a
index.php
.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.
mod_rewrite
de Apache.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.
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
Hacemos una llamada a la API de wordpress para obtener las security keys y almacenamos el resultado en una variable de entorno.
/
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 _
.
/var/www/html
.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.
Crea una instancia EC2 en AWS.
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.
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.
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).
Crea una dirección IP elástica y asígnala a la instancia EC2.
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.
Automatice la instalación de WordPress.
Busque cuál es la dirección IP elástica de su instancia y compruebe que puede acceder a ella desde una navegador web.
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
El documento técnico README.md
tiene que estar escrito
en Markdown y debe
incluir como mínimo los siguientes contenidos:
El directorio scripts
debe incluir los siguientes
archivos:
.env
: Este archivo contiene todas las variables de
configuración que se utilizarán en los scripts de Bash.
install_lamp.sh
: Script de Bash con la
automatización del proceso de instalación de la pila LAMP.
setup_letsencrypt_https.sh
: Script de Bash con la
automatización del proceso de solicitar un certificado SSL/TLS de Let’s
Encrypt y configurarlo en el servidor web Apache.
deploy_wordpress_root_directory.sh
: Script de Bash
con la automatización del proceso de instalación de WordPress sobre el
directorio raíz /var/www/html
.
deploy_wordpress_own_directory.sh
: Script de Bash
con la automatización del proceso de instalación de WordPress sobre su
propio directorio. Por ejemplo:
/var/www/html/wordpress
.
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.