Nginx servindo Node.js
Autor: Vitor Hansen | Publicado: 2015-10-07T09:36:00-03:00

Node.js e Nginx

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&nbsp;proxy server&nbsp;do Nginx com Node.js e também um&nbsp;static server&nbsp;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:&nbsp;Não entrarei em detalhes sobre como instalar o Nginx em sua máquina, para instalá-lo recomendo que acesse seu site oficial:&nbsp;http://nginx.org. Também recomendo que leia sua&nbsp;Wiki&nbsp;que contém diversas dicas de como configurá-lo. A versão utilizada neste post é a versão&nbsp;1.5.2, recomendo que&nbsp;não&nbsp;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&nbsp;nginx.conf. A localização deste arquivo varia de acordo com o sistema operacional, então recomendo que leia sua&nbsp;documentação oficial&nbsp;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&nbsp;proxy&nbsp;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&nbsp;nginx.conf. Com o objetivo de otimizar o servidor estático, habilitamos&nbsp;compactação gzip, através do trecho:&nbsp;gzip on&nbsp;e criamos dois&nbsp;location&nbsp;dentro de&nbsp;server. O primeiro&nbsp;location&nbsp;é responsável por servir conteúdo estático.

location /static {
  root /meuapp/public;
  expires max;
}


É dentro dele definimos a localização da pasta&nbsp;public&nbsp;da nossa aplicação através do trecho:&nbsp;root /meuapp/public. Esta localização definida no item&nbsp;root&nbsp;se baseia no endereço onde fica a pasta&nbsp;public&nbsp;do seu sistema operacional, ou seja, emroot /meuapp/public&nbsp;estou assumindo que a pasta&nbsp;meuapp&nbsp;esta localizada na raíz do sistema operacional (geralmente sistemasLinux, Unix e MacOSX&nbsp;utilizam este padrão de endereço). Se o seu sistema é&nbsp;Windows&nbsp;altere o endereço para o padrão de diretórios dele, que é algo semelhante a&nbsp;root C:/meuapp/public. Também aplicamos dentro desse&nbsp;location&nbsp;um&nbsp;cache&nbsp;simples dos arquivos através do item:&nbsp;expires max.



No último&nbsp;location, aplicamos o&nbsp;proxy server, o item&nbsp;proxy_pass&nbsp;praticamente faz um redirecionamento para as demais rotas da aplicação e esse redirecionamento vai para o endereço:&nbsp;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&nbsp;/meuapp&nbsp;e também crie a pasta&nbsp;/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  = "&lt;h1&gt;Aqui é Node.js!&lt;/h1&gt;"
       + "&lt;h1&gt;&lt;a href='/static/nginx.html'&gt;Ir para Nginx&lt;/a&gt;&lt;/h1&gt;";
  res.send(html);
});

app.listen(3000);


Vamos criar o arquivo&nbsp;nginx.html&nbsp;dentro da pasta&nbsp;/meuapp/public/static, para que este arquivo seja servido via Nginx.

&lt;h1&gt;Aqui é Nginx&lt;/h1&gt;
&lt;h1&gt;&lt;a href="/node"&gt;Ir para Node.js&lt;/a&gt;&lt;/h1&gt;


Pronto! Criamos uma aplicação em Node.js que utiliza o Express, para rodá-lo, instale primeiro:&nbsp;npm install express --saveAgora execute:&nbsp;node app.js.Acesse no seu browser:&nbsp;http://localhost:3000&nbsp;e clique em ambos os links. Veja dessa vez os logs registraram acessos nas rotas:/node&nbsp;e&nbsp;/nginx.html.
Node.js servindo estático (clique na imagem)
Isto é normal, visto que até agora o Node.js esta servindo arquivo estático e o Nginx não esta rodando seu&nbsp;proxy server&nbsp;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:&nbsp;nginx -s reload. E acesse sua aplicação através do novo endereço:&nbsp;http://localhost.
Nginx servindo estático (clique na imagem)
Dessa vez o seu log da aplicação Node.js vai apenas registrar acessos na rota&nbsp;/node, deixando que a rota&nbsp;/nginx.html&nbsp;seja acessada pelo Nginx.



fonte:&nbsp;http://udgwebdev.com/nginx-servindo-nodejs/


Vitor Yudi Hansen