Tras haber crecido un poco la web llegó la hora de mudarnos del servidor compartido a nuestro «propio computador». Tras una difícil elección escogimos Amazon Web Services, dada la creciente demanda y los futuros proyectos. Los invito a conocer cómo fue el proceso de configuración para que puedan montar sus propios sitios (se trata de montar un servidor GNU/Linux).
Nota: Publicación en base a programas disponibles en 2014. La AMI de Amazon Linux original fue dada de baja, por lo que se hizo una nueva publicación en base a su sucesora.
Qué es Amazon Web Services
Es un servicio de computación en la nube, al cual existen otras alternativas de grandes empresas como Windows Azure y Google Cloud Platform. AWS es usado por servicios reconocidos como Netflix, Dropbox, Reddit, Foursquare y Pinterest, entre otros.
Si bien se habla de computación en la nube, Amazon cuenta en estos momentos con 9 centros de datos que nutren regiones determinadas del globo. El contar con uno para cada región implica una mejor tasa de transferencia de datos, de lo cual podremos aprovecharnos si hacemos uso de redes de distribución de contenido (CDN).
AWS tiene la gracia de ser altamente escalable, dado que uno puede elegir casi a modo de bloques de Lego las funciones que desea utilizar y su capacidad singular, y posteriormente ampliarla sin mayores dificultades. Por ejemplo, uno puede apagar un computador virtual, crear uno nuevo más potente y conectarle el disco duro del anterior.
Algunos de los servicios disponibles son:
Para saber qué está disponible gratis durante el primer año, haz clic aquí.
- EC2 – Elastic Cloud Computer: Los computadores que nos arrendará Amazon (Una máquina micro de Linux y otra de Windows gratuitas por 12 meses). Los computadores virtuales son llamados «instancias»
- ELB – Elastic Load Balancing: Si tienes varias EC2, ya sea en la misma región o en otra, puedes hacer que se distribuyan el trabajo entre ellas y no sobrecargar una
- S3 – Simple Storage Service: Almacenamiento de datos al por mayor, útil si debes mostrar contenido multimedia y necesitas que este se cargue rápidamente sin sobrecargar tu computador virtual
- Glacier: Copias de seguridad de tu equipo
- DynamoDB: Base de datos NoSQL
- RDS – Relational Database Service: Base de datos relacional (MySQL, Oracle, SQL Server o PostgreSQL)
- Route53: Servicio de DNS (Se paga por dominio)
¿Qué usaremos?
Lo más básico es usar un computador de EC2 (PC micro gratis durante un año con 1GB de RAM. Si todo queda bien configurado, cobrarían solo por consumo de ancho de banda superior a los 15GB mensuales), el cual lo configuraremos con una distribución de Linux basada en RedHat.
Considerando el costo del resto de los servicios, haremos uso de una herramienta de terceros llamada CloudFlare para administrar el servicio de DNS. Para el segundo año se recomienda hacer un pago de reserva de la instancia, el cual te entrega un descuento atractivo.
Creando la computadora virtual
- Lo primero es decidir en que región ubicaremos nuestro servidor. Los precios varían por región, siendo más caro Brasil que Estados Unidos. (En mi caso elegí Virginia)
- Ahora, en la consola de administración de AWS, escoge EC2. y aprieta el botón «Launch Instance»
- Escoge el «Classic Wizard» y selecciona la instancia «64-bit Amazon Linux AMI», es una distribución del tipo RHEL/CentOS. Recuerda usar una instancia micro t2 para aplicar a la capa gratuita del primer año.
- En zona puedes elegir una de las 3 o dejar al sistema ubicarte en una. Al crear el disco de EBS, escoge el tipo SSD (gratuito el primer año), ya que el magnético te empezará a cobrar IOPS y créeme que sale caro al mes (estando en la capa gratuita).
- Ponle un nombre al servidor y aprieta lanzar, la máquina comenzará el proceso de inicio.
- Ahora ve a Security Groups, en este Firewall abre los siguientes puertos (el 22 y el 80 son indispensables para configurarlo. Una vez montado, si lo deseas puedes dejar solo acceso HTTP):
- 20-21 (FTP) -> Solo si harás uso de clientes FTP como FileZilla
- 22 (SSH) -> Solo a tu IP (Desde este panel de administración se puede actualizar posteriormente la IP)
- 80 (HTTP) -> A todo el mundo (Para mostrar las páginas web)
- 443 (HTTPS) -> Solo si tu sitio usa este protocolo
- 1024-1048 (FTP) -> Solo si harás uso de clientes FTP como FileZilla
- 8080 (HTTP) -> A todo el mundo (Para mostrar las páginas web)
- Nuevamente en la página de administración, elige la opción de «Elastic IPs», y asocia la IP disponible con la máquina. Tienes una hora para hacerlo, o te empezarán a cobrar por no usarla (leíste bien, por no usarla).
Hora de acceder al computador
La máquina recién creada debiera estar encendida en un par de minutos. Para acceder a ella necesitarás conectarte por SSH (En Windows puedes usar Putty, en OS X y Linux usa la terminal incluida). El uso de esta herramienta requiere de un par de llaves, créalo y descárgalo en el panel de administración (es un par por cada región de AWS). Este archivo en formato .pem es tu identificación para acceder al equipo, ¡cuídalo y colócalo en la carpeta correspondiente en tu sistema!
Antes de conectarte debes averiguar el DNS público de la máquina en el panel de administración. Este lo puedes usar para acceder desde un navegador (al igual que la IP).
Para acceder por SSH debes escribir «ssh [email protected]», reemplazando el texto posterior al «@» con la dirección de tu instancia.
En caso de que quieras copiar archivos, puedes hacer uso de SCP una vez conectado por SSH. Si lo prefieres puedes instalar un servicio FTP, explicado más adelante.
- «scp DIRECCIÓN/A/ARCHIVO [email protected]:DONDE/PONER/ARCHIVO» Copia un archivo del computador nuestro al servidor
- «scp [email protected]:DIRECCIÓN/A/ARCHIVO DONDE/PONER/ARCHIVO» Copia un archivo del servidor al computador nuestro
Lo primero que realizaremos es una actualización de los paquetes instalados. Para esto escribe «sudo yum update» y el sistema buscará actualizaciones disponibles. Cuando termine de cargar la lista te preguntará si quieres instalarlas («y» para sí, «d» para después y «n» para no).
Algunos datos que te pueden ser útiles:
- El usuario predeterminado de esta instancia es «ec2-user».
- Con «sudo su» cambiaras al usuario root, no necesitando ingresar «sudo» en los comandos para que sean ejecutados con privilegios.
- El comando «sudo yum update -y» instalará todas las actualizaciones disponibles sin confirmar.
Instalando software necesario
Ahora que tenemos acceso a la máquina instalaremos los programas más usuales con los siguientes comandos.
- «sudo yum install -y httpd mysql mysql-server php» -> Instala Apache (httpd), MySQL (opcional, si usarás RDS bórralo) y PHP
- «sudo yum install -y php-mysql php-xml php-pdo php-odbc php-soap php-common php-cli php-mbstring php-bcmath php-ldap php-imap php-gd» (instala las extensiones para PHP listadas)
- Inicia los servicios recién instalados:
- «service httpd start» para iniciar el servidor web
- «service mysqld start» para iniciar la base de datos
- php no se inicia (no funciona de esta manera)
- Configuramos «httpd» para que se inicie junto al sistema al iniciar el equipo con «sudo chkconfig httpd on»
- Para confirmar que el cambio se aplico debemos escribir «chkconfig –list httpd». El sistema debiera estar «on» en los niveles 2, 3, 4 y 5, y «off» en el resto.
- Probamos el funcionamiento de Apache abriendo la dirección del servidor en un navegador.
- Ahora creamos un grupo de usuarios (llamado www) con «sudo groupadd www»
- Añadimos nuestro usuario al grupo con «sudo usermod -a -G www ec2-user»
- Cerramos sesión con el comando «exit» o cerrando la ventana del terminal, y la volvemos a iniciar conectándonos nuevamente por SSH.
- Escribimos «groups» para comprobar la pertenencia del usuario al grupo. Debiera aparecer «ec2-user wheel www»
- Ahora añadimos apache al grupo con «sudo usermod -a -G www apache»
- Añadimos a apache y al grupo a la carpeta /var/www y su contenido con «sudo chown -R apache /var/www» y «sudo chgrp -R www /var/www»
- Finalmente añadimos permisos de escritura con el comando «sudo chmod 2775 /var/www» y con «find /var/www -type d -exec sudo chmod 2775 {} +» ajustamos el grupo para subcarpetas futuras
- Y cambiamos recursivamente los permisos de escritura de archivo para el grupo con «find /var/www -type f -exec sudo chmod 0664 {} +».
Configuramos Apache
- Esto depende mucho del servidor y web que estés montando. Te recomiendo averiguar que cambios necesitas para tu propio sitio web antes de modificarlo.
- Para modificar el archivo escribe «sudo nano /etc/httpd/conf/httpd.conf».
- Guardamos los cambios y reiniciamos apache con «sudo service httpd restart»
Configuramos PHP
- Escribe «sudo nano /etc/php.ini»
- Cambia los ajustes de seguridad y memoria
- expose_php = Off
- memory_limit = 128M
- error_log = /var/log/php-error.log
Probaremos la instalación de PHP
- Escribe «cd /var/www» para ir al directorio de los archivos de la web
- Teclea «echo «<?php phpinfo(); ?>» > /var/www/html/phpinfo.php», se creará un archivo prerelleado con cierto texto
- Ahora ve a la URL «ec2-ipinstancia.compute-1.amazonaws.com/phpinfo.php» (recuerda reemplazar parte de la dirección con la tuya). Debiera salir una página morada con información respecto a la versión de PHP ejecutándose.
- Finalmnete, remueve el archivo por razones de seguridad con «rm /var/www/html/phpinfo.php»
Para configurar MySQL
- Ejecuta «mysql_secure_installation».
- Se te pedirá ponerle una contraseña al usuario «root». Aprieta «y» para ponerla, (se escribe dos veces)
- Aprieta Y para eliminar las cuentas de usuario anónimo
- Aprieta Y para eliminar el acceso remoto a root
- Aprieta Y para remover la base de datos de prueba
- Aprieta Y para recargar la tabla de privilegios y guardar tus cambios
- Si quieres que se autoinicie junto a la instancia, escribe «sudo chkconfig mysqld on»
- Reinicia el servicio con «service mysqld restart»
Opcional:
Uso de SFTP
- Esto no requiere instalar ningún software adicional en nuestra instancia
- Lo primero es decirle donde se encuentra el archivo .pem al cliente que usaremos (En FileZilla se hace en Opciones/Conexión/SFTP, es probable que quiera transformar el formato del archivo, esto no sobrescribe el original (te pregunta que nombre ponerle al nuevo)
- A continuación, en Archivo/Gestor de sitios creamos un nuevo sitio colocando la dirección del servidor y el usuario que usamos para conectarnos por SSH. En modo escoje «Normal». Aquí podemos configurar también la carpeta que carga de manera predeterminada y otras cosas.
- Ahora probamos a conectarnos y subir un archivo
- Si te da error al transferir un archivo, intenta darle permisos al usuario con «sudo chown -R ec2-user /var/www»
Instalación servicio FTP
- Conectado por SSH instala vsftpd con «sudo yum install vsftpd»
- Asegúrate de tener abiertos los puertos para FTP nombrados arriba
- Modifica con «sudo nano /etc/vsftpd/vsftpd.conf» el archivo de configuración de vsftpd. Revisa lo siguiente:
- «anonymous_enable=YES» cámbialo a «anonymous_enable=NO»
- Añade al término del archivo:
- pasv_enable=YES
- pasv_min_port=1024
- pasv_max_port=1048
- pasv_address=<IP pública de tu instancia>
- Reinicia vsftpd con «sudo /etc/init.d/vsftpd restart»
- Configura vsftpd para que se inicie junto al S.O. con «sudo chkconfig –level 345 vsftpd on»
phpMyAdmin
Para instalar phpMyAdmin escribe «sudo yum –enablerepo=epel install phpmyadmin» y crea un «acceso directo» en la carpeta de apache con «sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin». Para acceder solo tendras que añadir phpmyadmin al final de la URL.
Por razones de seguridad puede que no se te permita acceder a phpMyAdmin a través de internet. Para acceder puedes crear un tunel temporal en GNU/Linux u OS X con «ssh -N -L 8888:127.0.0.1:80 -i [email protected]». Podrás acceder desde el navegador con http://127.0.0.1:8888/phpmyadmin Recuerda dejar abierta esta ventana del terminal hasta que termines de usar phpMyAdmin, ya que al cerrarla también lo hará el tunel.
Let’s Encrypt
En vista que la seguridad en la red se ha vuelto importante, un movimiento apoyado por múltiples empresas nos permite la generación de certificados SSL para conexiones seguras HTTPS de forma gratuita. El sistema sigue en beta, pero es posible configurarlo en la instancia de forma tal que se autosolicite un nuevo certificado al momento de la expiración (cada 90 días), automizatizando todo el proceso para no dejar fuera de línea nuestro sitio.
Lo primero es instalar Python con «yum install python27-devel git». Luego, clonamos el directorio de GitHub de Let’s Encrypt con «git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt» y ejecutamos el instalador con «/opt/letsencrypt/letsencrypt-auto –debug». Ignora el certificado que genera el instalador, ya que no resultará.
A continuación, generaremos un archivo de configuración con una clave aleatoria personal y privada, y con nuestro e-mail para validar el certificado. Escribimos entonces «echo «rsa-key-size = 4096″ >> /etc/letsencrypt/config.ini» y luego «echo «email = ________@____.com» >> /etc/letsencrypt/config.ini».
Ahora vamos a generar un certificado. Hay que generar uno para el dominio a secas y otro para el con www. Recuerda reemplazar los datos carpetasitio y sitio.com con los que te correspondan.
«/opt/letsencrypt/letsencrypt-auto certonly –debug –webroot -w /var/www/carpetasitio -d sitio.com -d www.sitio.com –config /etc/letsencrypt/config.ini –agree-tos». Al terminar, te dirá la fecha de expiración y la ubicación, y los archivos creados allí (normalmente dentro de /etc/letsencrypt/live/).
Ahora, vamos a configurar la renovación automática de los certificados. Para ello, vamos a editar las tareas cron con «sudo nano /etc/crontab». Debemos incluir un reinicio de apache, para de esa forma forzarlo a reconocer el nuevo certificado. En este archivo abierto con el comando anterior ingresaremos el siguiente texto:
# Renew SSL Certs
0 13 * * * ec2-user /opt/letsencrypt/letsencrypt-auto –no-bootstrap renew
# Refresh Server
10 13 * * * root apachectl -k restart > /dev/null 2>&1
En caso de que el sistema automático nos falle, podemos hacerlo manualmente con el comando «/opt/letsencrypt/letsencrypt-auto –no-bootstrap renew». Si nos da un error relacionado a «virtualenv», la solución suele ser instalar el paquete virtualenv a través de pip. Para ello instalaremos tanto pip como virtualenv con los siguientes comandos: «sudo easy_install pip» y «sudo pip install virtualenv».
Ahora nos falta lo más importante, empezar a usar los certificados recién generados. Para ello debemos modificar el archivo de configuración de apache con «sudo nano /etc/httpd/conf/httpd.conf». (Completar las partes marcadas con los datos correspondientes)
Listen 443
<VirtualHost *:443>
ServerAdmin ________@____.com
DocumentRoot /var/www/_______.com
ServerName _______.com
ServerAlias www._______.com# Logs
ErrorLog /var/www/logs/_______.com-ssl_error_log
CustomLog /var/www/logs/_______.com-ssl_access_log common# Certificates
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/___.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/___.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/___.com/chain.pem
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite «EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS»
</VirtualHost>
Y para finalizar, instalamos el paquete «yum install mod24_ssl» y reinicamos apache con «sudo apachectl graceful».
Montemos la web:
Este es el paso más fácil de todos. La carpeta «/var/www/http» es la que contendrá los datos de nuestro sitio web. Copia los archivos de tu página o un CMS (Sistema de administración de contenido, como WordPress y Drupal) aquí mediante un cliente FTP como FileZilla o SCP. (Puedes eliminar el resto de los archivos contenidos en esta carpeta sin problemas en este minuto). En el caso de instalar un CMS, puedes bajar directamente al servidor el archivo comprimido y descomprimirlo en la carpeta. Para hacer esto:
- Posicionate en la carpeta con «cd /var/www/http»
- Descarga la última versión del CMS desde la URL. En el caso de WordPress en inglés usa «wget http://wordpress.org/latest.tar.gz»
- Descomprime el archivo recién descargado con «tar xfz latest.tar.gz». WordPress suele descomprimirse a una carpeta llamada «wordpress» (Si cargas la URL del server con un «/wordpress» al final, debieras poder acceder a WordPress)
- Movemos el contenido de la carpeta WordPress a la raiz de la web con «mv wordpress/* ./»
- Eliminamos la carpeta «wordpress (ahora vacía) y el archivo descargado inicialmente con «rmdir ./wordpress/» y «rm -f latest.tar.gz»
Si usamos un CMS que requiera una base de datos, hay que creársela. Para eso:
- Abrimos mysql con «mysql -u root-p» y tipeamos la contraseña que le pusimos antes
- Creamos la base de datos con «create database NOMBREBASEDEDATOS character set utf8;»
- Le damos acceso a nuestro usuario con «grant usage on NOMBREBASEDEDATOS.* to USUARIO@localhost identified by ‘CONTRASEÑA’;»
- «grant all privileges on NOMBREBASEDEDATOS.* to USUARIO@localhost;»
Y finalmente añadimos estos datos en el programa de configuración que aparece al cargar la web, o modificando el archivo de configuración del CMS directamente.
Hagamos uso de dominios
Una de las opciones para poder hacer uso de nuestros dominios es recurrir al servicio Route53. Este servicio de Amazon nos cobrará mensualmente por cada dominio que registremos (sin importar los subdominios que le creemos).
Para registrar un dominio debes apretar sobre «Hosted Zones» y crear una nueva colocando el nombre del dominio sin el «http://» ni el «www» (osea, solo ravmn.cl). A continuación se te entregará un conjunto de delegación que deberas registrar en el proveedor del dominio (en el caso de los dominios .cl es nic.cl). Lo siguiente es configurar los dominios y otras redirecciones en «Record set». Aquí debes registrar, por ejemplo:
- Un registro de tipo A para «ravmn.cl» hacia la IP elástica de la instancia
- Un registro tipo CNAME para «www.ravmn.cl» hacia «ravmn.cl»
- Un registro tipo MX para «ravmn.cl» con todos los datos (cada uno por línea) en el campo value para el servidor de correo.
En caso de registrar más de un dominio apuntando hacia la instancia, hay que configurar Apache para que rediriga las peticiones de un dominio a una carpeta determinada. (Por ejemplo, el dominio principal a la raíz de «/var/www/http» y uno secundario a una subcarpeta) Para esto:
- Abrimos la configuración con «sudo nano /etc/httpd/conf/httpd.conf», buscamos la siguiente cadena y verificamos que se encuentre así (sin un # adelante):
- Listen 80
- Añadimos un <VirtualHost *:80></VirtualHost> por cada dominio que maneje el servidor, especificando la carpeta que le pertenecerá. (Recordar añadir los subdominios como el www para que sea detectado correctamente)
- <VirtualHost *:80>
- DocumentRoot /www
- ServerName www.ravmn.cl
- ServerAlias ravmn.cl
- </VirtualHost>
- <VirtualHost *:80>
- DocumentRoot /www/aniline.cl
- ServerName www.aniline.cl
- ServerAlias aniline.cl
- </VirtualHost>
- Guardamos los cambios y reiniciamos apache con «sudo service httpd restart»
buen detalle
Que buen post, tu publicación me ayudo a comprender como trabaja AWS. Muchas gracias.
No entiendo, por qué te cobran por no usar la Elastic IP? Además te cobran si la instancia está en OFF. Esté o no esté la Elastic IP asignada >:(
Wao gracias por tu publicación.
Genial esta instrucción, gracias!!