
Optimizando un servidor web con Nginx
Una vez adquirido uno de nuestros servidores, te enseñaremos a instalarle Nginx
En la web estamos acostumbrados a ver que gran cantidad de sitios son despachados por el servidor Apache, pero es bueno saber que existen otras alternativas de igual y mejor rendimiento como lo es Nginx.
Ambos, nginx y Apache, son servidores web gratuitos, de código abierto y disponibles para varias plataformas. Apache es un servidor sumamente completo, tiene muchas funciones disponibles, pero lo cierto es que la mayoría de ellas no son usadas. La diferencia principal con nginx es que este último tiene menos funciones, pero trabaja a mayor velocidad que Apache en el 90% de los casos.
nginx es el mejor servidor web para servir archivos estáticos, y además lo hace teniendo un consumo de memoria considerablemente menor que Apache, dado que no precisa crear un proceso o hilo nuevo para cada pedido que le llega, y tampoco necesitar analizar todos los directorios de un sitio buscando archivos .htaccess, ya que carga las reglas de Rewrite directamente desde su configuración.
Preparando el entorno
Lo primero que debemos hacer es instalar las dependencias necesarias para la compilación, para ello:
apt-get install build-essential libssl-dev libpcre3-dev
Tras esto descargamos la última versión de nginx, al momento de escribir este texto la 1.4.4:
wget http://nginx.org/download/nginx-1.4.4.tar.gz
Descomprimimos el archivo:
tar xzvf nginx-1.4.4.tar.gz
Antes de compilar cambiaremos un valor en el código fuente como medida de seguridad por ocultación. El valor a cambiar es la cadena asignada a la cabecera que indica el servidor usado en las peticiones HTTP. En concreto el archivo a cambiar es el alojado en src/http/ngx_http_header_filter_module.c
, concretamente en la línea 48:
static char ngx_http_server_string[] = "Server: nginx" CRLF; static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
Cambiamos estas dos líneas a algo del estilo:
static char ngx_http_server_string[] = "Server: Mi servidor Web" CRLF; static char ngx_http_server_full_string[] = "Server: Mi servidor Web" CRLF;
Ya solo queda compilarlo e instalarlo, de momento necesitaremos los módulos siguientes:
--with-http_gzip_static_module --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 --with-http_realip_module
Aquí estamos habilitando la compresión de las páginas con gzip, SSL para conexiones seguras, deshabilitando el módulo de correo POP3, IMAP y SMTP. Dependiendo de las necesidades de nuestro servidor, deberemos activar o desactivar algunos módulos. Más tarde necesitaremos recompilar para añadir el módulo pagespeed. La lista de todos los módulos disponibles se puede consultar en la documentación de nginx.
Compilar
Ya está todo listo para compilar e instalar, dentro del directorio de nginx ejecutamos:
./configure --with-http_gzip_static_module --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 --with-http_realip_module
Tras esto deberíamos ver un resumen de la operación realizada:
Configuration summary + using system PCRE library + using system OpenSSL library + md5: using OpenSSL library + sha1: using OpenSSL library + using system zlib library 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"
Para compilar e instalar:
make -j 4 && make install
Tras esto, es necesario descargar el script que permite iniciar, detener, reiniciar y recargar nginx mediante el comando service, podemos descargarlo desde
wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx mv nginx /etc/init.d/nginx sudo chmod +x /etc/init.d/nginx sudo chown root:root /etc/init.d/nginx update-rc.d nginx defaults
Con esto hemos descargaro el script, lo hemos movido al directorio en el que será llamado al inicio del sistema, dado permisos de ejecución y asignado a root como propietario. Hecho esto, para iniciar nuestro servidor web hay que ejecutar el comando:
service nginx start
Como se muestra en la siguiente figura nginx, podemos comprobar que nginx está funcionando correctamente dirigiéndonos a la dirección localhost, donde veremos lo siguiente:
Configuración
Ya que está todo listo, vamos a realizar unos cuantos ajustes a la configuración por defecto:
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 del directorio donde se alojan los recursos web a este último usuario y reiniciamos nginx:
chown -R www-data:www-data /usr/local/nginx/html/ service nginx destroy && service nginx start