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.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, emroot /meuapp/public
estou assumindo que a pasta meuapp
esta localizada na raíz do sistema operacional (geralmente sistemasLinux, 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
.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:
Agora execute:
Acesse no seu browser:
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.
fonte: http://udgwebdev.com/nginx-servindo-nodejs/
Vitor Yudi Hansen