Nginx servindo Node.js
Publicação: | Tags: Node.js
Nesse post falarei um pouco mais sobre a união entre Node.js e Nginx, mostrando as vantagens desse casamento e como implementar essa dupla corretamente.
O objetivo dessa integração visa aumentar performance de uma aplicação pelo qual criaremos um proxy server do Nginx com Node.js e também um static server pelo qual é delegado todo processamento de arquivos estático para o Nginx, deixando apenas que o Node.js cuide do processamento de suas rotas, diminuindo o número de requisições diretas na aplicação.
Atenção: Não entrarei em detalhes sobre como instalar o Nginx em sua máquina, para instalá-lo recomendo que acesse seu site oficial: http://nginx.org. Também recomendo que leia sua Wiki que contém diversas dicas de como configurá-lo. A versão utilizada neste post é a versão 1.5.2, recomendo que não utilize versões anteriores a esta, pois provavelmente não irá funcionar a dica de configuração que explicarei a seguir.
Agora que temos o Nginx instalado e funcionando corretamente em sua máquina, vamos configurá-lo para que ele comece a servir arquivos estáticos de nossa aplicação, tudo isso será feito dentro de seu arquivo principal chamado nginx.conf
. A localização deste arquivo varia de acordo com o sistema operacional, então recomendo que leia sua documentação oficial para descobrir onde ele se encontra.
Abaixo apresento uma versão simplificada de configuração do Nginx. Esta configuração fará o Nginx servir os arquivos estáticos ao invés do Node.js, e para finalizar aplicamos um proxy no Nginx para que ele redirecione para Node.js quando um usuário acessar uma rota da nossa aplicação.
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
access_log logs/access.log;
location /static {
root /meuapp/public;
expires max;
}
location / {
proxy_pass http://localhost:3000;
}
}
}
Praticamente adicionamos algumas melhorias em cima das configurações padrões do nginx.conf
. Com o objetivo de otimizar o servidor estático, habilitamos compactação gzip, através do trecho: gzip on
e criamos dois location
dentro de server
. O primeiro location
é responsável por servir conteúdo estático. ``` nginx
location /static {
root /meuapp/public;
expires max;
}
É dentro dele definimos a localização da pasta `public` da nossa aplicação através do trecho: `root /meuapp/public`. Esta localização definida no item `root` se baseia no endereço onde fica a pasta `public` do seu sistema operacional, ou seja, em `root /meuapp/public` estou assumindo que a pasta `meuapp` esta localizada na raíz do sistema operacional (geralmente sistemas **Linux, Unix e MacOSX** utilizam este padrão de endereço). Se o seu sistema é **Windows** altere o endereço para o padrão de diretórios dele, que é algo semelhante a `root C:/meuapp/public`. Também aplicamos dentro desse `location` um **cache** simples dos arquivos através do item: `expires max`.
No último `location`, aplicamos o **proxy server**, o item `proxy_pass` praticamente faz um redirecionamento para as demais rotas da aplicação e esse redirecionamento vai para o endereço: `http://localhost:3000`. ``` nginx
location / {
proxy_pass http://localhost:3000;
}
Agora que já configuramos o Nginx, vamos criar uma simples aplicação em Node.js. Crie o arquivo dentro da pasta /meuapp
e também crie a pasta /meuapp/public
. Abaixo segue o código-fonte da aplicação Node utilizando Express:
// Arquivo: app.js
var express = require('express')
, app = express();
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.static(__dirname + '/public'));
app.get('/node', function(req, res){
var html = "<h1>Aqui é Node.js!</h1>"
+ "<h1><a href='/static/nginx.html'>Ir para Nginx</a></h1>";
res.send(html);
});
app.listen(3000);
Vamos criar o arquivo nginx.html
dentro da pasta /meuapp/public/static
, para que este arquivo seja servido via Nginx.
<h1>Aqui é Nginx</h1>
<h1><a href="/node">Ir para Node.js</a></h1>
Pronto! Criamos uma aplicação em Node.js que utiliza o Express, para rodá-lo, instale primeiro: npm install express --save
Agora execute: node app.js
.
Acesse no seu browser: http://localhost:3000
e clique em ambos os links. Veja dessa vez os logs registraram acessos nas rotas: /node
e /nginx.html
.
Isto é normal, visto que até agora o Node.js esta servindo arquivo estático e o Nginx não esta rodando seu proxy server por um motivo: você está acessando diretamente o servidor Node.js através da porta 3000.
Agora que temos o Nginx configurado, que tal testar essa integração? Reinicie o Nginx através do comando: nginx -s reload
. E acesse sua aplicação através do novo endereço: http://localhost
.
Dessa vez o seu log da aplicação Node.js vai apenas registrar acessos na rota /node
, deixando que a rota /nginx.html
seja acessada pelo Nginx.