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 Web com muito desempenho (usando C ++ com CPPCMS), começando com o servidor para teste, talvez obtendo um servidor separado apenas para esse aplicativo quando ele estiver pronto.

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

Não sou um usuário avançado do Apache, sou um péssimo administrador do Linux e não desenvolvo muito aplicativos da Web (mas tenho noções). Dedico-me principalmente a escrever software, de modo que a parte do servidor da Web às vezes é muito obscura para mim. Cada vez que tenho que configurar um site através do apach, preciso de muito tempo navegando no documento para garantir que não quebre tudo.

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

A partir das informações que reuni, o NGinx seria a melhor opção quando você deseja balancear a carga; portanto, se você tiver seu aplicativo espalhado em várias máquinas, certo? Como estou pensando em meu pedido de escândalo (e desempenho), parece que é o que eu preciso, mas talvez eu precise saber mais 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 mudar 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. Entendo perfeitamente as desvantagens (em comparação com aplicativos em Ruby e Python, que eu já uso para aplicativos da web com menos energia) e estou bem com isso.

Klaim
fonte

Respostas:

10

Vários pontos:

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

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

Como um resultado:

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

    Se você planeja usar as tecnologias Comet nas quais cada conexão requer uma conexão HTTP de polling longa, o Apache não seria aceitável, pois não é bem dimensionado.

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

Pela minha experiência pessoal em benchmarks, fiz o Lighttpd (e presumo que o Nginx também) é um pouco mais rápido com o back-end do FastCGI do que com o Apache, mas isso é para pouca quantidade de conexões.

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

Na arquitetura tradicional há

                               |
                              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 conjuntos de processos, cada um deles executando o mod-PHP (ou outros modos)

Ao usar o CppCMS que lida com pools por conta própria, você 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 indireção, porque o CppCMS lida com o processo, o thread e o conjunto de conexões para você. Enquanto o PHP / Ruby / Perl precisa de algum Apache mod-XYZ ou manipula seu próprio conector FastCGI.

Artyom
fonte
+1 Boa explicação completa do autor do CppCMS;) Ok, agora vejo melhor o problema geral. Portanto, o caso em que você tem apenas um servidor (para começar) é HTTP-> Balancer-> FCGI-> CPPCMS, se bem entendi? O que você acha dos conselhos do comentário de Jesper Mortensen, dizendo que FastCGI não é rápido?
Klaim 25/05
@Klaim: Veja os excelentes desenhos acima - nesta arquitetura, o FastCGI é usado como interconexão entre vários servidores, cada um executando uma instância do CppCMS com vários threads. A velocidade relativa do FastCGI importa muito menos nesse caso; suas alternativas seriam HTTP, AJP e outros protocolos capazes de rede que também não são 'rápidos'. Essa resposta provavelmente deve ser marcada como aceita e sua pergunta editada, porque não se trata realmente de quando vale a pena o nginx.
Jesper M
@Jesper Mortensen> Eu concordo, mas que modificação na pergunta você sugere com precisão?
Klaim
6

O Nginx, falando muito ( muito ) em geral, pode obter uma taxa de transferência muito mais alta que o Apache, graças a uma abordagem arquitetural diferente do problema de servir páginas na 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 que você mencionou); 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 em que o Apache superará o Nginx de maneira consistente, enquanto há outras em que o Nginx superará o Apache de forma consistente.

A resposta curta é que, se o Apache estiver trabalhando para você, não há necessidade de mudar. (E estou dizendo isso como um ex-usuário do Apache que se tornou um discípulo do Nginx totalmente convertido.) Somente quando o tráfego para o servidor começa a atingir níveis em que o Apache está se tornando seu gargalo (isso é da ordem de alguns milhares de conexões simultâneas, (mas variará bastante com base nas especificações do servidor e em outra carga do servidor) ou, se você estiver tentando executar o Apache em um ambiente com poucos recursos, onde ele mal se encaixa, 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ê verá algum benefício? 9 vezes em 10: Não, você não vai. Mas você mencionou que gosta mais da linguagem do arquivo de configuração do Nginx; portanto, se você se sentir mais confortável em configurar o Nginx que o Apache, bem, isso é um benefício para você! (Pessoalmente, acho as configurações do Apache mais fáceis de ler em geral, mas isso pode ser porque eu passei muitos e muitos anos lendo-as e apenas alguns meses foram gastos no Nginx!)

Em uma nota lateral: você mencionou seu desejo de criar um aplicativo Web em C ++. Por uma questão de sua sanidade, peço que você use uma linguagem de nível superior como PHP, Python ou mesmo Java. Em seguida, analise o seu código e considere a criação de módulos baseados em C ++ para resolver 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 maior MMORPG não compartilhado do mundo, foi desenvolvido com base em uma variante do Python (Stackless Python), com apenas os principais componentes (por exemplo, as bibliotecas gráficas) escritos em C ++. Se o Python pode lidar com isso, certamente pode lidar com seu aplicativo da web?

Kromey
fonte
+1 Obrigado. Sobre C ++, veja meu comentário na resposta de Jesper Mortensen. Além disso, mesmo que o Python seja usado no servidor do Eve Online (eu sei muito disso), o AFAIK, ele gerencia apenas o código de jogo (que é grande), e algumas outras partes são de fato em C ++. O código gráfico está no lado do cliente, portanto o C ++ também é obrigatório para esses tipos de desempenho gráfico. Como eu disse, consulte a página da justificativa do CPPCMS sobre o motivo da escolha. Se eu seguisse o seu conselho, precisaria escrever meu aplicativo duas vezes, enquanto já sei que ele consome muita energia. Além disso, eu entendo as desvantagens e estou bem com isso.
Klaim
3

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

NGinx, isso parece ser mais eficiente que o Apache

O nginx usa um único processo (ou um número muito pequeno de processos de trabalho) para manipular todas as conexões do cliente usando E / S registrada. O Apache possui vários "Módulos de multiprocessamento" disponíveis, mas todos eles se inclinam mais para muitos processos / muitos threads. Como resultado, o Apache geralmente consome mais RAM e CPU do que nginx para o manuseio 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 da Kegel .

aplicativo da Web com alto desempenho (usando C ++ com CPPCMS)

Eu sugiro fortemente considerar a possibilidade de fazer o webapp básico em uma linguagem de nível superior (Python, ou talvez Ruby, Scala) e usar uma fila de mensagens para enviar tíquetes de trabalho para máquinas operadoras que lidam com as tarefas "intensivas em desempenho" de forma assíncrona.

O NGinx seria a melhor opção quando você deseja balanceamento de carga,

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

Posso usar o Apache e o NGinx na mesma máquina sem nenhum problema?

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

Jesper M
fonte
"Eu sugiro fortemente que considere fazer o webapp básico em um idioma de nível superior"> Não disse que era um webapp básico - nem sequer é trivial. Se você vê a justificativa para usar o CPPCMS, o autor apresenta alguns casos em que isso pode ser útil, e eu estou nesses casos. Eu considerei outras alternativas, mas as achei mais caras do que usar C ++, pelo menos no tipo de aplicativo da Web que estou escrevendo. Portanto, isso não faz parte da pergunta. Mas eu entendo o seu conselho e dá o mesmo para as pessoas que me perguntam se devem usar C ++ para aplicativos da web. Também pretendo usar o Python para outro aplicativo mais simples.
Klaim
Enfim, +1 para os detalhes.
Klaim
@Klaim: Se você deseja obter a melhoria de desempenho "ordem de magnitude" alegada em uma implementação C # / Java bem ajustada, veja se é possível executar o CppCMS e o código do aplicativo em processo com o seu servidor da web - como um plugin para nginx / Apache. As páginas do CppCMS parecem mostrar o FastCGI como conexão entre o servidor da web e o CppCMS; e na verdade FastCGI não é ... rápido.
Jesper M
> Idéia interessante. A maioria dos conselhos é que você deve usar o fastcgi porque é mais rápido que as alternativas. Vou verificar se consigo fazer isso, talvez veja com o autor do CPPCMS por que ele acha que é o mais rápido.
Klaim