Blog personal de Diego de Haller
Blog personal de Diego de Haller

Crear un servidor web en Amazon Web Services EC2

Amazon Web Services

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:

InstalacionAWS1
Panel de Control AWS

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.

InstalacionAWS2
Asistente

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.

InstalacionAWS3
Selección AMI

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.

InstalacionAWS5
Detalles del Servidor

La siguiente pantalla, igual, sin tocar nada:

InstalacionAWS6
Detalles del Servidor

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

InstalacionAWS7
Detalle partición

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.

InstalacionAWS8
Detalle creando EBS

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

InstalacionAWS9
Listado de particiones

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.

InstalacionAWS10
Etiquetas del 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.

InstalacionAWS11
Fichero de Claves

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:

InstalacionAWS12
Reglas de cortafuegos

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

InstalacionAWS13
Resumen

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:

InstalacionAWS15
Detalles de servidor

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í:

InstalacionAWS16
chmod

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:

InstalacionAWS17
¡Ya estamos conectados!

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»:

InstalacionAWS18
Elastic IP

Hacemos click en «Allocate New Address»

InstalacionAWS19
Tipo de IP

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».

InstalacionAWS20

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:

InstalacionAWS21
Bienvenido a Apache

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.

InstalacionAWS22
Asistente instalación WordPress
InstalacionAWS24
Asistente instalación WordPress
InstalacionAWS26
Asistente instalación WordPress
InstalacionAWS28
Asistente instalación WordPress
InstalacionAWS29
Asistente instalación WordPress
InstalacionAWS30
Asistente instalación WordPress

Y todo listo, un resumen de lo hecho

  1. Creación del AWS EC2 con una partición específica para los datos
  2. Instalar Apache, MySQL, PHP y las extensiones
  3. Configurar Apache, MySQL y PHP
  4. Crear y asignar una IP pública al servidor
  5. Descargar e instalar WordPress
  6. Crear una BBDD y un usuario para la BBDD
  7. 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”

Los comentarios están cerrados.