Índice
Nginx (Pronunciado engine-x) es un servidor HTTP de alto rendimiento, gratuito, software libre y proxy inverso, así como un servidor proxy IMAP/POP3. Desarrollado por Igor Sysoev. Acualmente el 12.18% de las webs usan nginx como servidor HTTP. Sus aspectos más destacables son el rendimiento, estabilidad, simplicidad de configuración y un bajo consumo de recursos. En este artículo explicaré como instalar nginx desde el código fuente.
Instalando dependencias
Antes de poder compilar nginx, es necesario instalar unos cuantos paquetes:
# apt-get install build-essential libssl-dev libpcre3-dev
El paquete build-essential
contiene las herramientas básicas para compilar programas desde código fuente, las otras dos librerías son necesarias para nginx durante el proceso de compilación.
Descargar y compilar Nginx
$ wget http://nginx.org/download/nginx-1.2.6.tar.gz
Descomprimimos el fichero:
$ tar zxvf nginx-1.2.6.tar.gz
Una vez descomprimido, entramos en el directorio y compilamos:
$ cd nginx-1.2.6
~/nginx-1.2.6$ ./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module
~/nginx-1.2.6$ make
~/nginx-1.2.6$ sudo make install
Para consultar qué modulos hay disponibles hay que visitar la pagina oficial de Nginx y decidir cuales queremos habilitar. Con la opción --sbin-path=/usr/local/sbin
establecemos la ruta en la que se instalará el ejecutable. Tras compilar se mostrará información de la localización de los distintos ficheros:
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/sbin"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
Es necesario descargar un script que permita detener, reiniciar e iniciar nginx, podemos descargar el siguiente:
$ wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx
$ sudo mv nginx /etc/init.d/nginx
$ sudo chmod +x /etc/init.d/nginx
$ sudo chown root:root /etc/init.d/nginx
En el tercer comando otorgamos permiso de ejecución al script, con el cuarto hacemos al usuario root propietario del mismo.
Si queremos que nginx se inicie automáticamente al iniciar el sistema, hay que añadirlo a los runlevel correspondientes:
# update-rc.d nginx defaults
Ahora estamos en condiciones de ejecutar nginx:
# /etc/init.d/nginx start
[ ok ] Starting Nginx Server...:.
Listo, nos dirigimos a nuestro navegador y escribimos en la barra de direcciones localhost. Si todo ha ido bien deberíamos ver esta pantalla:
Usando firebug se puede comprobar que efectivamente se está corriendo un servidor nginx:
Modificando la configuración por defecto
Sustituimos la configuración por defecto por esta:
user www-data;
worker_processes 1;
pid /var/run/nginx.pid;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
gzip on;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6]\.";
gzip_proxied any;
gzip_types text/plain text/css application/json 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"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 3;
index index.html index.htm;
server {
listen 80;
server_name localhost;
root html;
access_log logs/host.access.log main;
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
}
Los cambios más relevantes sobre la configuración por defecto son:
- Se ha cambiado el usuario del servidor de “nobody” a “www-data”, éste último es el usuario por defecto para servidores webs.
- Se define el archivo donde se localizará el PID (Process ID) del servidor. Esto permite al script que hemos instalado iniciar o detener nginx.
- Se habilita la compresión gzip para reducir el ancho de banda consumido.
- Se define el formato que tendrán los ficheros de log.
Cambiamos los permisos de los ficheros que contienen la web y reiniciamos nginx para aplicar los cambios:
$ sudo chown -R www-data:www-data html/
$ sudo service nginx destroy && sudo service nginx start
Instalar php5-fpm
En lugar de instalar php5, instalaremos php5-fpm (FastCGI Process Manager), una implementación alternativa con algunas características adicionales.
En ubuntu, ejecutamamos el siguiente comando:
# apt-get install php5-fpm
En debian agregamos el repositorio al sources.list:
deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all
Agregamos la llave GnuPG del repositorio:
apt-get update
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -
Instalamos php:
# apt-get install php5-cli php5-suhosin php5-fpm php5-cgi php5-mysql
Lo iniciamos:
# /etc/init.d/php5-fpm start
Para lograr que nginx interprete php, hay que hacer algunas modificaciones a la configuración:
user www-data;
worker_processes 1;
pid /var/run/nginx.pid;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
gzip on;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6]\.";
gzip_proxied any;
gzip_types text/plain text/css application/json 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"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 3;
index index.php index.html index.htm;
upstream php {
server 127.0.0.1:9000;
}
server {
listen 80;
server_name localhost;
root html;
access_log logs/host.access.log main;
# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php;
}
}
}
Los principales cambios realizados son los siguientes:
- Se ha añadido
index.php
antes deindex.html index.htm
para dar prioridad a los archivos php. - El bloque
upstream php
que apunta aPHP-FPM
. - Un manejador para archivos php
location ~ \.php$
Para terminar, añadimos los siguientes parámetros al final del archivo /usr/local/nginx/fastcgi_params:
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
Para aplicar los cambios, reiniciamos nginx:
# service nginx restart
Con esto, deberíamos tener instalado un servidor corriendo con nginx y ejecutando archivos php.
Referencias
- Learn how to setup a web server pt2: Installing Nginx and PHP »» blog.bryanbibat.net.
- HOWTO install php5-fpm on Debian Squeeze »» fak3r.com.
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.