Mudança de paradigma em webservers encaixa Nginx no mercado
7/7/2008 | Tags: , , , , , , , | Escrito por: Dirceu Pauka Jr.

A época de ouro do Apache parece ter acabado há algum tempo. Após muitos anos sendo o servidor de aplicações para Web mais usado (na realidade ainda sendo o mais usado), o market-share do Apache está em queda há algum tempo segundo o Netcraft.

Mas eu não vim aqui para enterrar o coitado do Apache, provavelmente já fizeram muito disso por aí… sem necessidade na minha opinião. Muitos problemas ainda podem ser resolvidos com ele, sem contar que é muita falta de consideração jogar pedra em quem te alimentou por todo esse tempo (mais de 10 anos) não é?

Estou aqui para falar das entrelinhas no levantamento de Junho da Netcraft. Mais precisamente quando eles expõem o seguinte: “nginx mais que dobrou em números; com um ganho de mais de 1 milhão de sites”.

Nginx

Nginx para quem não sabe é um servidor web escrito pelo russo Igor Sysoev que também pode ser usado como proxy reverso ou e-mail proxy (fique ligado no RSS para receber atualizações sobre proxy reverso).

Dentre as vantagens do engine X (pronúncia de nginx) estão:

  • estável
  • configuração simplificada
  • baixo consumo de recursos

Baixo consumo de memoria pode à primeira vista significar performance, mas nginx vai além, sendo desenvolvido para solucionar um grande problema de escalabilidade. Para isso possui um modelo de IO assíncrono e o já citado baixo consumo de memória que retornam além de performance, escalabilidade.

Trust Me / Thin

Há algum tempo atrás quando os widgets da boo-box foram para o ar eu não fazia idéia do poder do nginx. Sendo mais sincero do que deveria: ele só estava sendo usado pois era a opção que eu e o Maurício conhecíamos para colocar o nosso Merb no ar.

Logo no começo ele era um load balancer para um par de Mongrel em esquema Round-Robin, mas tão logo as requisições começaram a aumentar algo precisou ser feito.

Ezra Zygmuntowicz da EngineYard já havia enfrentado um problema com o modelo Round-Robin usado pela versão estável do nginx, então criou um patch para resolver isso com Fair queuing (ou quase isso).

A solução de Ezra foi de grande ajuda, pois o ponto mais díficil de escalar na aplicação que usei de exemplo é a ocorrencia de muitas requisições longas que ficam aguardando retorno de outras APIs, tornando Round-Robin impossível uma vez que algumas requisições poderiam cair em uma instância ocupada. Round-Robin não se importa se a instância está ocupada ou não e manda a requisição para fila da mesma forma e Fair resolve isso enviando requisições somente para instâncias desocupadas. Ponto para o nginx e sua crescente comunidade.

Mas outro problema é que uma vez que mais e mais requisições lentas vão entrando no sistema as instâncias ativas de Mongrel tendem a acabar. A solução poderia ser adicionar mais e mais instâncias até acabar com a memória ou com sobrecarregar a interface TCP/IP, uma vez que Mongrel não consegue trabalhar com Unix Sockets.

A solução então está sendo trabalhar com Thin, um ótimo webserver Ruby. Thin é uma solução alternativa ao Mongrel que merece um artigo dedicado, então o que posso dizer dele por enquanto é que suporta Unix Sockets (isso é bom) e tem um custo baixo de memória, possibilitando rodar várias instâncias diminuindo o desperdício de recursos.

Não estou muito certo quanto a possibilidade de se rodar qualquer aplicação Rails nele, mas de uma coisa eu sei: Merb + Thin + Nginx estão me deixando dormir tranquilamente. Se você ainda não conhece essas excelentes ferramentas do mundo Ruby acredite em mim, conheça.

Ps: nginx não é exclusivo do ambiente Ruby, ele é um proxy reverso que pode trabalhar com outras linguagens como PHP.

Ps 2: Phusion Passenger parece ser uma ótima opção para rodar Rails, mas mesmo suportando Rack não estou certo (fico devendo o benchmark) se haveria ganho para rodar Merb.


8 Comments so far
Leave a comment

Grande post Dirceu.
Que tal fazer um tutorial de Merb + Thin + Nginx pra galera, hein? ;)
[]s!

estou dando uma pesquisada sobre o desempenhos dos servidores e ando percebendo uma vantagem no nginx, principalmente ao baixo consumo de memória… agora vamos ver o thin.

Eu andei dando uma lida sobre isso e achei também um concorrente que dizem ser melhor que o thin e que o mongrel, chama ebb_rails. http://www.rubyinside.com/ebb-web-framework-http-server-786.html

Nunca esqueça que, além de MERB + Thin + Nginx estão deixando você dormir. Mas é o Gog que está fazendo eu e o Mauricio não acordar às 7 am com o servidor apitando >.<

Vocês estão usando DataMapper ou ActiveRecord no Merb? Ou, nenhum ORM? P

Vocês estão usando DataMapper ou ActiveRecord no Merb? Ou, nenhum ORM? Pq se não for AR, poderia habilitar o thread-safe do Merb, ajudaria bastante no número de Thins/Mongrels rodando.

Já uso Nginx tem algum tempo, e por um tempo também usei Thin. Voltamos para Mongrels após migrarmos para a EngineYard (é a solução que eles recomendam). Gostei bastante do Thin.

O LigHttpd também é um ótimo webserver, com estabilidade, pouca configuração e pouco uso de memória. :)

@pedro: sim! ebb promete ser muito bom, principalmente onde se precisa de muita concorrencia ;). eu cheguei a testar, mas ele não parece estar estável suficiente para rodar em produção. Provavelmente por ser escrito em C ainda vai demorar um pouco para que eles resolvam os problemas com memory leak (que foi o que ocorreu comigo: um monte de memory leak)

@marco: yup! deus.rb. Já planejo um artigo só sobre ele.

Para quem interessar: God: process and task monitoring done right -> ttp://god.rubyforge.org/

@arthur nessa aplicação nenhum ORM, os dados são todos de web services. Já estamos com o Merb mostrando seu poder com thread-safe. EngineYard parece ser uma boa solução, já está na fila de “soluções” caso as coisas fiquem piores (ou melhores, ehe)

dirceu

o que vocês tem aí na boo?
nginx, thin e god?

TrackBack URI

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(required)

(required)