miércoles, 13 de febrero de 2013

Django Deployment mod wsgi Windows Apache y MySQL


Nota: Por el momento mi proceso lo realice utilizando las versiones de 32 bits, indicare datos adicionales de versiones en cada paso que haya utilizado.

PASO 1: Instalar MySQL (versión 5 de 32 bits)

Descargando el instalador desde el sitio de Oracle, es probable que sea necesario que se registren.

PASO 2: Instalar Python (versión 2.7 de 32 bits)

Es importante configurar las variables de entorno para que desde la consola en cualquier lugar podamos utilizar solo la palabra python para ejecutar.


PASO 3: Instalar Python-MySQLdb (32 bits)

Se puede probar si quedo instalado entrando en python y utilizando:
 >>> import MySQLdb
Si no hay errores quiere decir que vamos bien, en caso de que tengan problemas con la instalación de este módulo pueden seguir este post:
http://omaryahir.blogspot.mx/2012/10/python-y-mysql-en-os-x-mountain-lion.HTML


PASO 4: Instalar Django (versión 1.4.3 )

Se puede probar que funciona django entrando a Python y usando:
>>> import Django
Si no hay errores vamos bien :)


PASO 5: Instalar Apache (httpd-2.2.22-win32-x86-openssl-0.9.8t.msi)

Lo descargue de esta dirección:
http://apache.webxcreen.org//httpd/binaries/win32/
Una forma rápida de verificar que funciono es abrir en el navegador el sitio http://localhost, en mi caso lo instale en el puerto 80.


PASO 6: Descargar mod_wsgi (versión 3.3)

Se debe descargar del sitio http://code.google.com/p/modwsgi/

Obtendremos un archivo de extensión .so este archivo debemos copiarlo al directorio modules de nuestra instalación de Apache (En mi caso C:\Program Files (x86)\Apache Software Foundation\Apache2.2\modules).

Para mayor comodidad renombramos el archivo que probablemente se encuentre con este nombre: mod_wsgi-win32-ap22py27-3.3.so, lo cambiamos por mod_wsgi.so nada mas.
Ahora bien es importante elegir un directorio para nuestras aplicaciones mod_wsgi, en mi caso yo hice uno en C:\wsgi_app\


PASO 7: Cargar el modulo mod_wsgi

Para este proceso es necesario localizar el arhivo - httpd.conf - usualmente se encuentra dentro del directorio /conf/ de la instalación de Apache (En mi caso lo encontre en: C:\Program Files (x86)\Apache Group\Apache2\conf).

Una vez abierto con cualquier editor de textos en mi caso uso Sublime, localizar "LoadModule" al encontrar dicho texto nos daremos cuenta que es la instrucción que utiliza Apache para cargar sus módulos; agregaremos una instrucción similar al final de estas sentencias de LoadModule quedando de la siguiente forma:

----
LoadModule wsgi_module modules/mod_wsgi.so
----

NOTA: Es probable que necesites editar el archivo en otro lugar y luego copiarlo al directorio en caso de que tengas restringido la modificación de archivos en el directorio donde se instaló el Apache.


PASO 8: Agregando en el archivo httpd.conf el WSGIScriptAlias

Dentro del archivo que abrimos en el paso anterior - httpd.conf - localizaremos la palabra Directory después del bloque < Directory / >  agregaremos lo siguiente:

----
# Config mod_wsgi
WSGIScriptAlias /wsgi "C:/wsgi_app/wsgi_handler.py"
< Directory "C:/wsgi_app"  >
    AllowOverride None
    Options None
    Order deny,allow
    Allow from all

< / Directory >
----

Lo anterior quiere decir que accederemos a los sitios que coloquemos en el directorio que creamos utilizando por ejemplo: http://localhost/wsgi

Ahora probaremos si quedo instalado correctamente el wsgi, creamos el archivo: wsgi_handler.py con el siguiente contenido:

def application(environ, start_response):
    status = "200 OK"
    output = "Funciono !!!"
    response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

Una vez realizado lo anterior debemos reiniciar nuestro servidor Apache, lo cual podemos realizarlo desde el Apache Monitor, Si al reiniciar no hubo errores estamos del otro lado... :D

Algunos errores que me pasaron a mi:
- Use la versión 2.0 de Apache en un principio y no quizó cargar el archivo: mod_wsgi.so
- Otro error que tuve es que no le cambie el nombre al archivo por lo que no lo encontraba.

Bien, si no hubo errores vamos al navegador y colocamos:
http://localhost/wsgi/
Si ves el mensaje que dice Funciono !!!, entonces que crees... Funciono :)


PASO 9: Ahora si poniendo nuestro proyecto de Django

Hasta el paso anterior tenemos un servidor que tiene activado mod_wsgi y puede ejecutar archivos de python. Entonces ahora para colocar nuestros proyectos de Django regresaremos al archivo httpd.conf y vamos agregar otro directorio:
----
# MiProyecto
WSGIScriptAlias / "c:/wsgi_app/miproyecto/miproyecto/wsgi.py"
WSGIPythonPath "c:/wsgi_app/miproyecto"
< Directory "c:/wsgi_app/miproyecto"   >
   < Files wsgi.py >

      Order deny,allow
      Allow from all
   </Files >

< /Directory  >
----

Hasta aquí es probable que el proyecto funcione correctamente pero tendremos el detalle con los archivos estáticos por lo que agregamos lo siguiente:

----
Alias /static/ "c:/wsgi_app/miproyecto/static/"
----

#### ACTUALIZACION 15 FEB 2013
Me di cuenta de que si no se tienen los permisos correctos no se cargaran los archivos estáticos, por lo que se deben tener los permisos necesarios y además modificar el archivo httpd.conf quedando de la siguiente forma:

----
Alias /static/ "c:/wsgi_app/miproyecto/static/"
< Directory "C:/wsgi_app/miproyecto/static/"   >
      SetHandler None
      Order allow,deny
      Allow from all

< /Directory  >
----




Guardamos y reiniciamos.

Con lo anterior todo debe funcionar ya nadamas recuerda cambiar la variable DEBUG = False en el archivo settings.py


Casi lo olvido:El Administrador de Django tiene sus propios archivos estaticos y los busca en "/static/admin/" por lo que de acuerdo a lo que nos recomiendan en el sitio de Django:

"We strongly recommend using django.contrib.staticfiles to handle the admin files"

Una de las sugerencias es copiar los archivos a nuestro directorio por lo que en mi caso lo que hice fue copiar de:

"C:/Python27/Lib/site-packages/django/contrib/admin/static/admin/"

Al directorio donde tengo mis archivos estaticos:

"c:/wsgi_app/miproyecto/static/"

Con lo anterior el sitio de administración debe tomar los archivos estaticos.




Espero te sea de utilidad !




Referencias:
http://stackoverflow.com/questions/3777678/apache-mod-wsgi-django-setup-forbidden-you-dont-have-permission-to-access-my
http://pradyumnajoshi.wordpress.com/2009/06/09/setting-up-mod_wsgi-for-apache-and-django-on-windows/
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/

16 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. Hola gracias por el aporte, y aprovechando ojala que me puedas ayudar XD es que intento realizar la configuración pero en un host virtual "httpd-vhost" con una dirección de dominio como http://loginfacebook.com.mx/ esto por que estoy utilizando la api de Facebook en local y necesito un dominio. Lo anterior ya lo conseguí pero no logro cargar los archivos estáticos.

    Así es como tengo actualemente mi configuración

    ----
    WSGIScriptAlias / "C:/Developer/GitHub/apiFacebookDjango/settings/wsgi.py"
    WSGIPythonPath "C:/Developer/GitHub/apiFacebookDjango"
    < VirtualHost * : 80 >
    ServerName loginfacebook.com.mx
    < Directory "C:/Developer/GitHub/apiFacebookDjango">
    < Files wsgi.py >
    AllowOverride None
    Options None
    Order deny,allow
    Allow from all
    < / Files >
    < / Directory >
    Alias /static/ “C:/Developer/GitHub/apiFacebookDjango/public/static/”
    Alias /media/ “C:/Developer/GitHub/apiFacebookDjango/public/upload/”
    < / VirtualHost >

    ----
    y si me carga el sitio pero no logro cargar los archivos estáticos, si lo pongo de la siguiente forma genera un error y no carga apache



    ----
    WSGIScriptAlias / "C:/Developer/GitHub/apiFacebookDjango/settings/wsgi.py"
    WSGIPythonPath "C:/Developer/GitHub/apiFacebookDjango"
    < VirtualHost * : 80 >
    ServerName loginfacebook.com.mx
    < Directory "C:/Developer/GitHub/apiFacebookDjango">
    < Files wsgi.py >
    AllowOverride None
    Options None
    Order deny,allow
    Allow from all
    < / Files >
    < / Directory >

    Alias /media/ “C:/Developer/GitHub/apiFacebookDjango/public/upload/”
    < Directory “C:/Developer/GitHub/apiFacebookDjango/public/upload/” >
    SetHandler None
    Order allow,deny
    Allow from all
    < / Directory >

    Alias /static/ “C:/Developer/GitHub/apiFacebookDjango/public/static/”
    < Directory “C:/Developer/GitHub/apiFacebookDjango/public/static/” >
    SetHandler None
    Order allow,deny
    Allow from all
    < / Directory >
    < / VirtualHost >

    ----


    ResponderEliminar
    Respuestas
    1. Es probable que el problema se encuentre en los permisos de usuario con el directorio:

      C:/Developer/GitHub/apiFacebookDjango/public/static/

      Si no te permiten modificar permisos de archivos y directorios, es probable que ya tengas un directorio público, entonces puedes colocar ahí tus archivos estáticos y solo en la configuración del apache modificar la ruta o el path de los archivos.

      Saludos, espero te sirva !

      Eliminar
  3. Hola que tal de nuevo por acá, es que no me funcionaba pero ya quedo perfecto :) en si el problema se arreglo solo con poner
    WSGIScriptAlias / "C:/Developer/GitHub/apiFacebookDjango/settings/wsgi.py" dentro del VirtualHost XD así quedo mi VirtualHost al final (Por si alguien tiene el mismo problema espero pueda ayudar)

    ************** archivo "httpd-vhost" **********************
    NameVirtualHost *:80

    WSGIPythonPath "C:/Developer/GitHub/apiFacebookDjango"
    < VirtualHost * :80 >

    ServerName loginfacebook.com.mx

    Alias /static "C:/Developer/GitHub/apiFacebookDjango/public/static"
    Alias /media "C:/Developer/GitHub/apiFacebookDjango/public/upload"

    < Directory "C:/Developer/GitHub/apiFacebookDjango/public/static" >
    Order deny,allow
    Allow from all
    < / Directory >

    < Directory "C:/Developer/GitHub/apiFacebookDjango/public/upload" >
    Order deny,allow
    Allow from all
    < / Directory >
    WSGIScriptAlias / "C:/Developer/GitHub/apiFacebookDjango/settings/wsgi.py"


    < Directory "C:/Developer/GitHub/apiFacebookDjango/settings" >
    < Files wsgi.py >
    AllowOverride None
    Options None
    Order deny,allow
    Allow from all
    < / Files >
    < / Directory >
    ErrorLog logs/error.log
    LogLevel warn
    CustomLog logs/access.log combined

    < / VirtualHost >
    *******************************************

    en el archivo settings.py
    *************
    BASE_ROOT = os.path.abspath(
    os.path.join(os.path.split(__file__)[0]))

    MEDIA_ROOT = os.path.join(BASE_ROOT, '../public/upload')
    MEDIA_URL = '/media/'
    STATIC_URL = '/static/'
    ADMIN_MEDIA_PREFIX = '/static/admin/'
    STATICFILES_DIRS = (
    os.path.join(BASE_ROOT,'../public/static'),
    )
    TEMPLATE_DIRS = (
    os.path.join(BASE_ROOT, '../public/templates'),
    )
    *****************
    Y eso es todo saludos ! y gracias

    ResponderEliminar
    Respuestas
    1. Muchas gracias por compartir la experiencia y conocimientos, Saludos !

      Eliminar
  4. LoadModule wsgi_module modules/mod_wsgi.so esa linea me genera error y apache no puede encontrar el modulo , revise el nombre del archivo y esta = al que apunto en la configuracion

    ResponderEliminar
    Respuestas
    1. Verifica que tengas instalada la versión de xampp que recomienda Omar, en si el problema es con apache, las nuevas versiones de apache generan conflictos con mod_wsgi.so y por eso apache no inicia. A mi no me cargaba hasta que instale la versión recomendada y me funciono perfecto.

      Eliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. Al día de hoy he estado tratando de hacer que funcione mod_wsgi.so con la misma versión de apache pero con el detalle de que la versión de python es 2.7.11 y apache no logro hacer que apeche inicie ya que me marca lo siguiente en el error.log:

    [notice] Apache/2.2.22 (Win32) mod_wsgi/3.5 Python/2.7.11 configured -- resuming normal operations
    [notice] Server built: Jan 28 2012 11:16:39
    [notice] Parent: Created child process 468
    [notice] Child 468: Child process is running
    ImportError: No module named site
    [crit] (OS 1813)The specified resource type cannot be found in the image file. : master_main: create child process failed. Exiting.

    ¿Alguna recomendación?


    Gracias.

    ResponderEliminar
    Respuestas
    1. Saludos gracias por comentar, hay que revisar si las versiones son también compatibles de 32 bits, por otro lado el código que tienes de python hay que verificar que no tenga algún error, saludos espero pueda servir de guía, quedamos pendientes !

      Eliminar
  8. Hola Omar, tengo un problema con el apache me quedo en el paso 8. Probando que pudo haber sido, borre lo que se había editado en httpd.conf.
    Luego solo coloque solo la linea
    LoadModule wsgi_module modules/mod_wsgi.so y volvio a funcionar el apache
    luego quise agregar
    # Config mod_wsgi
    WSGIScriptAlias /wsgi "C:/wsgi_app/wsgi_handler.py"
    < Directory "C:/wsgi_app" >
    AllowOverride None
    Options None
    Order deny,allow
    Allow from all
    < / Directory >

    y se me cayo apache otra vez ;O;
    Porfiiis ayuda

    Saludos

    ResponderEliminar
  9. Hola Janeth, muchas gracias por contactarme, trata de revisar si te arroja algún error en los logs del apache, de momento solo se me ocurre comentarte que hay que tener cuidado con el texto ya que para poder publicarlo tuve que añadir unos espacios jeje, por lo que si solo se copia no va quedar correctamente lo añadí en el siguiente link:

    https://codeshare.io/daBWy

    ResponderEliminar
    Respuestas
    1. Si! eso era xd. Ahora tengo otra duda, para hacer el proyecto en la carpeta wsgi_app, hago un proyecto como manage.py startproject??

      Eliminar
    2. Hola Janneth, q bueno q funciono !!! :) puedes hacerlo así como dices, o bien si ya tienes el proyecto puedes copiar la carpeta dentro del directorio de wsgi_app. Por cierto en el post anterior se me paso comentarte que si gustas cuando termines el tutorial puedo publicar aquí el link para acceder a él si tu estás de acuerdo, para ayudar a más personas que estén trabajando con este gran framework :), saludos !

      Eliminar