domingo, 11 de enero de 2015

virtualenvwrapper en mac osx

Para instalar virtualenvwrapper se debe hacer con pip, siguiendo estos comandos:

$ sudo easy_install pip
$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper

Es posible que pip o virtualenv ya los tengas instalados así que si es así puedes omitir esos pasos, ahora bien, aquí viene por que no me funcionaba a mi, debes editar el archivo ~/.bashrc o ~/.zshrc (si estas usando oh my zsh, altamente recomendable) y colocar la siguiente línea:


source /usr/local/bin/virtualenvwrapper.sh

Con lo anterior estará funcionando el virtualenvwrapper, al parecer todo el asunto esta que lo cargue antes, fue una forma que encontre de resolverlo, si encontraste alguna otra no dudes en compartirla.

Espero te sea de utilidad !


Referencias:

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


jueves, 11 de diciembre de 2014

Error occurred during initialization of VM Could not allocate metaspace: 1073741824 bytes SUSE Amazon AWS

Instalando Java en un servidor suse tuve el siguiente problema:

#java --version
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 bytes

Empezando para instalarlo descargue el rpm y seguí el procedimiento del siguiente sitio:
http://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jre.html#CFHIEGAA

Después de buscar en varios sitios, ejecutando el siguiente comando:

# java -XX:-UseCompressedClassPointers -XX:+PrintFlagsFinal LongSleep

Se ve un detallado del uso de memoria por flag, y me encontre que justo la línea:
 uintx CompressedClassSpaceSize                  = 1073741824                          {product}

Entonces siguiente los sitios de refencias, ejecutando la siguiente instrucción si opera correctamente java:

# java -XX:CompressedClassSpaceSize=10m -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

De esa manera le estoy indicando que solo use 10 megas para ejecutarlo, o también usando:

# java -XX:-UseCompressedClassPointers -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)


Referencias:
http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2014-April/011319.html
http://arabhardware.net/forum/showthread.php?t=391068
http://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jre.html#CFHIEGAA

martes, 2 de diciembre de 2014

Django, suse, nginx, Gunicorn y supervisor

Como siempre, por necesidad me veo en la tarea de implementar dentro de un servidor suse montado en un AWS EC2, el servicio de ngix para un proyecto en django usando gunicorn y supervisor.

Esta guía esta basada al 100% del video: https://www.youtube.com/watch?v=VDVNgivbvYk la diferencia es que en esta guía se está usando SUSE resolviendo el tema de instalación de nginx fuera de yast.

Lo primero que debemos considerar es que este funcionando python, django y virtual-env que se escapan a este post. Por lo que el proyecto debe estar funcionando si ejecutamos:

# python manage.py runserver 0.0.0.0:8000 

Para instalar gunicorn que puede ser usando la instrucción:

# pip install gunicorn


Posteriormente podemos probar si esta funcionando, entrando al directorio de nuestro proyecto de django y haciendo lo siguiente:

# gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080

________________________________
Nota:
Si lo queremos poner como servicio:
$ gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080 --pid /tmp/gunicorn.pid --workers=3 --daemon
Para detenerlo debemos verificar su id de proceso:
$ cat /tmp/gunicorn.pid
####
$ kill -9 ####
________________________________

Si entramos al navegador y usamos la ip del equipo deberiamos ser capacez de ver el proyecto en ejecución: http://IP-del-servidor:8080/

Ahora instalaremos supervisor para mantener todo el tiempo nuestro servidor activo.

El proceso para instalarlo es el siguiente:

# pip install supervisor

Una vez instalado usaremos el archivo supervisord.conf de referencia para obtenerlo usamos el siguiente comando:

# echo_supervisord_conf > ./supervisord.conf

Una vez obtenido lo editaremos usando el siguiente comando:

# vi supervisord.conf

Al final del archivo agregamos las siguientes líneas:

;CONFIGURACION BASICA GUNICORN
[program:gunicorn]
;ruta donde se encuentra el directorio virtual que ejecutara gunicorn
command=/home/ruta-a-virtualenv/virtualmachine/bin/gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080 --workers=3 --pid /tmp/gunicorn.pid
;Ahora indicamos el directorio donde se almacena el proyecto ...
directory=/home/ruta-al-pryecto/miproyecto/

Una vez teniendo el archivo configurado, podemos ejecutar el servicio usando:

# supervisord

Con eso el servicio esta en ejecución una forma de revisar que se encuentre en ejecución, es revisando que el archivo /tmp/gunicorn.pid se haya generado y tenga el número de proceso del servicio.

Otra forma de ver el servicio es usando el siguiente comando:

# supervisorctl

Para parar el servicio de supervisor:

# supervisorctrl stop gunicorn
________________________________
Nota: En caso de que necesites recargar el archivo de configuración (a mi me paso jeje), puedes entrar con el comando:
$ supervisorctl
Y posteriormente teclear reload:
supervisor> reload
Pedirá confirmar y posteriormente se recargará la configuración
________________________________

Hasta este momento siguiendo los link de referencias logre montar el servidor gunicorn con supervisor.

Ahora vamos a crear un archivo bash de nombre gunicorn_run en la raíz del proyecto django; con el siguiente contenido:

#!/bin/bash
NAME="miproyecto_app" # Nombre del proyecto
DJANGODIR=/home/ruta-al-proyecto/miproyecto #Directorio del proyecto
SOCKFILE=/home/rutal-al-proyecto/run/gunicorn.sock #Ruta del SockFile para nginx
USER=django  # Usuario que ejecute las instancias 
GROUP=django # Grupo del usuario que ejecute las instancias
NUM_WORKERS=3 # 2 * CPUs + 1
DJANGO_SETTINGS_MODULE=miproyecto.settings # Modulo settings del proyecto
DJANGO_WSGI_MODULE=miproyecto.wsgi # Nombre de la aplicacion para WSGI
echo "Iniciando $NAME como `whoami`"

# Activando el ambiente virtual
cd $DJANGODIR
source /home/ruta-a-virtualenv/virtualmachine/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Creando el directorio del archivo gunicorn.sock por si no existe
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Comando que ejecuta supervisor para correr el servidor gunicorn
exec /home/ruta-a-virtualenv/virtualmachine/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-



Una vez que completemos el archivo y llenemos las secciones que debemos personalizar aplicaremos los persmisos:

# chmod u+x gunicorn_run

Detenemos el gunicorn en caso de tenerlo activo con supervisor, (supervisorctl stop gunicorn) y actualizaremos el supervisord.conf, sustituyendo las líneas que habíamos agregado por:


;CONFIGURACION AVANZADA GUNICORN (Activa)
[program:gunicorn]
;ruta donde se encuentra el archivo bash
command=/home/ruta-al-proyecto/miproyecto/gunicorn_run
;usuario que ejecuta el bash y el comando
username=root
;log de eventos para la gestion de errores
stdout_logfiles=/home/ruta-al-proyecto/logs/gunicorn_supervisor.log
redirect_stderr=true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8

Una vez realizado lo anterior generaremos la carpeta de logs:

# mkdir /home/ruta-al-proyecto/logs/

Ahora iniciamos con la instalación de nginx en suse. Para realizarlo ejecutamos, los siguientes comandos:

# wget http://nginx.org/download/nginx-1.6.0.tar.gz
# tar xvf nginx-1.6.0.tar.gz
# ./configure
# make
# make install


----
Para hacerlo servicio se debe crear el siguiente archivo:

# vi /etc/init.d/nginx

Con el siguiente contenido:

#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/nginx/sbin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx
PIDFILE=/usr/local/nginx/logs/$NAME.pid
DAEMON_CONFIG=/usr/local/nginx/conf/nginx.conf

test -x $DAEMON || exit 0

set -e

case "$1" in
 start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --exec $DAEMON
        echo " started"
        ;;
 stop)
        echo -n "Stopping $DESC: "
        if [ -f $PIDFILE ]; then
                kill -15 `cat $PIDFILE 2>/dev/null`
        fi
        echo " stopped"
        ;;
 restart|force-reload)
        echo -n "Restarting $DESC: "
        if [ -f $PIDFILE ]; then
                kill -15 `cat $PIDFILE 2>/dev/null`
        fi
        sleep 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --exec $DAEMON
        echo " restarted"
        ;;
 status)
        echo "Status $DESC: "
        ps aux | grep -v grep | grep -v /bin/sh | grep $NAME
        ;;
 *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|status|restart}" >&2
        exit 1
        ;;
esac

exit 0

Le damos permisos de ejecución al archivo nginx:

# cd /etc/init.d/
# chmod +x nginx

Ahora lo que vamos hacer es modificar el archivo de configuración:

# vi /usr/local/nginx/conf/nginx.conf

Localizar la línea: # user  nobody

De esa línea eliminar el caracter '#'.

Una vez realizado lo anterior usaremos la instrucción para agregar la configuración:

# chkconfig -a nginx
# chkconfig --level 345 nginx on

Con lo anterior queda configurado el servicio y podemos iniciarlo o pararlo con las instrucciones:

# service nginx start  
# service nginx stop

Ahora lo que realizaremos será configurar el archivo del sitio:

# vi /usr/local/nginx/conf/nginx.conf

Dentro del archivo colocaremos lo siguiente sustituyendo la sección del servidor 80 o bien dejando el actual con 8080:

upstream miproyecto_app {
        # Este es el que conecta con gunicorn con nginx
        server unix:/home/rutal-al-proyecto/run/gunicorn.sock fail_timeout=0;
}

server {

        # Puerto de escucha
        listen 80;

        # Dominios que responden a esta configuracion
        server_name example.com

        # Configuracion customizada para la subida de statics
        client_body_in_file_only clean;
        client_body_buffer_size 32K;
        
        client_max_body_size 300M;

        sendfile on;
        send_timeout 300s;

        # Logs de eventos
        access_log /home/rutal-al-proyecto/logs/nginx-access.log;
        error_log /home/rutal-al-proyecto/logs/nginx-error.log;

        # Archivos estaticos
        location /static/ {
                alias /home/rutal-al-proyecto/static/;
        }

        # Archivos media
        location /media/ {
                alias /home/rutal-al-proyecto/media/;
        }

        # Procesando django
        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (!-f $request_filename) {
                        proxy_pass http://miproyecto_app;
                        break;
                }
        }

        # Error pages
        error_page 500 502 503 504 /500.html;
        location = /500.html {
                root /home/rutal-al-proyecto/;
        }



}

Necesitaremos levantar el servicio del gunicorn debemos recordar el proceso o levantarlo nuevamente es posible que necesiten entrar a la maquina virtual para entrar a supervisorctl start gunicorn, o bien es necesario también usar reload para que actualice el servicio con el archivo de configuración de supervisord.conf.

Nota: También es posible que necesitemos crear el archivo 500.html

Una vez levantado el supervisor con gunicorn, ahora levantaremos el servicio de nginx usando:

# service nginx restart

Ha sido toda una odisea en el camino casi me decido por dejarlo, pero igual funcionó, les agradezco si encuentran alguna mejora se agradece ya que hay varias cosas que seguramente puedan mejorarse.


Apuntes adicionales:

Apunte 1: Para ver servicios en ejecución en suse puedes utilizar:

$ ps aux | grep

Ejemplo:

$ ps aux | grep gunicorn

Con lo anterior puedes ver el id en la segunda columna y si es necesario puedes detenerlo:

$ kill -9 ####

Apunte 2: (Añadido 2014-12-11):

Si se necesita actualizar el código del proyecto de django puede hacerse realizando lo siguiente, se debe entrar al virtualenv y con eso parar el servidor con:

# supervisorctrl stop gunicorn

# supervisorctrl start gunicorn


Apunte 3: (Añadido 2015-01-20):


En esta ocasión nos paso que no podíamos configurar en el puerto 80 el servicio, por lo que lo que tuvimos que hacer fue: revisar en si en la configuración de ngnix se estén cargando otros archivos de configuración generalmente antes del server {} si es así comentar las siguientes instrucciones agregando #, esto es:

# include /etc/nginx/conf.d/*.conf;
# incude /etc/nginx/sites-enabled/*;

O bien revisar si estos archivos no estén causando algún conflicto con el puerto 80.



Espero te sea de utilidad !




miércoles, 19 de noviembre de 2014

Errores al iniciar gvim : (gvim:10659): Gtk-WARNING - ElementaryOS



Como ya tenia un tiempo que cada vez que abría gvim desde el terminal en ElementaryOS marca varias veces el mismo error:

Errores al iniciar gvim : (gvim:10659): Gtk-WARNING **: Imposible encontrar el motor de temas en la ruta al _modulo: «pixmap»

Para este error en particular realizar lo siguiente:

$ sudo apt-get install synaptic
$ sudo apt-get install gtk2-engines-pixbuf

Una vez aplicado los comandos los errores desaparecieron.


Espero te sea de utilidad !



Referencias:
http://tuksik.ru/gtk-warning-error-pixmap/

sábado, 15 de noviembre de 2014

Instalar ninja-ide en mac os x


Bien para continuar con un proyecto que estoy desarrollando en python-django, he probado varias herramientas de desarrollo y me ha gustado el rendimiento de este entorno; sin embargo me dio varios problemas para instalarlo en mac.

Para algunas herramientas utilice homebrew, y wget, si no los tienes instalados usa los siguientes comandos:

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install wget

Para instalar la herramienta entonces iniciamos con los siguientes comandos:

$ sudo pip install macfsevents

Por alguna razón, y puede ser por tener múltiples instancias de python (las cuáles no puedo mover mucho debido a otros proyectos de trabajo), las siguientes herramientas no me permitió instalarlas con pip por lo que las descargue directamente desde los sitios usando wget.

$ mkdir ninja-ide_app
$ cd ninja-ide_app
$ mkdir install
$ cd install
$ wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.16.4/sip-4.16.4.tar.gz
$ tar -xzvf sip-4.16.4.tar.gz
$ cd sip-4.16.4 
$ python configure.py 
$ make 
$ make install 

wget http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.11.3/PyQt-mac-gpl-4.11.3.tar.gz
tar -xzvf PyQt-mac-gpl-4.11.3.tar.gz 
cd PyQt-mac-gpl-4.11.3 
python configure-ng.py      
(escribe yes para aceptar la licencia)
$ make                                  
(puede tardar unos minutos)
$ make install


$ wget https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz 
tar -xzvf virtualenv-1.11.6.tar.gz 
$ cd virtualenv-1.11.6
python setup.py install

$ wget http://sourceforge.net/projects/pyqt/files/QScintilla2/QScintilla-2.8.4/QScintilla-gpl-2.8.4.tar.gz
 tar -xzvf QScintilla-gpl-2.8.4.tar.gz 
cd QScintilla-gpl-2.8.4
$ cd Qt4Qt5 
$ qmake qscintilla.pro 
$ make
$ make install
$ cd ..

$ cd Python 
(Python Bindings)
$ python configure.py 
$ make
$ make install 

$ cd ..
$ cd ..
$ cd ..

$ git clone https://github.com/ninja-ide/ninja-ide.git ninja-ide
$ cd ninja-ide 
$ python ninja-ide.py 

Si todo sale bien ya tienes el entorno instalado puedes agregar al bash_profile un alias para que desde la terminal puedas llamarlo.


Espero te sea de utilidad !



Referencias:
http://ninja-ide.org/
https://github.com/ninja-ide/ninja-ide-documentation/blob/master/docs/installing.rst
http://scoobygalletas.blogspot.mx/2011/09/como-instalar-ninja-ide-en-mac-os-x.html
http://pyqt.sourceforge.net/Docs/PyQt4/installation.html
http://www.riverbankcomputing.com/software/sip/download
http://pyqt.sourceforge.net/Docs/QScintilla2/
https://github.com/ninja-ide/ninja-ide/blob/705b6d005ab4db7844f7805d1b10a24732045adf/README.md#requirements
https://github.com/ninja-ide/ninja-ide/issues/1833

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/