Mostrando entradas con la etiqueta deploy. Mostrar todas las entradas
Mostrando entradas con la etiqueta deploy. Mostrar todas las entradas

domingo, 12 de julio de 2015

Django: ubuntu + nginx + gunicorn + supervisor + mysql

Tengo que instalar en una maquina virtual con virtualbox un deployment de un proyecto que debo entregar dejaré aqui los pasos que me funcionaron, ya tenía un post de deployment con uwsgi, pero ha quedado un poco desactualizado.

Bien voy colocando cada uno de los comandos:

$ sudo apt-get install python-virtualenv

Hay algunas otras herramientas que necesitamos instalar para el uso de django en ubuntu:

$ sudo apt-get install mysql-server
$ sudo apt-get install libmysql++-dev
$ sudo apt-get install python-dev
$ sudo apt-get install python-mysqldb
$ sudo apt-get install build-essential python

Crear una carpeta donde tendremos nuestras aplicaciones web:

$ sudo mkdir -p /webapps/carpeta_proyecto
$ sudo chown administrador /webapps/carpeta_proyecto

Creamos nuestro directorio virtual:

$ cd /webapps/carpeta_proyecto
$ virtualenv venv
$ source venv/bin/activate

Cargamos en ese directorio una carpeta con el código de nuestro proyecto, en mi caso lo tengo en bitbucket por lo que usando este comando descargo el código.

(venv)$ git clone http://bitbucket.org/tu_usuario/miproyecto.git

De esta forma tendremos dos directorios uno con el nombre de nuestro proyecto <miproyecto> y por otro lado tendremos un directorio con el entorno virtual <venv>.

Ahora instalamos el entorno en mi proyecto tengo un archivo requirements.txt, pero igual mínimo necesitamos instalar django y la librería de mysql, lo instalamos usando pip.

(venv)$ pip install django
(venv)$ pip install python-mysql

Es probable que para el proyecto tengan que correr un python manage.py syncdb o migrate para que puedan cargar la base de datos del proyecto, hasta este punto debemos poder probar el proyecto y ver que se encuentre funcionando correctamente usando un runserver.

Una vez que lo anterior se encuentre funcionando vamos ahora a realizar directamente el deployment.

Primero iniciamos instalando gunicorn, para eso utilizamos:

(venv)$ pip install gunicorn

Podemos probar el funcionamiento de gunicorn utilizando:

(venv)$ cd miproyecto
(venv)$ gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080

NOTA: La carpeta miproyecto, es el directorio que django crea cuando ejecutamos un startproject.

Al ejecutar el comando anterior gunicorn inicia un servidor en el puerto 8080 para ejecutar nuestro proyecto, sin embargo puede ser que el contenido estático no funcione correctamente.

Ahora para hacerlo más dinámico realizamos lo siguiente, creamos un archivo en mi caso yo lo deje en carpeta_proyecto/deployment/gunicorn_run y le copiamos dentro el siguiente contenido:

#!/bin/bash

NAME="miproyecto_app"                                        # Nombre de la app
DJANGODIR=/webapps/carpeta_proyecto/miproyecto               # directorio del proyecto de Django
SOCKFILE=/webapps/carpeta_proyecto/deployment/gunicorn.sock  # Nos comunicaremos utilizando este unix socket
USER=miusuario                                               # Correr con el usuario
GROUP=grupousuario                                           # Correr como el grupo 
NUM_WORKERS=3                                                # Cuantos - worker processes - de Gunicorn 
DJANGO_SETTINGS_MODULE=miproyecto.settings                   # Archivo settings de Django
DJANGO_WSGI_MODULE=miproyecto.wsgi                           # Archivo WSGI del proyecto

echo "Starting $NAME as `whoami`"

# Activando el entorno
cd $DJANGODIR
source ../venv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Crear el directorio para correrlo en caso de no existir
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Iniciando Django Gunicorn
exec ../venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-


Posteriormente convertimos el archivo como ejecutable usando el comando:

(venv)$ sudo chmod u+x gunicorn_run

Para probar el gunicorn podemos ejecutar el archivo de esta forma hacemos lo siguiente:

(venv)$ ./gunicorn_run

Una vez que se haya logrado ejecutar sin problemas, ahora, instalamos supervisor.

(venv)$ sudo apt-get install supervisor

Después de instalar supervisor vamos a crear el archivo /etc/supervisor/conf.d/miproyecto.conf con el siguiente contenido:

[program:miproyecto]
command = /webapps/carpeta_proyecto/deployment/gunicorn_run               ; Comando para iniciar la app
user = miusuario                                                          ; Usuario que lo va ejecutar
stdout_logfile = /webapps/carpeta_proyecto/logs/gunicorn_supervisor.log   ; Ruta del archivo log
redirect_stderr = true                                                    ; Alamcenar stderr en el mismo log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8                           ; Establecer UTF-8 por default

Creamos el directorio logs y el archivo para almacenar el gunicorn_supervisor.log dentro del directorio de carpeta_proyecto.

(venv)$ mkdir /webapps/carpeta_proyecto/logs
(venv)$ touch /webapps/carpeta_proyecto/logs/gunicorn_supervisor.log

Posteriormente utilizamos para cargar el supervisor:

(venv)$ sudo supervisorctl reread
miproyecto: available
(venv)$ sudo supervisorctl update
miproyecto: added process group

Ahora para revisar el estatus del proyecto podemos utilizar:

(venv)$ sudo supervisorctl status miproyecto
miproyecto                            RUNNING    pid 2277, uptime 0:01:40

Podemos iniciar, parar o reiniciar el proyecto utilizando:

(venv)$ sudo supervisorctl stop miproyecto
miproyecto: stopped
(venv)$ sudo supervisorctl start miproyecto
miproyecto: started
(venv)$ sudo supervisorctl restart miproyecto
miproyecto: stopped
miproyecto: started

Ahora vamos con Nginx, para instalarlo utilizamos:
(venv)$ sudo apt-get install nginx

Para iniciar el servicio podemos utilizar:
$ sudo service nginx start

Con esto el servidor de nginx se activará, puede probarse, por omisión el puerto es el 80. Ahora bien lo que haremos es crear el archivo /etc/nginx/sites-available/miproyecto con el siguiente contenido:

upstream miproyecto_app_server {
  # fail_timeout=0 means we always retry an upstream even if it failed
  # to return a good HTTP response (in case the Unicorn master nukes a
  # single worker for timing out).

  server unix:/webapps/carpeta_proyecto/deployment/gunicorn.sock fail_timeout=0;
}

server {

    listen   80;
    server_name example.com;

    client_max_body_size 4G;

    access_log /webapps/carpeta_proyecto/logs/nginx-access.log;
    error_log /webapps/carpeta_proyecto/logs/nginx-error.log;

    location /static/ {
        # path to static folder         alias   /webapps/carpeta_proyecto/miproyecto/static/
    }
    
    location /media/ {
        # path to media folder
        alias   /webapps/carpeta_proyecto/miproyecto/media/;
    }

    location / {
        # an HTTP header important enough to have its own Wikipedia entry:
        #   http://en.wikipedia.org/wiki/X-Forwarded-For
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # enable this if and only if you use HTTPS, this helps Rack
        # set the proper protocol for doing redirects:
        # proxy_set_header X-Forwarded-Proto https;

        # pass the Host: header from the client right along so redirects
        # can be set properly within the Rack application
        proxy_set_header Host $http_host;

        # we don't want nginx trying to do something clever with
        # redirects, we set the Host: header above already.
        proxy_redirect off;

        # set "proxy_buffering off" *only* for Rainbows! when doing
        # Comet/long-poll stuff.  It's also safe to set if you're
        # using only serving fast clients with Unicorn + nginx.
        # Otherwise you _want_ nginx to buffer responses to slow
        # clients, really.
        # proxy_buffering off;

        # Try to serve static files from nginx, no point in making an
        # *application* server like Unicorn/Rainbows! serve static files.
        if (!-f $request_filename) {
            proxy_pass http://miproyecto_app_server;
            break;
        }
    }

    # Error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /webapps/carpeta_proyecto/miproyecto/static/;
    }
}

De la misma manera que en los archivos anteriores personalizamos el contenido donde el color esta en negritas.

Ahora creamos el symbolic link en la carpeta sites-enabled (Esta carpeta nos permite indicar a nginx cuales sitios están habilitados).

$ sudo ln -s /etc/nginx/sites-available/miproyecto /etc/nginx/sites-enabled/miproyecto

Posteriormente reiniciamos nuestro servidor nginx:

$ sudo service nginx restart

Si hay algún error hay que revisar los directorios de los archivos, por otro lado en caso de que aparezca la pantalla de bienvenida de nginx al momento de volver a probar es debido al archivo default, en caso de que no vayamos a utilizar podemos eliminar su archivo símbolico desde el directorio de sites-enabled, una vez realizado lo anterior reiniciamos de nuevo el servidor de nginx.

$ sudo service nginx restart

Posterior a esto deberá funcionar correctamente el sitio.


Espero te sea de utilidad !



Referencias:
http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/
http://michal.karzynski.pl/blog/2013/10/29/serving-multiple-django-applications-with-nginx-gunicorn-supervisor/

jueves, 8 de enero de 2015

unix: var run supervisor.sock or tmp.sock no such file o no encontrado

Después de haber cargado un servidor en suse con un deploy con Django sobre nginx, supervisor y gunicorn (Aquí la guía que seguí) tuvimos un proceso de reinicio de servidor y posteriormente al querer correr el nginx con el supervisor marcaba el error:

unix:///var/run/tmp.sock no such file

Buscando en internet encontré que también podría marcar el error de la siguientes formas:

unix:///var/run/supervisor.sock archivo no encontrado
unix:///var/run/supervisor.sock no such file

El detalle es que el supervisor tiene que ser reiniciado de forma manual de acuerdo a la referencia entonces se necesita realizar nuevamente el comando:

$ sudo supervisord

De esta forma se reiniciará y cargará nuevamente el supervisor, es importante recordar que se tiene que estar en el directorio del archivo supervisord.conf

Gracias a la referencia fue que encontré la solución.


Espero te sea de utilidad !


Referencias:
https://github.com/Supervisor/supervisor/issues/121


domingo, 6 de julio de 2014

Empaquetar aplicación con VirtualBox o redirección de puertos en NAT

Como es de costumbre tenía una situación y me pareció muy interesante como para registrarlo y que no se me vaya a olvidar; bien el detalle, es que, necesito entregar un par de aplicaciones web que he desarrollado.

La primera idea fue entregar un manual para que puedan montar su servidor web con MAMP, WAMP o XAMPP, sin embargo muchos usuarios no podían hacerlo siendo personas que no son de informática les causaba muchas dudas. Además que la implementación del código en este caso en php tenía errores de funcionamiento simplemente por las variaciones de MAMP, WAMP y XAMPP.

Pues bien ahora voy a intentar utilizando una maquina de VirtualBox, pero se me presentaba el problema de como acceder si tenía la configuración NAT.

VirtualBox tiene una opción de redirección de puertos:


Desde ahí puede configurarse la redirección de puertos:


O también puede utilizarse la línea de comandos desde tu equipo, cuando tienes virtualbox instalado tienes un comando de nombre VBoxManage, de esta forma puedes correr:

$ VBoxManage modifyvm "nombre de tu maquina" --natpf1 "guesthttp,tcp,,2080,,80"

Todo lo expuesto en las imágenes y en el comando anterior, lo que estamos haciendo es que cuando en nuestra maquina busquemos en el navegador 127.0.0.1:2080, el equipo va ir a la maquina virtual al puerto 80, mientras que en tu equipo el puerto 2080 es el que esta a la escucha.

Espero te sea de utilidad !



Referencias:
http://cjenkins.wordpress.com/2010/08/12/redireccion-de-puertos-con-virtualbox/
http://linuxtargz.blogspot.mx/2012/09/configurar-el-reenvio-de-puertos-con.html
http://aruljohn.com/info/virtualbox-access-guest-from-host-nat/

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/

sábado, 27 de junio de 2009

Problemas para crear archivos o una nueva clase en Netbeans

Otra vez el netbeans.conf, en mi post anterior tuve problemas para correr un proyecto web, bien ahora para agregar nuevas clases, y el problema esta en el netbeans.conf para accederlo checa el post anterior se encuentra dentro de una carpeta de nombre etc.

Y esta carpeta se encuentra dentro de los archivos del netbeans, trate de instalar la versión 6.7 y no siguio sin funcionar.

Ok, entonces para arreglar el problema debes editar nuevamente el netbeans.conf la línea:
#netbeans_jdkhome="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home"

Sigo buscando la solución ...
He posteado el problema en el sitio web de netbeans:
http://www.netbeans.org/issues/show_bug.cgi?id=167738

28 de Junio 2009

He encontrado la solución no me había dado cuenta que el # es para poner comentarios por lo que hay que regresar al archivo netbeans.conf que se encuentra denrto de la carpeta etc del contenido del paquete de netbeans. Y dejarlo de la siguiente forma:

# Default location of JDK, can be overridden by using --jdkhome < dir >:
netbeans_jdkhome="/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home"

martes, 23 de junio de 2009

Netbeans, Failed to deploy, Error al actualizar la librería de Java en Mac OS

El Netbeans puede que marque el siguiente error si actualizas la versión de Java:

FAIL - Failed to deploy application at context path
nbproject/build-impl.xml:550: The module has not been deployed.

Cuando intentas compilar un proyecto J2EE, despues de mucho buscar encontre la siguiente información:
http://forums.netbeans.org/post-38693.html

En ese foro resuelve el problema: Jason Harris

Que basicamente consiste en agregar la linea -J-Djava.io.tmpdir=/tmp en el archivo netbeans.conf.

Ejemplo de mi archivo que no necesariamente es igual al que tu puedes tener:

netbeans_default_options="-J-Dorg.glassfish.v3.installRoot=/Applications/NetBeans/glassfish-v3-prelude -J-Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-v2.1 -J-Dcom.sun.mysql.startcommand=/usr/local/mysql/support-files/mysql-admin.server -J-Dcom.sun.mysql.stopcommand=/usr/local/mysql/support-files/mysql-admin.server -J-Dcom.sun.mysql.startargs=start -J-Dcom.sun.mysql.stopargs=stop -J-Dcom.sun.mysql.port=3306 -J-Dorg.glassfish.v3.installRoot=/Applications/NetBeans/glassfish-v3-prelude -J-Dcom.sun.aas.installRoot=/Applications/NetBeans/glassfish-v2.1 -J-client -J-Xverify:none -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Dapple.laf.useScreenMenuBar=true
-J-Dsun.java2d.noddraw=true -J-Djava.io.tmpdir=/tmp"

Bien otro detalle q tuve es q no encontraba el archivo y para verlo en mac con el Finder debes localizar dentro de Aplicaciones el Netbeans 6.5.1 o el q tengas instalado a ese le das clic con botón derecho y en el submenu eliges mostrar contenido.

Aparecerá una ventana con una carpeta de nombre Contents navega la siguiente ruta:

/Contents/Resources/Netbeans/etc/netbeans.conf

Puedes abrir el archivo con TextEdit y editar dicha línea espero te ayude como a mi...