Marcos Vanetta: Nginx, passenger and PHP

   Publicado:

Nginx, passenger and PHP

Suele pasar, solemos llenar de cosas nuestros VPS, y bueno, tuvo que pasar, necesitaba un Wordpress en un VPS y debo admitir que extrañé Apache por unos minutos. Luego de googlear mucho encontré esta solución:

Instalamos algunas cositas:

sudo yum -y install mysql-server php-fpm php-mysql php-pecl-apc

Una buena práctica es ejecutar /usr/bin/mysql_secure_installation para dejar nuestro MySQL en perfectas condiciones.

En Ubuntu podríamos hacer:

sudo apt-get install php5-cli php5-cgi php5-common php5-curl php5-dev php5-gd php5-imagick php5-mcrypt php5-mhash

sudo apt-get install php5-mysql libmysqld-dev

Instalando spawn-fcgi

spawn-fcgi[1] es un herramienta del proyecto Lighttp que nos ayuda a preparar el ambiente para FastCGI. Tenemos que hacerlo amigo de nginx.

cd /tmp

wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz

tar -xvzf spawn-fcgi-1.6.3.tar.gz

cd spawn-fcgi-1.6.3

./configure --prefix=/usr

make

sudo make install

sudo nano /usr/bin/php5-fcgi

Y le pegamos esto:

/usr/bin/spawn-fcgi -f /usr/bin/php-cgi -a 127.0.0.1 -p 49232 -C 2 -P /var/run/fastcgi-php.pid

También vamos a necesitar crear un archivo de inicio para spawn-fcgi. Creamos /etc/init.d/php5-fcgi y le pegamos el contenido de este gist.

Cambiamos algunos permisos:

sudo chmod +x /usr/bin/php5-fcgi

sudo chmod +x /etc/init.d/php5-fcgi

sudo update-rc.d php5-fcgi defaults

y ahora a lo más (sarcamo on) divertido (sarcasmo off), recompilamos nginx:

Bajamos el código fuente:

rvmsudo passenger-install-nginx-module

Elegimos la opción 2 y le pasamos estos parámetros extras:

--with-http_ssl_module --with-http_dav_module --with-http_gzip_static_module --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-client-body-temp-path=/var/lib/nginx/body --with-http_stub_status_module

Configurando un VirtualHost

Aquí les dejo mi archivo de configuración de nginx. Por supuesto lo deben guardar en un lugar donde nginx lo pueda encontrar. Si siguieron mi post anterior, pueden colocarlo en: /opt/nginx/conf/conf.d/mycoolblog.conf.

Reiniciamos y listo el pollo!

sudo mkdir /var/lib/nginx/

sudo /etc/init.d/php5-fcgi start

sudo /etc/init.d/nginx restart

Base de datos

Lo más seguro es que tengan que crear una base de datos y un usuario por ejemplo para un Wordpress, aquí los pasos:

Ejecutamos:

mysql -u root -p

CREATE DATABASE database_name;
GRANT ALL PRIVILEGES ON database_name.* TO "user" "localhost" IDENTIFIED BY "password";
FLUSH PRIVILEGES;
EXIT

Resources

  • [1] http://cgit.stbuehler.de/gitosis/spawn-fcgi/about/
  • [2] codex.wordpress.org/Installing_WordPress
  • [3] http://internetmodulation.com/2011/01/11/install-wordpress-inside-passenger-app.html.html

César Portela: Arcos y Flechas

   Publicado:

Entre las actividades que podían apreciarse durante el fin de semana pasado en el parque Urquiza de Paraná estaba el tiro con arco y flecha organizado por Arqueros del C.B.N.. Con la posterior excusa de comprar empanadas fritas de pescado en un lugar cercano ;-), estacioné el auto cerca y con mi viejo fuimos a […]

Gabriel Patiño: Mi primer juego de ingenio

   Publicado:
Mi primer juguete de madera: un juego de ingenio de esos de encastrar las piezas. 

Lo hice totalmente con herramientas manuales: serrucho de costilla, una caja de ingletes, lija y formones.

Sirvió para empezar a entender como se usan estas herramientas, la macana es que elegí madera de pino, y no me gustó para nada. 
La parte blanca es demasiado blanda, y aunque los formones estén afilados, al primer descuido se desgrana como si fuera un parmesano. La verdad que las partes internas no quedaron muy prolijas, pero bueno, por ser el primero zafa.

La terminación la hice con tres manos de aceite de tung, lijando entre mano y mano con una lija de 320. Quedó muy lindo al tacto, con una terminación mate apenas brillante.

Para el próximo juguete, en el que voy a usar madera mas dura, me compré una caladora, así que en algún momento volveré a hacer este juego con herramientas eléctricas a ver si me queda un poco más prolijo.



Gabriel Patiño: Volviendo al blog

   Publicado:

Ahora que empezando a hacer cosas de madera, tal vez tenga cosas para mostrar y comentar, vamos a ver si me vuelvo a enganchar con el blog, hace mas de tres años que no escribo nada.


Martín Cerdeira: Cloud.obj - Objetos Python en la nube

   Publicado:

Primero que nada, un poco de historia. Estaba pensando: Se pueden importar módulos que estén en un servidor remoto? Y, si es sí, se puede hacer fácil, con poco código y, portable?

Todo eso, en Python, fue un SI.

La idea es, Cloud.Obj es un repositorio de modulos de Python, de donde todo el mundo puede hacer sus "imports", sin modificar demasiado el código que usarían para importarlo localmente.

Lo único que se necesita es bajar un modulito, "cloud.py" y ya está listo para usar, sin dependencias ni nada más extra.

Aquí, un ejemplo de uso:

  1. #A simple, example
  2.      
  3. import cloud
  4. o = cloud.Obj("http://cloudobj.appspot.com/sys") #o is the module sys
  5. print "The path is ", o.path
  6. print o

Por supuesto, si picara la curiosidad o si, simplemente, quisieran montar su propio servicio, el código del "server", también está en GitHub, listo para que lo bajen, en sus versiones "Servidor local" y "listo para deploy en GAE"

Más adelante, tendrá dos sabores:

Public Repo: Módulos importables públicos, para todos.
Private Repo: Con login, para quienes quieran subir código importable, protegido con password.

Cabe aclarar que, si bien hablo de repositorios, la idea no es ser un github, sino, un lugar común y en la nube, desde donde importar la última versión del módulo X.

Aquí los links:

Servicio en GAE
Download
GitHub

Y, cómo siempre, se aceptan ideas, críticas y quien quiera participar, bienvenidisimo!

César Portela: Un sueño accidentado

   Publicado:

Hace varias semanas, casi dos meses, tuve un extraño sueño. Tomé nota del mismo (de vez en cuando lo hago) y hoy se los ofrezco para su análisis: Estaba en lo que parecía ser la esquina de San Martín y Laprida. Más sobre Laprida que sobre San Martín. Miraba hacia la Plaza San Miguel (su […]

César Portela: Pequeña odisea de un trámite de documentos

   Publicado:

Ya desde el año pasado, antes de las elecciones, tenía ganas de sacar el nuevo DNI y jubilar a la vieja libreta verde. Pero dada la proximidad de tan importante acontecimiento democrático y no queriendo complicarme con algún posible error en el padrón electoral o que mi documento se extraviara por ahí impidiéndome votar, desistí […]

Joaquin Tita: La Mega 90.5 - La radio de Rock

   Publicado:
Url para escuchar la Mega Rock online usando Vlc o mplayer
url: mmsh://70.38.79.19:80/larocka975?MSWMExt=.asf

Marcos Vanetta: Learning Javascript

   Publicado:

Learning Javascript

Hace bastante tiempo que vengo leyendo y escribiendo sobre Javascript y hay algunos posts que lo demuestran: Mustache y Objects in Javascript. Estoy convencido que es un lenguaje importantísimo y muy necesario de dominar (aunque en calle muchos digan otra cosa). Esta vez vengo a recomendar 2 libros que encontré y un artículo resumen realmente fantástico.

Object oriented programming in Javascript

Un enfoque minimalista como lo describe el propio Gabor de Mooij. Al fin! Una buena guía acerca de objetos en Js, hace rato que venía buscando una y por eso la linkeo aquí.

Essential JavaScript Design Patterns

Por alguna razón la mayoría del código Js que suelo ver (y a veces programar) es estructurado y embarrado. Aquí Addy Osmani nos deja un libro interesante para recordarnos que Javascript es un lenguaje de programación orientado a objetos y debemos tratarlo como tal. Además lo liberó con licencia Creative Commons. Libro. Y aún más interesante, podemos seguir su evolución en este repo de Github.

Eloquent JavaScript

Todavía no lo he ledído, pero lo cita el mismo Addy Osmani y también está liberado con licencia Creative Commons, entonces Marijn Haverbeke ya se ganó un lugar en mi kindle con su A Modern Introduction to Programming.

Nada que ver

En mi cruzada por empezar a respetar Javascript me encontré con este artículo en Hacker News y ... hasta me pareció obvio que necesitamos loggear los errores cliente-side. Tan obvio que nunca se me habría ocurrido.

JS Conf

Así es, en Buenos Aires el 19 y 20 de Mayo se va a realizar una conferencia sobre Javascript. Así que nos veremos ahí! link

Actualización

Y como siempre, ni bien termino de escribir un post aparece un link genial, en este repo de Github hay ejemplos de diferentes patrones de diseño implementados en Javascript com para practicar un poco.

Marcos Vanetta: RVM plus Nginx plus Server

   Publicado:

RVM plus Nginx plus Server

Al fin pude hacer andar mi servidor con RVM y Nginx! Aquí voy a dejar una receta por si tengo que volver a hacerlo (espero que no en el mediano plazo al menos). Vamos a necesitar algunas cosas antes de empezar: curl, git, muchos paquetes de desarrollo y un usuario que pueda usar sudo.

Empezamos con el usuario

sudo adduser malev

sudo passwd malev

sudo visudo

y agregamos al final:

malev ALL=(ALL) ALL

y ahora nos transformamos en nuestro nuevo usuario:

su malev

Preparandonos para instalar

Primero necesitamos instalar RVM en modo multiusuario [1], para esto necesitamos curl y git:

sudo yum install git-core curl

e instalamos RVM:

sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

Esto instalara RVM en /usr/local/lib/rvm y nos generará archivos en: /etc/rvmrc y /usr/local/rvm. También necesitamos configurar nuestros .bashrc y el esqueleto para los futuros usuarios, así que en los archivos: /root/.bashrc y /etc/skel/.bashrc agregamos:

if groups | grep -q rvm ; then
  source "/usr/local/lib/rvm"
fi

Ahora también tenemos un grupo llamado RVM y necesitamos agregar nuestro usuario al mismo:

adduser malev rvm

Otra buena práctica es definir el environment para todas nuestras aplicaciones Rails. En el archivo /etc/environment agregamos:

RAILS_ENV=production

Aquí yo me deslogueo y vuelvo a entrar, pero esta vez como malev y al tipear:

type rvm | head -n1

debería ver: rvm is a function, lo cual me indica que RVM está correctamente instalado.

Avanzando

Yo estoy usando una distro basada en CentOS, así que para instalar las librerías de desarrollo tengo que hacer:

sudo yum groupinstall "Development Tools"

sudo yum install kernel-devel kernel-headers

sudo yum install openssl-devel libcurl-devel ImageMagick httpd-devel ruby-libs zlib-devel libjpeg-devel giflib-devel readline-devel

sudo yum -y install libpcap libpcap-devel libnet libnet-devel pcre pcre-devel gcc automake autoconf libtool make gcc-c++ libyaml libyaml-devel zlib zlib-devel pkgconfig ruby-devel libxml2 libxml2-devel libxslt libxslt-devel

Nota: Si estas usando Ubuntu, hay MUCHA info sobre que instalar en este paso, pero en ppio bastaría con esto:

sudo apt-get install build-essential ruby-full libmagickcore-dev imagemagick libxml2-dev libxslt1-dev git-core ruby-devel libxml2 libxml2-devel libxslt libxslt-devel

Instalando Ruby

rvm pkg install readline

rvm pkg install zlib

rvm pkg install openssl

rvm install 1.9.2

rvm use --default 1.9.2

Instalando Passenger

gem install passenger

rvmsudo passenger-install-nginx-module

Si lo instalaste en el directorio por defecto (/opt/nginx), clonate este gist y copia el archivo nginx en /etc/init.d con permisos de ejecución.

Configurar Nginx

Buscar el archivo /opt/nginx/conf/nginx.conf que debería verse más o menos como este gist. Las líneas más importantes son la 1 donde digo con qué usuario ejecutar nginx y la 22 donde establezco dónde ubicaré el resto de los archivos de configuración.

Instalar nuestra app

En mi caso voy a instalar una app llamada infofund. Y voy a deployar con capistrano, pero las explicaciones de cómo usar capistrano vendrán en otro post. De momento les dejo el archivo /opt/nginx/conf/conf.d/infofund.conf cuyo contenido está en este gist.

En principio y como para probar pueden bajarse el contenido del proyecto en el directorio /home/malev/sites/infofund/current, crear el Gemset e instalar todas las gemas con nuestro amigo bundle para luego iniciar nginx:

sudo /etc/init.d/nginx start

y ya debería estar todo andando!

Resources

  1. https://rvm.beginrescueend.com/rvm/install/#explained
  2. http://thekindofme.wordpress.com/2010/10/24/rails-3-on-ubuntu-10-10-with-rvm-passenger-and-nginx/
  3. https://rvm.beginrescueend.com/rvm/install/#explained
  4. http://ikennaokpala.wordpress.com/2011/12/27/deployment-strategy-for-rails-passenger-and-nginx-server-with-multiple-virtual-hosts/
  5. http://blog.ninjahideout.com/posts/a-guide-to-a-nginx-passenger-and-rvm-server
  6. http://kris.me.uk/2010/08/30/rails3-hosting-all-in-one.html
Share