Ahora cambiamos a nginx

Después de experimentar con Varnish y ver que no cacheaba casi nada (como era de esperar). Ademas, como la maquina tiene muy poca memoria la dejaba tostada cada dos por tres. Hoy voy a trastear un poco con nginx. Llevaba algún tiempo leyendo sobre el y nunca había tenido tiempo para probarlo.

La instalación no tiene ningún misterio …

apt-get install nginx
apt-get install php5-fpm

El fichero de configuración es algo distinto al de apache, la ruta es:

/etc/nginx/sites-available

copiamos el contenido de default en uno nuevo … www.site.com

El default tiene un montón de cosas comentadas, para que funcione hace falta que este mas o menos así:

server
{
server_name .www.site.com;

access_log /var/log/nginx/site.com.access.log;

error_log /var/log/nginx/site.com.error.log;

root www/site.com/pligg;

index index.php index.html index.htm;

# use fastcgi for all php files
location ~ \.php$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

# deny access to apache .htaccess files
location ~ /\.ht
{
deny all;
}
}

Hay que hacer el enlace simbólico desde sites-availabre a sites-enabled (lo que hace el a2ensite del apache).
ln -s /etc/nginx/sites-available/site.com.conf /etc/nginx/sites-enabled/site.com.conf

Ahora arrancamos el php5-fpm (service start php5-fpm) y el nginx (service start nginx) y listo … sirviendo paginas como un campeón.

Bueno, sirviendo solo la pagina principal, en nginx no hay .htcaccess asi que, todos los rewrites que necesita el pligg para correr en modo SEO hay que ponerlos a mano… buscando un poco encontré un sitio que se había currado la conversión del fichero .htaccess del pligg al formato nginx.

Copy paste de las reglas dentro del fichero site.com.conf (antes de cerrar la ultima llave). Reiniciamos el servidor web (service nginx reload) y listo. Ya funcionan las redirecciones. No las he probado todas así que es posible que alguna falle, si lo hace habrá que añadirla a la lista de redirecciones (menuda currada que ha pegado Eddie).

Voy a dejarlo 24 horas corriendo a ver las estadísticas, nginx consume muchos menos recursos que apache

Actualización 27/04/2012
Parece que hay algunas redirecciones que no funcionan, encontré una Web que convierte un fichero .htaccess a formato nginx, pero no va. da un error en la primera variable y no arranca.

Estoy buscando a ver si hay alguna forma de convertirlo, pero de momento nada. Sino encuentro mirare a ver las diferencias entre el fichero de la web con el mio a ver si consigo añadir las lineas que faltan. Hay que joderse con el que inventó la sintaxis del .htaccess … de que estaría puesto el pollo.

Actualización 29/04/2012
Creo que ya he dado con la solución.
Lo primero…activar los logs del rewrite. Para hacerlo editas /etc/nginx/sites-enables/tusite.conf
y añades
error_log /var/log/nginx/tusite.error.log notice;
rewrite_log on;
reinicias el servidor y en el fichero tusite.error.log empiezas a ver los macheos.

El fichero original estaba asi:

rewrite ^/upcoming/? /upcoming.php last;
rewrite ^/upcoming/category/([^/]+)/?$ /upcoming.php?category=$1 last;
rewrite ^/upcoming/category/([^/]+)/page/(\d+)/?$ /upcoming.php?category=$1&page=$2 last;

Segun el log, le pongas lo que le pongas siempre matcheaba por la primera asi que lo cambie de orden:

rewrite ^/upcoming/([^/]+)/?$ /upcoming.php?category=$1 last;
rewrite ^/upcoming/([^/]+)/page/(\d+)/?$ /upcoming.php?category=$1&page=$2 last;
rewrite ^/upcoming/? /upcoming.php last;

Y ademas le quite «category», porque en la url no aparece por ningún lado (supongo que en las versiones 9.9.x) aparecería. Vuelta a reiniciar y listo … ya matchea como debe.
Había algunas urls que no funcionaban y tuve que dejarlo asi …

rewrite ^/upcoming/(year|month|week|today|yesterday|recent|alltime)/?$ /upcoming.php?part=$1 last;
rewrite ^/upcoming/(year|month|week|today|yesterday|recent|alltime)/([^/]+)/?$ /upcoming.php?part=$1&category=$2 last;
rewrite ^/upcoming/(year|month|week|today|yesterday|recent|alltime)/page/(\d+)/?$ /upcoming.php?part=$1&page=$2 last;
rewrite ^/upcoming/(year|month|week|today|yesterday|recent|alltime)/([^/]+)/page/(\d+)/?$ /upcoming.php?part=$1&category=$2&page=$3 last;
rewrite ^/upcoming/([^/]+)/?$ /upcoming.php?category=$1 last;
rewrite ^/upcoming/([^/]+)/page/(\d+)/?$ /upcoming.php?category=$1&page=$2 last;
rewrite ^/upcoming/? /upcoming.php last;

Con esta configuración parece que todo lo que tiene que ver con el upcoming funciona bien. Ademas en ese orden, cuanto menos especifico … antes.