Para los que no lo conozcan nginx es uno de los servidores web de nueva hornada que están pegando más fuerte en los últimos tiempos. Desarrollado en Rusia para servir sites de porno principalmente, cuenta entre sus principales atractivos el bajo consumo de memoria y la rapidez a la hora de servir peticiones. Hasta hace poco solo existía documentación en ruso, pero desde hace varios meses tenemos un excelente wiki en inglés con todo lo necesario para tener este monstruo de servir peticiones corriendo en nuestras servidores.
Voy a detallar el proceso de compilación e instalación de nginx en debian etch.
Lo primero es instalar las dependencias necesarias para compilar nginx.
sudo apt-get install build-essential zlib1g-dev libgcrypt11-dev libpcre3-dev libssl-dev
A continuación descargamos el código fuente del site, particularmente en mis servidores tengo nginx estandarizado a la versión 0.5.35, la última versión estable.
wget http://sysoev.ru/nginx/nginx-0.5.35.tar.gz
Descomprimimos y accedemos.
tar -zxvf nginx-0.5.35.tar.gz
cd nginx-0.5.35/
Lanzamos el script de configuración con los siguientes parámetros
./configure --prefix=/usr \
--conf-path=/etc/nginx/nginx.conf \
--sbin-path=/usr/sbin/nginx \
--with-md5=/usr/lib \
--with-sha1=/usr/lib \
--with-http_ssl_module \
--with-http_dav_module \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/tmp/nginx/client_body_temp \
--http-proxy-temp-path=/var/tmp/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp
Compilamos e instalamos:
make
sudo make install
Me gusta mucho el esquema de funcionamiento de sites-enabled/sites-available que tiene debian. Para los que no lo conozcan. En /etc/apache2/sites-available/ estan los ficheros de configuración de cada virtualhost de apache, en /etc/apache2/sites-enabled/ se crean enlaces simbolicos a estos ficheros. El fichero /etc/apache2/apache2.conf tiene un include de sites-enabled y tenemos un par de scripts de shell a2ensite y a2dissite que se encargan de hacer o quitar enlaces simbolicos de sites-available a sites-enabled de esta manera podemos ir habilitando/quitando sites de la configuración desde linea de comando, sin tener que editar los ficheros.
Para habilitar un site:
sudo a2ensite <nombredelficherodeconfiguracion>
Para deshabilitar un site:
sudo a2dissite <nombredelficherodeconfiguracion>
He modificado estos scripts para que funcionen con nginx, para que este tingladillo funcione lo primero que hay que hacer es crear algunos directorios:
sudo mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
Lo siguiente es descargar los scripts: ngensite, ngdissite y ponerlos en /usr/sbin y darle permisos de ejecución:
wget http://pastie.caboo.se/pastes/179090/download
sudo mv download /usr/sbin/ngensite
wget http://pastie.caboo.se/pastes/179089/download
sudo mv download /usr/sbin/ngdissite
sudo chmod +x /usr/sbin/ng*
Solo falta un fichero para arrancar nginx como un demonio más de debian, este script que cumplirá la función a la perfección: nginx
Lo descargamos e instalamos:
wget http://pastie.caboo.se/pastes/179087/download
sudo mv download /etc/init.d/nginx
Configuramos nginx para que se arranque en el inicio del sistema y le damos permisos de ejecucion:
sudo update-rc.d nginx defaults
sudo chmod +x /etc/init.d/nginx
Pasamos a la configuración. Editamos el fichero de configuración /etc/nginx/nginx.conf cambiando la configuración por defecto por la siguiente:
user www-data;
worker_processes 2;
worker_cpu_affinity 0101 1010;
error_log /var/log/nginx/error.log debug;
worker_rlimit_nofile 30000;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 8192;
use epoll;
}
http {
include mime.types;
default_type text/html;
sendfile on;
keepalive_timeout 5;
tcp_nodelay on;
# output compression saves bandwidth
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
log_format main '$remote_addr - $remote_user [$time_local] ‘ ‘”$request” $status $body_bytes_sent “$http_referer” ‘ ‘”$http_user_agent” “$http_x_forwarded_for”‘;
include /usr/local/nginx/conf/sites-enabled/*;
#Default catch-all server config
server {
listen 80 default;
server_name _ *;
access_log /var/log/nginx/default.access.log;
return 404;
}
}
Añadimos la configuración de un virtualhost (muy sencillo) en /etc/nginx/sites-available/example
server {
listen 80;
server_name www.example.com
root /var/www/example/;
index index.html index.htm;
error_page 500 502 503 504 /50x.html;
error_page 404 /404.html;
error_log /var/log/nginx/example.error.log warn;
access_log /var/log/nginx/example.access.log;
}
Para finalizar habilitamos el website y lanzamos nginx.
sudo ngensite example
sudo /etc/init.d/nginx start