Drupal en IIS7 sobre Windows 2008 Server

Ésta semana David Cervigón publicó un post sobre cómo servir aplicaciones php en IIS7.

Yo en éste post voy a explicar cómo instalar en windows 2008 server Drupal, uno de los CMS open source más serios actualmente y sobre el que hay mayor documentación. Sitios como la facultad de ingeniería y ciencia de la Universidad de Hardvard, MobuzzTv, TheNew York Observer entre otros, usan Drupal para publicar sus contenidos.

En éste tutorial no mostraré cómo optimizar Drupal ni IIS, ni el url_rewrite, ni cómo configurar el servicio SMTP para envío de correo. Lo dejo para post posteriores.

He utilizado un entorno con Windows 2008 Server Web Edition sobre 32 bits y en una instalación completa. (intentaré hacer un post en el futuro con una instalación server core, que es la que más me atrae sexualmente)

  1. Instalo la función del servidor IIS con el check de CGI cuando pregunte en el listado de servicios de función.

    iis7-php

  2. Voy a php.net y descargo la última versión de PHP (ahora mismo 5.2.5) para windows “non-thread safe
  3. Descomprimo el paquete en un directorio (ej: c:\php) y creo una nueva variable de entorno PHPRC en el sistema y modifico la variable PATH añadiéndole el directorio php.

    php-2008-full-1

    Reinicio el sistema. (Por cierto ni se te ocurra añadir el grupo “todos” a la pestaña de seguridad del php.ini ;) )

  4. Creo un nuevo sitio web en IIS (si respondiese a un dominio concreto, lo indicaría en el encabezado de host, excepto si necesitaría wildcard dns [*.dominio.com] que lo dejaría sin encabezado – hay que tener cuidado con ésto en entornos en los que alojemos varios dominios distintos -).
  5. En ese sitio web, voy a “asignaciones de controlador” php-2008-full-2 y creo una nueva “asignación de módulo”. Indico *.php en ruta de acceso, fastcgi cómo módulo y el ejecutable php-cgi.exe, tal y cómo vemos en la captura:

    php-2008-full-3

  6. En la raiz del sitio web voy a “Documento predeterminado” y añado “index.php”
  7. Bajamos mysql y lo instalamos (Si deseamos probar la versión 5.1RC deberemos descargar el paquete mysql-essential 5.1.22, el resto me han dado problemas al lanzar el configurador de instancias). Como comenta David Cervigón, la última versión estable para instalar que no da problemas es la 5.0.45.
  8. Una vez instalada mysql, abro el php.ini (Inicio/ejecutar php.ini -si hemos ejecutado bien el paso 3), descomento las extensiones para mysql (mysql y mysqli) junto a las otras que me hagan falta -como gd2 y mbstring por ejemplo- y modifico la variable extension_dir con extension_dir = “c:\php\ext”
  9. Bajamos la última versión estable de drupal, en mi caso la 6.0, y lo descomprimimos en el directorio de nuestro nuevo sitio web
  10. Creamos una base de datos nueva que usará drupal con un usuario que tenga permisos sobre esa base de datos exclusivamente (nunca el usuario root! ;) ). Recomiendo el uso de las herramientas oficiales de administración, mysql gui tools.. que son gratuitas.
  11. Hecho esto, accedemos a nuestro sitio web por el navegador y comenzamos la instalación de drupal.. la cual no tiene mucho misterio.
  12. Tras instalar no os olvideis de dar los permisos adecuados al sitio web y en el directorio ./sites/default/ dar permisos de lectura únicamente (quitando el resto) al usuario IIS_IUSRS (si podéis dejar sólo los grupos administradores, usuarios y IIS_IUSRS con permisos en la raiz del sitio.. mejor)
  13. Y con ésto ya tendríamos el sitio funcionando correctamente.

    php-2008-full-6

Cambio de servidor en nvivo.es

Tras la acogida que está teniendo nvivo.es (con una media de 10.000 visitas diarias sólo de usuarios en España), plantear los nuevos cambios y ampliaciones tanto en la arquitectura del site como en el proyecto en sí, hemos decidido mudar la plataforma a un servidor dedicado en ferca que cumpliese con nuestros requisitos, y el cual administraremos nosotros.

El servidor es un Dell PowerEdge 1950 con 4Gb de Ram y 2 procesadores Intel Low Volt Xeon 5148 de doble núcleo a 2,33GHz.

La tecnología más importante usada en nvivo es la siguiente:

Debian. Nos ha parecido una opción cómoda y estable, que podríamos administrar de una forma ágil y cumple con nuestras necesidades.

Nginx. Hemos podido comprobar que apache consume demasiados recursos incluso tras adaptar su configuración al tráfico de nuestro sitio, por ello hemos decidido implementar nginx, un servidor web y reverse proxy bastante más optimizado y ligero desarrollado por Igor Sysoev, que a pesar de estar en beta y contar con muy poca documentación en inglés, está ganando adeptos gracias a su demostrada eficiencia.

Por nuestra experiencia hemos podido comprobar que no es nada dramático implementarlo y su configuración es bastante cómoda e intuitiva. Los cambios se pueden hacer en caliente, sin parar el servicio, tanto en configuración como en actualización del propio binario del servidor.

PHP en FastCGI. Es requisito para servir aplicaciones php en nginx, y dicho requisito hace que la aplicación se sirva de una forma mucho más potente que si se sirviese en modo cgi normal. Esto es posible ya que trabajando en Fastcgi, no es necesario levantar el proceso cgi de php por cada petición, sino que php se mantiene levantado y responde de inmediato a las peticiones que le llegan desde el servidor.

Smarty. Además de permitirnos separar la lógica de presentación y el html del resto de capas de la aplicación, juega un papel fundamental tanto en la caché del sitio como en su modularidad.

MemCached y eAccelerator, que hacen posible que nuestra aplicación se ejecute mucho más rápido sin molestar a la base de datos.

Mysql 5.0, próximamente con sphinx para búsquedas de texto completo.

Ahora lo tenéis más difícil para perderos un concierto ;)

Mi último paquete recibido de Amazón

Varias personas se han interesado en que les comente los libros técnicos y los otros que tengo, leo, busco o que compro, así que los iré poniendo en mi blog.

Éste es mi último pedido que me ha llegado de Amazon:

Cuando saque un poco de tiempo, y los lea, ya os contaré que tal están.

AjaxInterceptor, se acabó el "lanzar y olvidar" en AJAX

Normalmente cuando lanzamos una petición al servidor mediante ajax, una vez iniciada la petición… no tenemos control sobre la misma y tenemos que esperar a la respuesta del servidor (excepto si usamos otras técnicas como Comet).

AjaxInterceptor es una genial por no decir brutal librería escrita en javaScript por José Manuel Alarcón Aguín, mvp de desarrollo Microsoft, que nos permite controlar las peticiones ajax una vez lanzadas.

La utilidad de ésta librería es increible, ya que nos permite detener peticiones y mostrar mensajes mientras se procesan las mismas (ya no más circulos animados o “loading” indefinidos), además de soportar crossposting entre páginas del mismo dominio y respetar historial del navegador.

Problema con JQuery "411 Length Required"

JQuery en algunos casos, concretamente a mí me ha pasado usando como servidor web nginx, al hacer una petición ajax puede retornarnos un 411 de “Length required”, fallando por tanto la respuesta.

La solución consiste en agregarle la opción data, con dos corchetes (“data: {}”), a la petición ajax. Un ejemplo sería:

 $.ajax({type: "POST",

	 dataType: "text",

	 url: "back.php",

	 data: {},

	 success: function(msg){

	   alert( "back.php devuelve: " + msg );

	 }

	});

Links interesantes

PHPBilbao.org

Desde que empecé a programar en php llevo preguntándome el por qué no existe ningún evento, en éste país, relacionado con el desarrollo web en éste lenguaje de programación.. siendo éste el más usado en internet desde hace ya unos cuantos años.

logo_phpb.pngPensaba que éste problema era únicamente propio del País Vasco, donde apenas se celebran eventos de carácter técnico y la formación de éste tipo suele escasear o no hay suficiente gente interesada. Lo cierto es que actualmente no existe ningún evento oficial ni se ha organizado (que yo sepa) ninguna PHP Conference en éste país.

En noviembre del 2007 en el Congreso de Webmasters, se demostró claramente que éste tipo de eventos son muy interesantes, que pueden reunir a profesionales y emprendedores con las mismas inquietudes/”ganas de crear”, que proporcionan un valor didáctico, social e innovador que muy dificilmente se podría conseguir con una comunidad exclusivamente online.

Con phpbilbao.org pretendo crear, con la ayuda de las personas que se apunten y estén realmente interesadas, una comunidad de profesionales de internet que estén interesados directa o indirectamente con php y, organizar charlas, eventos o quedadas más informales detrás de unas cervezas (beers & php).

No pretendo solamente reunir una comunidad de desarrolladores web, una aplicación web escrita en cualquier lenguaje no funciona nunca por sí sola y requiere el trabajo y la experiencia de:

  1. Hosters
  2. Administradores de sistemas (Servidores web, Bases de datos, Servidores de directorio… cualquier sistema que conviva con una aplicación web)
  3. Ingenieros/Diseñadores/Analístas de interacción, usabilidad y accesibilidad.
  4. Analístas / Desarrolladores de php o de otros lenguajes de programación web que estén interesados en éste lenguaje.
  5. Diseñadores web
  6. Personas que quieran hacer networking o busquen profesionales con los que llevar a cabo su proyecto.

Ésta es mi idea de una comunidad interesante y es lo que busco con phpbilbao (y creo que a la gente le puede interesar).

Mucha gente me ha comentado que Bilbao le queda muy lejos para apuntarse. El nombre php Bilbao se ha escogido pensando en que las primeras charlas que organicemos en un principio sean en ésta ciudad (creo que es más fácil organizar algo entre gente de una misma zona y luego, en base a lo que ocurra, ampliar horizontes). Ésto no quiere decir que sólo sea una comunidad exclusiva para la gente de Bilbao. Mi idea es la de crear una comunidad online donde también se podrán hacer cosas, si vemos que se empiezan a animar más personas de otras zonas, no descartamos organizar algo a nivel nacional.

Existe otro grupo en Barcelona que también se está moviendo en una dirección parecida, pero que cuentan ya con una serie de quedadas a sus espaldas. He pensado que en un primer momento sería más adecuado crear una lista de interesados y posteriormente crear el sitio web, en base a las necesidades que vayan surgiendo. Como requisito para empezar a plantear “una primera fase” he puesto un mínimo de 14 interesados cerca de Bilbao. (Actualmente estamos 10)

Una vez ya estando >= 14 creo que se podría pensar en cómo organizarnos, crear la aplicación web e ir presentándonos poco a poco. Sinceramente y viendo las personas que están apuntadas, creo que las charlas van a estar muy interesantes.

Me gustaría saber vuestra opinión sobre ésta iniciativa y me encantará leer cualquier sugerencia

Nginx con php en debian

NginxNewsNginx es un servidor web de alto rendimiento y proxy escrito en c por Igor Sysoev.

Ha sido diseñado para escenarios muy concretos en los que hay mucha carga de peticiones simultáneas (se han llegado a reportar 50.000 peticiones de éste tipo) y funciona extremadamente bien como proxy de balanceo de carga y de correo.

En post anteriores he comentado cómo instalarlo, ahora comentaré como servir php en fastcgi con él. Usaré la librería spawn-cgi del servidor web lighttpd para levantar el servidor fastcgi que se comunicará con nginx.

  1. Instalar php
    apt-get install php5-cgi
  2. Instalar los paquetes siguientesnecesarios para nginx
    apt-get install zlib1g-dev libssl-dev libpcrecpp0 libpcre3-dev
  3. Bajar lighttpd, descomprimirlo, configurarlo pero no instalarlo.
    tar -xvzf lighttpd-veriónquesea.tar.gz
    cd lighttpd-descomprimido
    ./configure
    make
  4. Copiar la librería spawn-fcgi de lighttpd al directorio de binarios del sistema
    cp src/spawn-fcgi /usr/bin/spawn-fcgi
  5. Bajar nginx, descomprimirlo, configurarlo e instalarlo..
    tar -xvzf nginx-veriónquesea.tar.gz
    cd nginx-descomprimido
    ./configure
    make
    make install
  6. Arrancar el cgi de php con spawn-fcgi en el puerto 9000, por ejemplo (en ocasiones es necesario especificar el grupo, además del usuario con el que se arranca spawn-fcgi, de lo contrario, puede dar el error “no input file specified”
    /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000
    -u www-data -g www-data -f /usr/bin/php5-cgi
  7. Crear el archivo fastcgi-params con los siguiente

    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param SERVER_SOFTWARE nginx;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param REQUEST_URI $request_uri;
    fastcgi_param DOCUMENT_URI $document_uri;
    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SERVER_PROTOCOL $server_protocol;
    fastcgi_param REMOTE_ADDR $remote_addr;
    fastcgi_param REMOTE_PORT $remote_port;
    fastcgi_param SERVER_ADDR $server_addr;
    fastcgi_param SERVER_PORT $server_port;
    fastcgi_param SERVER_NAME $server_name;
    # si hemos configurado php con el parámetro --enable-force-cgi-redirect, debemos añadir:
    #fastcgi_param REDIRECT_STATUS 200;
  8. Configuramos nginx con lo siguiente

    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /directorio_al_html$fastcgi_script_name;
    include /usr/local/nginx/conf/fastcgi_params;
    }
  9. Arrancamos nginx
    /usr/local/nginx/sbin/nginx

Making the Most of Maps, trucos para mejorar la experiencia e interfaz de usuario con Google Maps

Pamela Fox ingeniera de soporte del servicio Google Maps, hizo una presentación en el Sillicon Valley Web Builder User Experience Bar Cam llamada “Making the Most of Maps”, donde expuso los puntos más importantes para conseguir buena implementación de Google Maps cara al usuario en nuestras aplicaciones web.

[youtube VGazSZUYyf4]