Está en la página 1de 8

NGINX

Desde hace mucho tiempo cuando nos hemos encontrado en la necesidad de


un servidor HTTP, la primera solucin que nos venia a la cabeza era Apache;
sin embargo los tiempos han cambiado, las exigencias de los desarrolladores y
clientes han incrementado y el uso de este antiguo gigante ha venido
disminuyendo cada vez mas, esta semana hablaremos de su mayor
contendiente, Nginx.

Qu es Nginx?
Realmente pronunciando engine-x (no enyinx), es un servidor HTTP, proxy
en reversa, balanceador de carga y proxy de correo electrnico, basado en el
concepto del cdigo abierto. Enfocado en una arquitectura de manejo de
eventos asncronos en lugar de hilos o threads es reconocido por su alto
desempeo, bajo consumo de recursos, estabilidad, escalabilidad y
configuracin sencilla.

Se estima que ms del 14% de los sitios en internet estn servidos o proxiados
por Nginx, entre ellos podemos mencionar algunos de gran relevancia que
seguro conocers como GitHub, WordPress.com, Netflix, Heroku, SoundCloud y
muchos ms.

Nginx vs. Apache


Mencionemos algunas caractersticas que ilustrarn las ventajas que ofrece
Nginx en contraste con el servidor web ms conocido en el mercado.

Manejo de concurrencia de entre 4 y 8 veces mayor.


Servicio de recursos estticos de hasta 300% ms rpido.
Consumo de memoria de hasta 20 veces menos.

Con estas premisas podemos adems concluir lo siguiente:


Alta concurrencia + alta velocidad de respuesta + ridculamente bajo consumo
de recursos = Alta escalabilidad y estabilidad
Tomemos un caso de estudio, un actual ingeniero de software en Facebook que
para el momento de la declaracin trabajada como CTO de la empresa de

juegos en lnea Mochi Media, la cual que mantena sus servidores bajo Nginx y
FreeBSD.
Al no tener que crear nuevos procesos en la creacin de hilos, el consumo de
memoria es significativamente bajo, tan bajo como a merced del alto trafico de
varios cientos de peticiones por segundo en un slo servidor, el consumo es de
unos 15MB de RAM y 10% de CPU. Mientras que con Apache no logra manejar
el mismo nivel de concurrencia adems de crear miles de procesos que
inundan la memoria con ms de 400MB de RAM, el consumo del procesador es
ligeramente mayor y por ende, un rendimiento ms lento y susceptible a fallar
o caerse.

Instalacin
Con todo lo que hemos visto, procedamos con el proceso de instalacin.
Para este caso particular debemos descargar manualmente la ltima versin
del comprimido en la pgina oficial de Nginx:
http://nginx.org/en/download.html

Elegimos nginx/Windows-1.4.2 , por ser la versin estable.

Para WINDOWS no se debe esperar altos niveles rendimiento ni altos niveles de


concurrencia debido a que existen varios problemas y conflictos conocidos, el
funcionamiento de Nginx en Windows se considera en estado beta.

Luego descomprimiremos el archivo que descargamos en el disco C y usando la


consola navegaremos al nuevo directorio para iniciar el proceso:
1 c:\ cd nginx-1.4.2

(enter)

2 c:\nginx-1.4.2>start nginx (enter)

Prueba
Luego de haber instalado e iniciado Nginx, probemos que efectivamente sirve
dirigindonos a la direccin web donde fue instalado (si estamos instalando
localmente ser localhost) y especificando el puerto por defecto de instalacin
(en OS X, Homebrew durante la instalacin debi indicarlo, suele ser 8080. Los
dems suelen establecerlo directamente en el 80), y veremos una pgina como
esta:

Puede que haya conflictos con el puerto si tienes instalado otro servidor web
como Apache que se encuentre en funcionamiento y escuchando el mismo
puerto, esto lo solucionaremos ms adelante en la configuracin.
Configuracin

Bien, ahora que sabemos que nuestro servidor funciona conozcamos algunos
aspectos de la configuracin de Nginx, para esto debemos abrir el archivo que
la contiene.

directorio_donde_descomprimimos_nginx\conf\nginx

Podremos notar que la estructura del archivo es bastante intuitiva, veamos


algunos datos bsicos.
Para iniciar, cada host virtual est delimitado de la siguiente manera:

1
2
3

server {
...
}

Dentro de cada host podremos especificar cosas como:

-El puerto donde escucha Nginx y el nombre del host:

1
2
3
4

...
listen
80;
server_name dominio.com;
...

- El directorio raz del servidor y nombres de los archivos index:

1
2
3
4

root /Users/jonathanwiesel/www;
index index.html index.htm;
...

- Ubicaciones, estas nos sirven para delimitar diferentes comportamientos para


cada rea especfica del servidor, Nginx siempre tratar de buscar la ubicacin
ms especifica, de lo contrario recurrir a la ubicacin por defecto /:

1
2
3

location ~ ^/foro/(?P.*)$ {
return 301 $scheme://foro.dominio.com/$1;
}

En este caso cualquier ubicacin que tenga el sufijo /foro ser transferida al
subdominio foro.dominio.com.

Un ejemplo de caching de imgenes bastante til:

1
2
3

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 30d;
}

Esto le indicar al explorador del cliente que debe mantener en cache por 30
das cualquier ubicacin que termine con alguna de estas extensiones, es decir,
cualquier archivo de imagen con estas extensiones. Esto incrementar
dramticamente la velocidad de carga de la pgina con dichas imgenes en
futuras visitas del usuario.

- PHP-FastCGI:

1 location ~ \.php$ {
2
fastcgi_pass localhost:9000;
3
4
fastcgi_param QUERY_STRING
$query_string;
5
fastcgi_param REQUEST_METHOD $request_method;
6
fastcgi_param CONTENT_TYPE
$content_type;
7
fastcgi_param CONTENT_LENGTH $content_length;
8
9
fastcgi_param SCRIPT_NAME
$fastcgi_script_name;
10
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
11
fastcgi_param REQUEST_URI
$request_uri;
12
fastcgi_param DOCUMENT_URI
$document_uri;
13
fastcgi_param DOCUMENT_ROOT
$document_root;
14
fastcgi_param SERVER_PROTOCOL $server_protocol;
15
16
fastcgi_param REMOTE_ADDR
$remote_addr;
17
fastcgi_param REMOTE_PORT
$remote_port;
18
fastcgi_param SERVER_ADDR
$server_addr;
19
fastcgi_param SERVER_PORT
$server_port;
20
fastcgi_param SERVER_NAME
$server_name;
21
22
include
fastcgi_params;
23 }

Tambin podemos establecer host virtuales HTTPS:

1 server {
2
listen 443;
3
server_name localhost;
4
5
root html;
6
index index.html index.htm;
7
8
ssl on;
9
ssl_certificate cert.pem;
10
ssl_certificate_key cert.key;
11
12
ssl_session_timeout 5m;
13
14
ssl_protocols SSLv3 TLSv1;
15
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:
16 +SSLv3:+EXP;

17
18

ssl_prefer_server_ciphers on;

Proxies en reversa a Apache (cortesa de nixCraft):

1 upstream apachephp {
2
server 192.168.1.11:80;
3 }
4
5 server {
6
listen
202.54.1.1:80;
7
server_name www.dominio.com;
8
access_log /var/log/nginx/log/www.dominio.access.log main;
9
error_log /var/log/nginx/log/www.dominio.error.log;
10 root /usr/share/nginx/html;
11 index index.html index.htm;
12 ## mandamos la peticin a apache ##
13 location / {
14
proxy_pass http://apachephp;
15
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503
http_504;
16
proxy_redirect off;
17
proxy_buffering off;
18
proxy_set_header
Host
$host;
19
proxy_set_header
X-Real-IP
$remote_addr;
20
proxy_set_header
X-Forwarded-For $proxy_add_x_forwarded_for;
21
22
23 }
24 }
Conclusin
Nginx es una herramienta muy poderosa, capaz de muchas cosas
impresionantes y sin apoderarse de tu presupuesto en hardware. Ciertamente
no es el nico que desea destronar a Apache, Lighttpd es una buena solucin a
considerar, lo importante es probar otras opciones y no quedarnos con lo que
conocemos y nos sentimos cmodos ya que experimentando es la manera que
podemos determinar con propiedad qu es lo beneficioso para nosotros.