Quando devo mudar para o NGinx?

11

Eu tenho um servidor com vários domínios e aplicativos em execução, tudo através do Apache. Tudo está bem no momento, mas tenho planos de desenvolver um aplicativo da Web muito intensivo em desempenho (usando C ++ com CPPCMS), começando com o meu servidor para testes, talvez obtendo um servidor separado somente para esse aplicativo quando estiver pronto.

De qualquer forma, eu ouvi muito sobre o NGinx, que parece ter mais desempenho que o Apache, então eu estava me perguntando se valeria a pena trabalhar com ele para esse novo projeto. Não está claro em minha mente porque não sei que tipo de gargalo de desempenho o NGinx corrige exatamente.

Eu não sou um usuário avançado do Apache, sou um administrador Linux fraco e não desenvolvo muito aplicativos da web (mas tenho noções). Eu me dedico principalmente a escrever software, então a parte do servidor web é às vezes muito obscura para mim. Cada vez que eu tenho que configurar um site através do apach, eu preciso de muito tempo navegando no documento para ter certeza de que não quebro tudo.

Dito isto, acho que estou ficando muito melhor deste lado, mas ainda preciso de conselhos. Eu tenho visto alguns arquivos de configuração nginx, e isso parece muito mais compreensível que os do Apache, mas talvez eu esteja errado?

De informações que eu juntei, o NGinx seria a melhor escolha quando você quer balanceamento de carga, então se você tem seu aplicativo espalhado em várias máquinas, certo? Como estou pensando em meu aplicativo para scalling (e performance), parece que é o que eu preciso, mas talvez eu precise saber mais coisas sobre quando é interessante passar do Apache para o NGinx. Vale a pena mudar para o NGinx para todos os meus aplicativos atuais também? Quanto custa isso? (Quero dizer, é caro na hora de trocar de um para o outro?) Posso usar o Apache e o NGinx na mesma máquina sem nenhum problema?

Nota lateral : Por favor, não me incentive a usar linguagens interpretadas em vez de C ++, isso não está relacionado à pergunta. Consulte a página de justificativa do CPPCSM para ver que tipo de aplicativo pode se beneficiar dela. Eu entendo perfeitamente as desvantagens (em comparação com os aplicativos em Ruby e Python, que eu já uso para webapps com menos consumo de energia) e estou bem com isso.

    
por Klaim 24.05.2011 / 18:25

3 respostas

10

Vários pontos:

A principal diferença entre o Apache e o Nginx ou o Lighttpd (que pessoalmente gosto muito) é a arquitetura:

  1. O Apache manipula uma conexão por processo ou por thread (dependendo do mod-XYZ)
  2. O Nginx e o Lighttpd são de thread único, lidam com várias conexões no loop de evento único.

Como resultado:

  1. O Nginx e o Lighttpd escalam muito melhor com um grande número de conexões simultâneas, digamos que com 1000 conexões o Apache quase morreria, já que requereria 1000 processos no mod-prefork ou 1000 threads no mod-worker.

    Se você planeja usar tecnologias Comet em que cada conexão requer uma conexão HTTP com sondagem longa, o Apache não seria aceitável, pois não é bem dimensionado.

  2. Nginx e Lighttpd consomem menos memória, pois cada conexão requer + - dois sockets (HTTP e FastCGI), buffer intermediário de memória e algum estado, enquanto o Apache precisaria de thread inteiro, incluindo stack e outras coisas.

A partir da minha experiência pessoal em benchmarks, eu fiz o Lighttpd (e também presumo que o Nginx) é um pouco mais rápido com o backend FastCGI e depois com o Apache, mas isso é para pouca quantidade de conexões.

Agora, outro ponto é quando você deseja fazer alguns balanceamento de carga usando conexões FastCGI.

Na arquitetura tradicional existe

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Como o Apache lida com pools de processos, cada um executando o mod-PHP (ou outros modos)

Quando você usa o CppCMS que manipula pools por conta própria, pode fazer algo diferente:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Então, basicamente, você não precisa de outro nível de indireto porque o CppCMS manipula processo, thread e pool de conexão para você. Enquanto o PHP / Ruby / Perl precisa de algum Apache mod-XYZ ou manuseie seu próprio conector FastCGI.

    
por 25.05.2011 / 12:36
6

O Nginx, falando muito ( muito ) geralmente, pode obter uma taxa de transferência muito maior do que o Apache graças a uma abordagem arquitetônica diferente para o problema de servir páginas à web. O Nginx também foi construído principalmente como um proxy reverso e preenche esse papel excepcionalmente bem (esse é o bit de balanceamento de carga ao qual você aludiu); O Apache, por outro lado, foi criado para servir páginas da web e, posteriormente, ganhou a capacidade de proxy.

Dito isto, há quase certamente áreas onde o Apache irá consistentemente superar o Nginx, enquanto existem outras onde o Nginx irá consistentemente superar o Apache.

A resposta curta é que, se o Apache estiver funcionando para você, não há necessidade de alternar. (E estou dizendo isso como um antigo usuário do Apache que se tornou um discípulo Nginx totalmente convertido.) Somente quando o tráfego para seu servidor começa a atingir níveis em que o Apache está se tornando seu gargalo (isso é da ordem de milhares de conexões simultâneas) mas irá variar muito com base nas especificações do seu servidor e em outras cargas do servidor), ou se você estiver tentando executar o Apache em um ambiente com recursos escassos onde ele mal pode ser ajustado, a mudança para o Nginx oferece benefícios sólidos.

Dito isto, se você quiser mudar para o Nginx (o que eu encorajo!), então vá em frente. Você vai ver algum benefício? 9 vezes fora de 10: Não, você não vai. Mas você mencionou que gosta mais da linguagem do arquivo de configuração do Nginx, então se você se sentir mais confortável para configurar o Nginx do que o Apache, bem, isso é um benefício para você! (Pessoalmente, acho que as configurações do Apache são mais fáceis de ler em geral, mas isso pode ser porque passei muitos, muitos anos lendo-as, e apenas alguns meses foram gastos com o Nginx!)

Em uma nota lateral: Você mencionou seu desejo de criar um aplicativo da Web em C ++. Para o bem da sua sanidade, eu recomendo strongmente que você use uma linguagem de alto nível como PHP, Python ou até mesmo Java. Em seguida, crie um perfil para seu código e considere a criação de módulos baseados em C ++ para tratar de gargalos específicos (Python e PHP permitem isso com bastante facilidade; não conhecem Java). Se você está preocupado com o desempenho geral, considere o seguinte: o EVE Online, o único MMORPG não compartilhado do mundo, é construído sobre uma variante do Python (Stackless Python), com apenas componentes chave (por exemplo, as bibliotecas gráficas) escritas em C ++. Se o Python pode lidar com isso, certamente ele pode lidar com seu aplicativo da Web?

    
por 24.05.2011 / 18:51
3

Ninguém pode realmente responder a parte "quando devo trocar" - isso dependerá da sua carga, do desempenho do seu código de aplicativo, etc.

NGinx, that seems to be more performant than Apache

O nginx usa um único processo (ou um número muito pequeno de processos de trabalho) para lidar com todas as conexões do cliente usando E / S com eventos. O Apache tem vários "Módulos de Multi-Processamento" disponíveis, mas todos eles se inclinam mais para muitos processos / muitos tópicos . Como resultado, o Apache geralmente consome mais RAM e CPU do que o nginx para o tratamento básico da conexão HTTP. Você pode obter uma visão geral das diferentes abordagens de manipulação de conexão na página C10K do Kegel .

very performance-intensive web application (using C++ with CPPCMS)

Sugiro strongmente sugerir que considere fazer a aplicação web básica em uma linguagem de nível superior (Python, ou talvez Ruby, Scala) e usar uma fila de mensagens para enviar tíquetes de trabalho a máquinas de trabalho que manipulam as tarefas de "alto desempenho" de forma assíncrona.

NGinx would be the best choice when you want load-balancing,

O nginx é um bom balanceador de carga; mas existem muitas opções nesse espaço .

Can I use Apache and NGinx both on the same machine without any problem?

Sim. Basta executá-los em números de porta IP e / ou endereços IP diferentes.

    
por 24.05.2011 / 18:52