El servicio de EC2 de Amazon está cada vez más de moda, y no solo eso, también es cada vez más sencillo de manejar. Ofrece muchas ventajas, pero la que más es la flexibilidad. Si empezamos un servicio online y necesitamos un servidor, no tendremos que pensar en el futuro adquiriendo un servidor muy potente para los posibles usuarios que acaben llegando, sino que podremos ir aumentando el tamaño del servidor a medida que nuestro servicio crezca. Y todo con un precio bastante asequible, que se mide por tiempo de uso. Como el objetivo de este post no es explicar cómo se factura, os recomiendo que leáis lo que dice Amazon al respecto (en inglés, eso sí).
Una pequeña nota antes de meternos en el tema: no soy un experto en servidores, ni en hosting, ni en Linux. Solo trato de apañarme como puedo, usando Google y probando. Con esto quiero decir que lo que veáis aquí no tiene por qué ser una guía perfecta de cómo crear un servidor web en Amazon Web Services EC2. Seguro que hay pasos que no son necesarios o que me dejo algo que debería hacer. Si es así, os pido que lo comentéis para que pueda mejorar esta especie de guía.
Actualización: el sitio de ejemplo que creé para esta guía ha sido desconectado. Me suponía un pequeño coste económico que, si bien no era mucho (sólo los volúmenes), no veo el motivo por dejarlo más tiempo. El que no esté activo no afecta a que la guía siga siendo válida.
El objetivo será crear un servidor que pueda hospedar un blog de WP. Así que instalaremos Apache, PHP, MySQL y haremos la configuración necesaria. También instalaremos Webmin, pero no es obligatorio. Todo lo he hecho usando Mac OS, por lo que si usáis Windows, la manera de conectar será distinta. Pero seguro que encontráis cómo usar Putty para conectar con vuestro servidor 😉
Empecemos.
Creando el servidor EC2
Suponiendo que ya estéis en el panel de control de AWS, veréis algo parecido a esto:

Veréis que hay un botón de «Launch Instance», que será lo que nos permite crear un nuevo servidor. Pero antes de eso, tened en cuenta una cosa: si os fijáis, arriba a la derecha de la pantalla, veréis al lado de vuestro nombre la zona en la que estáis trabajando. Es decir, por así decirlo, en qué datacenter estáis y, por ende, dónde crearéis los servidores, veréis los que hay, etc. Lo más lógico sería cambiar a la zona europea (Irlanda) pero en mi caso no lo hice. ¿Por qué? Es más barato en Estados Unidos que en Europa. El único punto negativo es la velocidad de acceso, ya que si vuestro público está en Europa, lo lógico es que lo tengáis ahí, pero en mí caso eso no me preocupa.
Así que una vez decidido dónde queréis trabajar, acordaos, ya que cada vez que entréis iréis a la zona de EE.UU. y no a la de Europa, y no os quiero ni contar el susto que os podéis llevar al ver que no hay servidores.
Bien, dicho esto, hacemos click en «Launch Instance». Al hacerlo, veremos una pantalla que nos pregunta qué tipo de asistente queremos. Para la guía cogeré el Classic Wizard.

Hacemos click en «Continue» y vemos 4 pestañas en la siguiente pantalla. Para el ejemplo, nos quedamos en «Quick Start» y seleccionamos la Amazon Machine Image (AMI) de Amazon, la de 64 bits. Hay más, y de hecho encontráis de todo, pero cogemos la más sencilla y completa.

Al seleccionarla, encontramos otra pantalla con distintas opciones, que dejaremos tal y como aparecen aquí (suelen venir por defecto, pero revisadlo por si acaso). Para probar, el servidor tipo T1.Micro, que sale muy barato, o gratis, y si luego veis que necesitáis algo más potente, podéis cambiarlo sin perder nada.

La siguiente pantalla, igual, sin tocar nada:

En la siguiente, tendremos que editar las particiones, para añadir otro volumen más:

Fijaos en las opciones que pongo en la pestaña de EBS Volume, donde crearemos otro volumen nuevo de 10 GB, llamado /dev/sdk, de tipo estándar. Utilizaremos ese volumen para los archivos del servicio que vayamos a hospedar, la base de datos MySQL, etc.

Haced click en «Add» de manera que quede así:

En la siguiente pantalla podemos definir etiquetas que identifiquen nuestro servidor. Por defecto, viene con la etiqueta Name, donde pondréis lo que queráis, eso sí, que sirva para identificar el servidor.

En la siguiente pantalla, mucho cuidado, que es crítico. Si no se hace bien, no podréis entrar a través de SSH con vuestro servidor. Lo que vamos a hacer es crear unos ficheros de claves, y descargar el nuestro. Otro quedará en el servidor para conectarnos. Así que ponemos un nombre de usuario y descargamos el fichero.

Una vez descargado nuestro fichero, pasaremos a la siguiente pantalla, donde configuraremos el cortafuegos del servidor. Por defecto, de cara al exterior nada está abierto, así que tendremos que crear las siguientes reglas:

Y ya está, veremos una pantalla resumen y si todo está como queremos, le damos a «Launch» y cerramos el asistente.

Volviendo al panel de control de AWS EC2, si vamos a Instances, veremos que está el servidor que acabamos de crear. Pasados unos minutos, deberíamos ver que está en marcha:

De aquí, un dato que tenemos que guardar, es el de Public DNS, que en nuestro caso es ec2-23-20-203-117.compute-1.amazonaws.com.
Bien, aquí termina la parte web. Ahora vamos con el Terminal de nuestro Mac OS. Recordad que para Windows, podéis usar Putty y que una vez conectados con el servidor, los comandos serán exactamente los mismos.
Abrimos una pantalla de Terminal, y navegamos a la carpeta en la que tenemos el fichero de claves que nos bajamos. En nuestro caso, el fichero es nombreusuario.pem.
Antes de tratar de usar ese fichero, tendremos que cambiar los permisos, así que:
chmod 600 nombreusuario.pem
Para que quede tal que así:

Ahora, nos conectamos con SSH:
ssh -i nombreusuario.pem ec2-user@ec2-23-20-203-117.compute-1.amazonaws.com
Fijaos en que ponemos la DNS Pública que copiamos antes. Si todo va bien, deberíamos ver esto:

Así que vamos con la configuración. Los que usen Windows, ya pueden seguir desde aquí.
Lo primero, actualizar yum para asegurarse de que usamos las últimas versiones y fuentes:
sudo yum update
No os olvidéis de usar siempre sudo.
Instalando MySQL
sudo yum install mysql-server mysql
Instalando soporte XFS
Será lo que usemos para la partición que crearemos con el volumen EBS que creamos al principio:
sudo yum install xfsprogs
grep -q xfs /proc/filesystems || sudo modprobe xfs
Y luego a crear la partición. Acordaos que pusimos que el volumen se llamaba /dev/sdk.
sudo mkfs.xfs /dev/sdk
sudo mkdir /mnt/data
sudo mount /dev/sdh /mnt/data -o noatime
Editamos fstab para asegurarnos que la partición se monta cada vez que iniciamos el servidor:
sudo vi /etc/fstab
Nota: usamos vi como editor, aquí tenéis algunos comandos básicos.
Añadimos al fichero:
/dev/sdh /mnt/data xfs noatime 0 0
Creamos el directorio para MySQL y cambiamos el dueño para que sea de MySQL:
sudo mkdir -p /mnt/data/mysql
sudo chown -R mysql.mysql /mnt/data/mysql
Configurando MySQL
sudo vi /etc/my.cnf
Comentamos la linea (con # delante)
#datadir=/var/lib/mysql
y ponemos esta
datadir=/mnt/data/mysql
Y añadimos algunos parámetros más. Algunos obligatorios, otros no tanto:
skip-external-locking
long_query_time=1
slow_query_log
slow_query_log_file=/var/log/log-slow-queries.log
log-bin=mysql-bin
server-id= 1
Otros parámetros que habría que añadir son los de memoria. Para el caso que nos ocupa usaré estos, pero recordad que esto depende mucho de cada instalación.
key_buffer_size = 128M
max_allowed_packet = 3M
table_open_cache = 64
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 16M
thread_cache_size = 8
query_cache_size= 32M
thread_concurrency = 8
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M
innodb_additional_mem_pool_size = 8M
innodb_log_buffer_size = 4M
Creamos el fichero para guardar los logs de las queries lentas:
sudo touch /var/log/log-slow-queries.log
sudo chown mysql.mysql /var/log/log-slow-queries.log
Nos aseguramos de que MySQL arranca cuando se inicie el servidor
sudo /sbin/chkconfig --levels 235 mysqld on
Y lo arrancamos:
sudo service mysqld start
Conectar con MySQL
Si todo ha ido bien, al hacer esto:
mysql -u root
Deberíamos conectar. Así que vamos a poner un password para root (poned el que queráis, pero recordadlo):
USE mysql
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('PasswordSecreto');
Borramos usuarios anónimos y sin contraseña, por si acaso:
DELETE FROM user WHERE password = '';
DELETE FROM user WHERE user.user= '';
Hacemos un flush de los permisos y borramos la base de datos de test, si la hubiera:
FLUSH PRIVILEGES;
DROP DATABASE test;
Instalando Apache y PHP
Instalaremos también GCC, por si acaso se necesita para algunas extensiones de PHP:
sudo yum install gcc
sudo yum install make
sudo yum install httpd mod_ssl
sudo yum install php
Extensiones de PHP
sudo yum install php-devel php-pear
sudo yum install pcre-devel
Soporte APC, con las opciones por defecto.
sudo yum install httpd-devel
sudo pecl install apc
Activamos APC, creando un fichero nuevo
sudo vi /etc/php.d/apc.ini
Y añadiendo las lineas:
; Enable APC extension module
extension=apc.so
Acceso a MySQL con PHP
sudo yum install php-mysql
Librerías gráficas
sudo yum install php-gd
Soporte XML y DOM
sudo yum install php-xml
Y soporte de localización
sudo yum install php-mbstring
Creamos el usuario y su carpeta donde alojaremos el blog
sudo useradd -d /mnt/data/usuarioBlog -g ec2-user -s /bin/bash -m usuarioBlog
El usuario que creamos es usuarioBlog dentro del grupo ec2-user.
Configurando Apache
sudo vi /etc/httpd/conf/httpd.conf
Y modificamos/añadimos como sigue, teniendo en cuenta que algunos parámetros hay que adaptarlos a cada instalación:
ServerTokens Prod
TraceEnable Off
KeepAlive On
MaxKeepAliveRequests 256
KeepAliveTimeout 10
User usuarioBlog
Group apache
ExpiresActive on
ExpiresDefault «access plus 1 months»
FileETag none
Creación del host virtual
sudo vi /etc/httpd/conf.d/vhosts.conf
Para nuestro caso, pondré un subdominio (ejemploAWS.dehaller.ch) para el que me tendré que asegurar que hay un servidor DNS que dice cuál es la IP a la que tendrá que ir. Eso no lo explicaré en este post, pero así tened en cuenta que tendremos que en el panel de control de EC2 tendremos que crear una IP y asociarla a nuestro servidor. Lo haremos al final.
NameVirtualHost *:80
ServerName ejemploAWS.dehaller.ch
DocumentRoot /mnt/data/usuarioBlog/
Configuración de PHP
sudo vi /etc/php.ini
Cambiamos algunos parámetros
expose_php = Off
memory_limit = 128M
error_log = /var/log/php-error.log
Creamos el fichero del log de errores
sudo touch /var/log/php-error.log
sudo chown usuarioBlog.apache /var/log/php-error.log
Rotación de los logs
sudo vi /etc/logrotate.d/httpd
"/var/log/php-error.log" /var/log/httpd/*log {
rotate 5
size=10M
missingok
notifempty
sharedscripts
delaycompress
postrotate
service httpd restart > /dev/null || true
endscript
}
Configuramos que el servidor Apache arranque con cada inicio y lo arrancamos.
sudo /sbin/chkconfig --levels 235 httpd on
sudo service httpd start
Volvamos al panel de EC2 para crear la IP
Este paso se puede hacer al principio, o al final, pero si lo hacéis al principio, a la hora de conectaros usando SSH deberéis poner la IP que habéis creado.
Para crearla, muy sencillo, vamos a «Elastic IP»:

Hacemos click en «Allocate New Address»

Ponemos tipo EC2 y pulsamos Yes, Allocate. Al hacerlo, veremos la IP que ha creado y pasaremos a asociarla al servidor que hemos creado, usando la opción de «Associate Address».
Y ya está.
A probar si arranca
Bien, si hemos hecho todos los pasos y no ha habido ningún error, y si añadimos la configuración DNS que tenemos que hacer, al escribir la dirección http://ejemploaws.dehaller.ch debería salir esto:

Descargamos e instalamos WordPress
Volvemos al SSH para descargar WordPress. Usando el enlace de descarga disponible en WordPress.org (http://wordpress.org/latest.tar.gz), y en el directorio home de ec2-user (que llegáis según os conectáis por SSH).
sudo wget http://wordpress.org/latest.tar.gz
Lo descomprimimos:
sudo tar xvf latest.tar.gz
Y lo movemos al directorio del usuario del blog, es decir, /mnt/data/usuarioBlog:
sudo mv wordpress/ /mnt/data/usuarioBlog/
Cambiamos el dueño de los ficheros:
sudo chown -R usuarioBlog.ec2-user /mnt/data/usuarioBlog/
Configurar WordPress
Aquí no difiere en nada de lo que ya hay, salvo que tenemos que tener un usuario de BBDD ya creado (mejor no usar root). Para eso, tendremos que crearlo en MySQL. Acordaos de usar la contraseña que pusimos en su momento.
mysql -u root -p
CREATE USER 'usuarioBD'@'localhost' IDENTIFIED BY 'Contraseña_nueva';
Creamos la BBDD.
CREATE DATABASE BD_wordPress
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
Damos los permisos de acceso al usuario que hemos creado para la nueva BBDD
GRANT ALL PRIVILEGES ON BD_wordPress.* TO 'usuarioBD'@'localhost';
Y ahora podemos visitar la URL http://ejemploaws.dehaller.ch/wordpress y nos aparecerá el asistente del WordPress. Seguimos las instrucciones, con todos los datos que tenemos recordando poner las contraseñas correctas y un email correcto, y listo.






Y todo listo, un resumen de lo hecho
- Creación del AWS EC2 con una partición específica para los datos
- Instalar Apache, MySQL, PHP y las extensiones
- Configurar Apache, MySQL y PHP
- Crear y asignar una IP pública al servidor
- Descargar e instalar WordPress
- Crear una BBDD y un usuario para la BBDD
- Configurar WordPress
Soy consciente de que hay algunas cosas que no he explicado:
- DNS
- Instalación de PHPMyAdmin
- Instalación de Webmin
- Configuración de un servidor de correo, aunque para eso recomiendo Google Domains o, ahora que ya no es gratis con ellos, podéis probar con Outlook.com de Microsoft. Estoy haciendo pruebas y puede que me anime a hacer un post.
- Tareas de mantenimiento.
- ¿Algo más?
También he pasado por alto algunos temas básicos, como los permisos, usuarios, etc. No es el objetivo de este post el explicar cosas sobre la arquitectura de Linux, sobre todo porque yo no soy el más indicado para hacerlo al no tener los conocimientos necesarios. Tengo una base, pero poco más. Y además, para eso tenéis Google 🙂
Por último, a pesar de que he escrito este post al tiempo que creaba el servidor que hospeda el blog de ejemplo, puede que algunas instrucciones no queden claras. Si es así, no dudéis en decírmelo a través de los comentarios.
10 ideas sobre “Crear un servidor web en Amazon Web Services EC2”
Wow, vaya currada, yo estoy procrastinando con mi «temita» :s
Pues nada, ahora a migrar a un AWS mientras evitas tu temita (¡qué raro suena eso!) 😀
Jajaja, al final creo que he consumado la catástrofe, y sólo me había dado tiempo de cargar el 40% en crashplan… paradojas de la vida. Afortunadamente las fotos están a salvo.
Menos mal… Ahora qué vas a montar entonces? Vuelves a RAID?
Sí, voy a volver al RAID 1 por SW, estuve pensando si hacerlo por HW, ya que me lo permite la placa pero parece ser fakeraid, y por lo que he visto es más complejo de montar y, en principio, no aporta mejoras. ^_^
En este post has metido cosas más interesantes que en el curso de una semana que nos dieron hace 3 meses, que al final ni aprendimos a montar máquinas ni a balancear ni nada.
Gracias Alejandro.
Creo que tendré que hacer una nueva versión, ya que imagino que han cambiado un poco las cosas desde que hice esta guía, ya hace casi 4 años…