martes, 30 de septiembre de 2014

Django en Amazon Web Services (AWS)

Como sabemos Django es un framework  web de código abierto basado en Python, el cual nos simplifica significativamente la creación de sitios web dinámicos de buena calidad en un corto tiempo.Con solo instalar Django en nuestro equipo local podemos llevar adelante el desarrollo del sitio sin la necesidad de instalar un servidor web, esto es gracias a que Django incluye un servidor de desarrollo.

El problema surge a la hora de publicar nuestro sitio web desarrollado en Django, nos topamos con una infinidad de limitaciones por parte de los web hosting. A pesar de que en muchos casos promocionan su supuesta compatibilidad, es normal encontrar serias limitaciones relacionadas a determinadas bibliotecas de uso habitual en el framework.

En este post proponemos una manera de salir de este problema, contratando y administrando  un servidor virtualizado(VPS),el cual no es un servidor físico real, sin embargo, a diferencia del alojamiento compartido, en este tipo de alojamiento los usuarios tienen control de administración total del servidor.

Analizamos algunas de las alternativas que ofrece el mercado y optamos por utilizar el Amazon EC2. Al momento de escribir este post, el servicio ofrece de manera gratuita por un año una virtualización la cual es denominada microinstancia "t2micro". Les recomiendo leer las condiciones de la alternativa gratuita en el siguiente link http://aws.amazon.com/es/free/.

Una vez creada la cuenta en Amazon, nos dirigimos al panel de control https://console.aws.amazon.com.


Elegimos la opción EC2, una vez allí contamos con una interfaz que nos permitirá realizar una infinidad de tareas con nuestras instancias, comenzaremos por crear una, para ello presionamos el botón con la leyenda launch instance



En este momento se despliega una lista de sistemas operativos que podemos instalar en nuestro equipo. Recomendamos como primer experiencia elegir Ubuntu, cuenta con una comunidad muy grande y resultará sencillo administrarlo.


Haremos click en Siguiente hasta llegar a la página de Tag Instancia, en él cargaremos algún nombre al servidor, la idea de este nombre es poder identificarlo cuando tengamos más de uno.

NOTA: Recordar que si tenemos corriendo más de uno a la vez, se estaría extralimitando lo contemplado como gratuito.

Daremos algunos "siguientes" dejando los valores predeterminados hasta que llegamos a la página Configure Security group page (Configuración de la seguridad del grupo). Se le puede asignar un nombre Ej. "reglas_seguridad". A este grupo le vamos a agregar una regla relacionada a la apertura del puerto HTTP, hacemos click en add rule y seleccionamos HTTP en el menú desplegable. Esto abre la aplicación en el puerto 80, que es donde Django responde a las solicitudes HTTP.


Sólo resta hacer click en el botón Review and Launch y crear un nuevo par de claves para la instancia. Para crearla solo debemos asignarle un nombre y al momento de oprimir el botón Lauch Instance se descargará un archivo, el cual deberemos conservar siempre para poder acceder a nuestro servidor de manera remota. Es importante aclarar que el procedimiento para recuperar el archivo de llave es muy tedioso.

Debemos de esperar algunos segundos a la espera de que nuestro servidor se encuentre corriendo, una vez que se indica que su estado es running podemos proceder a conectarnos vía ssh. Antes de poder hacerlo, es importante modificar los permisos de acceso del archivo de la llave, en el caso de no hacerlo, fallará el proceso de conexión.

#chmod 400 llave.pem

Antes de poder conectarnos, debemos averiguar o bien nuestro DNS o nuestra dirección IP, para ello nos dirigimos al panel de instancias.



En nuestro caso utilizaremos para conectarnos, la dirección IP 54.69.16.26 y la llave denominada llave.pem 

# ssh -i llave.pem ubuntu@54.69.16.26 

Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sat Sep 20 18:27:49 UTC 2014

  System load:  0.0               Processes:           102
  Usage of /:   16.2% of 7.74GB   Users logged in:     0
  Memory usage: 23%               IP address for eth0: 172.31.47.166
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

81 packages can be updated.
37 updates are security updates.


Last login: Sat Sep 20 18:27:50 2014 from 181.46.239.195
Ya estamos conectados a nuestro servidor, sólo resta instalar algunos paquetes y podremos desplegar nuestro primer sitio Django. Antes que nada realizaremos una actualización de la información de los repositorios.

# sudo aptitude update

Una vez actualizados, instalaremos un paquete fundamental a la hora de trabajar con Python, llamado pip ya que con él es muy simple instalar bibliotecas de este lenguaje.

#sudo aptitude install python-pip

Probemos pip instalando Django en su última versión, si queremos especificar una versión distinta deberemos pasar la misma como parámetro.

#sudo pip install django

Ahora instalaremos Apache junto al módulo WSGI el cual nos permitirá ejecutar Python al recibir requests HTTP.

#sudo aptitude install apache2 libapache2-mod-wsgi

También instalaremos MySQL como motor de base de datos, es importante conservar la contraseña que se carga en el proceso de instalación de MySQL, ya que es la del usuario administrador.

#sudo aptitude install mysql-server python-mysqldb

A esta altura tenemos todo lo básico instalado, puede que en según  proyecto surja la necesidad de instalar bibliotecas adicionales, por lo pronto sólo nos resta crear un sitio de ejemplo y configurar al Apache para que lo sirva en la web.

Crearemos en el home del usuario Ubuntu un directorio con el nombre del sitio "ejemplo.com" una vez creado, nos posicionaremos dentro de él y ejecutaremos el comando startproject de Django.

#cd ~
#mkdir ejemplo.com
#cd ejemplo.com
#django-admin.py startproject ejemplo

Ahora debemos crear el archivo de configuración asociado a nuestro sitio de ejemplo. Utilizando algún editor de texto como nano o vim:

#sudo vim /etc/apache2/sites-enabled/ejemplo.com.conf

Dejamos preparado el código que se deberá pegar en él a efectos de simplificar. En futuros posteos explicaremos algunos de los aspectos relevantes de esta configuración.

WSGIScriptAlias / /home/ubuntu/ejemplo.com/ejemplo/ejemplo/wsgi.py
WSGIPythonPath /home/ubuntu/ejemplo.com/ejemplo 
<Directory /home/ubuntu/ejemplo.com/ejemplo/ejemplo>
    <Files wsgi.py>
        Order deny,allow
        Require all granted
  </Files>
</Directory>
<Directory /home/ubuntu/ejemplo.com/ejemplo/static>
    Require all granted
</Directory>
<Directory /home/ubuntu/ejemplo.com/ejemplo/media>
    Require all granted
</Directory> 

No olvidar salvar el archivo. A continuación reiniciaremos el servicio Apache a efectos de que levante esta nueva configuración.

#sudo service apache2 restart

Cuando el servicio vuelva a estar activo, al colocar en el navegador la dirección pública de la instancia, se verá la siguiente página.


No hay comentarios:

Publicar un comentario