Este artículo tiene más de 2 años. Si contiene información técnica es posible que no se ajuste a las últimas versiones.

Cambiar tu página web de un hosting compartido a Amazon Web Services

Nota Febrero 2021: Debido a las consultas generadas por este artículo, en breve publicaré una guía actualizada de este proceso. Recomiendo leer el artículo solo para obtener una idea aproximada del proceso final.

Posiblemente sigas pensando que los servicios en la nube son solo para los grandes. Pero esto ya no es así ni mucho menos. El rendimiento y los precios de estos servicios están permitiendo que proyectos pequeños puedan disponer de una infraestructura potente con mucha facilidad. Si no te da miedo meterte a administrar tus servicios y no temes a la línea de comandos, es relativamente fácil adentrarse en el mundo de la nube para tu propia página web.

Este artículo está dirigido a documentar el proceso que he seguido para migrar dos sitios web (incluyendo este) en WordPress alojados en un hosting compartido, a los servicios de Amazon Web Services (AWS). No pretender ser una guía de usuario, porque para eso está la documentación oficial. El proceso no es complicado pero tienes que ir por partes. A continuación detallo los pasos generales y luego los iré explicando.

  1. Creación de tu instancia el servicio Lightsail (VPS) de Amazon Web Services.
  2. Creación y configuración de una imagen LAMP. Acceso SSH.
  3. Asignación de una IP fija y servicios de DNS.
  4. Creación de bases de datos.
  5. Configuración del servidor y los hosts virtuales.
  6. Instalación SSL con Let’s Encrypt
  7. Instalación de los sitios web.

Aunque sean muchísimos los servicios que integran AWS, este sistema es uno más de los posibles para crear tus sitios web en esta plataforma. A partir de tus necesidades podrás crear soluciones más complejas, que involucren redundancia y disponibilidad. Pero para los usos sencillos como el que describo, te va a sobrar máquina.

Uno de los puntos débiles de AWS es que la mayoría de documentación está en inglés y no siempre en el mismo sitio. Es complicado seguirle la pista a algunos recursos y puesto que hay muchos y cambian tanto, no siempre das con la parte adecuada. Moraleja: sé paciente y busca los recursos más actualizados a tu situación.

1. Creación de tu instancia en Lightsail de AWS

Si no lo has hecho ya, lo primero es que creas tu cuenta en AWS. Puedes entrar directamente desde la web de Amazon Lightsail y desde ahí inscribirte. AWS te ofrece una capa gratuita de ciertos servicios durante un año, para que puedas probar su funcionamiento. Es muy útil para romper mano y hacer alguna cosa, aunque el servicio de VPS corre por separado. Por ahora te recomiendo empezar por la opción más económica, que en estos momentos está en 3.50 dólares al mes (primer mes gratuito).

El proceso es sencillo. Se trata de crear una instancia (tu servidor virtual) en una región geográfica, con un software instalado y un plan de recursos. En mi caso he creado una instancia en la región de Irlanda, en Linux con una imagen LAMP y el plan más económico.

AWS Lightsail

2. Creación y configuración de una imagen LAMP.

Lo apropiado es escoger una instancia en el país más cercano posible. En el caso de un WordPress aunque exista una imagen preparada de WordPress, estimo más interesante partir de una imagen de desarrollo en Linux / Apache / MySQL y PHP. ¿Ventaja? Aprendes a organizar un servidor web y no tenerlo como una simple caja negra que nunca tocas. Como veremos, esta imagen LAMP viene con todo lo necesario para crear aplicaciones web en entorno PHP, con versiones actualizadas del software. Además tienes acceso a la estructura de archivos y acceso SSH para poder administrar tu instancia.

Un detalle importante a tener en cuenta es que las imágenes que se crean en la instancia vienen proporcionadas por Bitnami. Son configuraciones diseñadas para arrancar los proyectos, según la tecnología. Bitnami proporciona la documentación de cada una de sus imágenes.

Una vez has configurado tu instancia, con un nombre personal que la identifique, la instancia está lista para arrancar con una IP estática. Desde el panel de control podrás parar o reiniciar la instancia, pero antes deberás configurar tu par de claves SSH para poder acceder en remoto y por línea de comandos. Adicionalmente AWS te ofrece acceso a través del navegador, simulando una sesión por terminal. Esta parte es la que más cambia con respecto al flujo de trabajo de un hosting compartido, donde tienes un panel de control (cPanel, por ejemplo) desde donde administrar los servicios. Aquí te valdrás básicamente de la línea de comandos.

Amazon Lightsail Bitnami acceso terminal

Configurar tu acceso SSH es fácil porque Bitnami ya te ha configurado el acceso desde el directorio raíz. Verás que el usuario es bitnami y la contraseña se encuentra en dos archivos, uno llamado bitnami_application_password y el otro bitnami_credentials. Ahí verás en texto plano la clave para acceder por SSH a tu instancia. Como encontrarás en la documentación de Bitnami esa contraseña también sirve para crear base de datos dentro de la instancia.

Lo más fácil para conectarse a la instancia desde línea de comandos es que utilices la clave que puedes descargar desde tu panel de control. Esto es un archivo .pem que descargas en tu equipo y que mediante línea de comandos puedes ejecutar. Asumiendo que estás en el directorio donde tienes la clave .pem, el comando es (Mac / Linux):


ssh -i LightsailDefaultPrivateKey-eu-west-1.pem bitnami@[tu-ip]

La ventaja es que no te hará falta introducir la contraseña en sucesivas conexiones. Este archivo .pem también puede ser utilizado por clientes SSH como Putty o Filezilla.

3. Asignación de una IP fija y servicios de DNS

Un aspecto importante de tu instancia es que si quieres crear un sitio web, necesitarás un IP estática (por defecto, la asigna dinámica y por tanto cambia cada reinicio). Para eso irás al panel de control -> Redes y desde ahí solicitarás una dirección IP estática. A partir de aquí ya podrás resolver tu DNS a la instancia para los diferentes servicios. Otra configuración en redes es la de Firewall y la de balanceo de carga. Por ahora los valores por defecto que trae nos serán suficiente.

Amazon Web Services Lightsail redes

Un aspecto crítico del servicio consiste en mantener tu zona DNS, con los registros que necesites. AWS te ofrecer su propios DNS, que tendrás que configurar en tu proveedor de dominio en el caso de que no tengas el servicio contratado con AWS Route 53. Importante. Una vez que hayas configurado los name servers en tu proveedor de dominio, todos los registros DNS se tienen que actualizar desde el panel de AWS en Redes -> Zona DNS. Cada dominio, tiene su configuración, como es lógico. Un registro habitual es que asignes un comodín por defecto y como verás en la imagen, tienes que asignarle un valor (fácil si es la instancia, como ves).

Configuración del DNS en AWS

Un apunte importante, es que pasa con tu correo electrónico. Yo he optado por contratar un sencillo plan de hosting correo (1 eur/mes) en mi proveedor de dominio actual (que no es AWS). Así que necesito crear un registro MX para resolver mi correo electrónico. Configuraciones similares se pueden hacer con Google Apps o Office 365.

Registro MX para configuración de correo electrónico

4. Creación de bases de datos

Bitnami viene con una instalación phpMyAdmin para gestionar las bases de datos que creas. Para acceder al phpMyAdmin tienes que “tunelar” con ssh desde tu máquina. En la documentación de Bitnami se explica cómo hacerlo, pero básicamente es usar tu certificado y conectar por localhost:888. Como verás en el panel de control de Lightsail puedes crear una base de datos adicional, pero cuidado, el MySQL que viene por defecto nos va a permitir crear nuestras bases de datos para los proyectos que alojemos.

Lo más sencillo es conectarse por SSH a nuestra instancia y acceder a MySQL.

>#mysql -u root -p
mysql> create database DATABASE_NAME;
mysql> GRANT ALL PRIVILEGES ON DATABASE_NAME.* TO 'DATABASE_USER'@'localhost' identified by 'PASSWORD';
mysql> flush privileges;

Instalar WordPress implica conocer las variables de conexión y con esto ya las tenemos. Por ahora no nos hará falta nada más. Tenemos nuestra base de datos para instalar nuestro sitio web WordPress.

5. Configuración del servidor web y los hosts virtuales

Ahora toca entretenerse con nuestro Apache. Si tuvieras que utilizar la instancia para una sola web te quitas la cuestión de modificar el archivo de virtual hosts (permite servir más de un sitio web desde servicio) que es lo más delicado. De cualquier forma, al conectarnos a nuestra instancia por SSH, tendremos que localizar los archivos de configuración, que en este caso se encuentran en el directorio stack. Ahí vamos a encontrar el directorio apache2 con los archivos más importantes de configuración del servicio (directorio conf/):

Amazon Web Services archivos configuración Apache

Una gran ventaja de estos servicios es que nos permiten personalizar la configuración. Los alojamientos compartidos son convenientes pero pierdes control. En Apache el principal archivo de configuración es httpd.conf. Merece la pena entretenerse en leer todo su contenido para comprender mejor como está operando nuestro servidor web. Como httpd.conf es un archivo de texto, lo podemos leer desde consola (comando vi httpd.conf, recuerda que con vi, para salir es teclear :q y para salir guardando :wq, para modo inserción pulsar la tecla i y salir con tecla esc).

Un vistazo a este archivo puede ser desalentador, pero muy revelador. Consiste en diferentes directivas, muchas de ellas “comentadas” con un # y por tanto no cargadas en Apache. Si vas leyendo entenderás como está operando el servicio. Lo que más nos interesa (la inmensa mayoría no se toca).

ServerRoot “/opt/bitnami/apache2” -> La raíz de nuestro servidor en el directorio.
Listen 80 -> Puerto TCP 80, el habitual para web.
LoadModule -> Son los módulos que se cargan en nuestro servicio (muchos comentados para no ser activados).Aquí se encuentran cosas muy interesantes.
DocumentRoot “/opt/bitnami/apache2/htdocs” -> Donde se localizan los archivos que servirá nuestro servicio web. Dentro de esta directiva es importante la de AllowOverride, ya que nos interesa mucho para que nuestro WordPress funcione correctamente (más luego).

Hacia el final encontramos la inclusión del archivo que interesa no perder de vista.


Include "/opt/bitnami/apache2/conf/bitnami/bitnami.conf"

5.1 Configuración de hosts virtuales

El archivo que debemos usar para nuestros hosts virtuales. Se encuentra en

~/stack/apache2/conf/extra/httpd-vhosts.conf

Este archivo contiene la configuración general de nuestros host virtuales. Es el archivo que nos va a permitir introducir todo lo relacionado con la forma en la que servimos los archivos desde nuestro directorios. Es importante acudir a la documentación para ver todos los valores disponibles y configuraciones personalizadas. En mi caso un ejemplo básico para esta web es:

ServerAdmin [mi correo electrónico]
DocumentRoot “/var/www/javierarcheni.com”
ServerName javierarcheni.com
ServerAlias www.javierarcheni.com
.– (sigue…)

Si queremos servir la web con SSL deberemos tener también una directiva para ese servicio, que incluya las claves de los certificados (más luego).

SSLEngine on
SSLCertificateFile “/etc/lego/certificates/javierarcheni.com.crt”
SSLCertificateKeyFile “/etc/lego/certificates/javierarcheni.com.key”
.– (sigue…)

El archivo que comentaba antes no perder de vista /apache2/conf/bitnami/bitnami.conf, lo indicaba porque he comprobado que necesito introducir ahí los valores que normalmente coloco en el .htaccess de la raíz de cada web. Por ejemplo directivas de caché de recursos. Es posible que exista otra manera, pero es la que a mí me ha funcionado.

Cada vez que modificamos archivos de configuración de nuestro Apache es requisito fundamental reiniciar el servicio, lo hacemos con un sencillo comando:


sudo /opt/bitnami/ctlscript.sh restart

Instalación SSL con Let’s Encrypt

Existen servicios que ayudan a instalar un certificado con Let’s Encrypt en tu servidor. En mi he seguido los pasos que indican en esta guía de Bitnami. El proceso, si lo sigues paso a paso y con tranquilidad no es complicado, ya que deja el grueso de la operación a Lego, un cliente hecho para generar certificados en tu servidor con Let’s Encrypt.

Como comento el proceso está bien documentado en la guía de Bitnami y es redundante ponerlo aquí. Lo principal es generar las claves y colocarlas en las configuración de los hosts virtuales, ya que como es lógico, hay que generar claves para cada dominio por separado (como aparece más arriba)


SSLEngine on
SSLCertificateFile "/etc/lego/certificates/javierarcheni.com.crt"
SSLCertificateKeyFile "/etc/lego/certificates/javierarcheni.com.key"

Si sigues la guía, verás que Let’s Encrypt genera una caducidad de 90 días por las claves, pero la solución es crear una tarea programada que ejecute un script para generar de nuevo las claves. En la guía vienen los detalles. De verdad, si sigues los pasos, es muy fácil.

6. Instalación de los sitios web

En estos momentos tenemos nuestra instancia de AWS lista para poder instalar en las mismas condiciones de un host compartido. Si tenemos acceso sFTP/SCP podremos hacer un copia de los archivos a cada raíz de la web. Crea una carpeta en htdocs (DocumentRoot) de tu Apache por cada sitio. Si usas un Duplicator o similar, tendrás que cambiar temporalmente los permisos de las carpetas para que pueda escribir los scripts en las carpetas destino (recuerda cambiarlos).

Otro cambio importante para nuestro sitio web WordPress es modificar la directiva AllowOverride a All, ya que de lo contrario no dejará que WordPress haga cambios en las direcciones y por tanto no nos funcionará. En el archivo httpd.conf, asegúrate de cambiar a All esta directiva:


AllowOverride All

Conclusión

El proceso de cambiar tu sitio web a AWS supone un cambio de mentalidad. Esta guía no pretender ser la única que consultes, tan solo pretende dar una visión rápida de como hacerlo. No dejes de consultar la documentación oficial y los ejemplos que muestran. Con un poco de trabajo podrás tener un sitio web funcionando con módulos interesantes como PageSpeed, mod_security y con un servidor en HTTP/2. El rendimiento es excepcional y verás como la experiencia de los visitantes mejora muchísimo.