Apache vs nginx: diferenças e como converter a configuração
Apache vs nginx
Apache vs nginx: processos, .htaccess e conversão de config | We.Inc
Apache vs nginx comparados em como lidam com conexões, .htaccess por diretório versus config central, reloads e proxy, com um conversor para regras de rewrite comuns.
Os dois são servidores web open source maduros. O Apache carrega módulos em um modelo de processos à sua escolha (prefork, worker ou event) e deixa cada diretório sobrescrever configurações com arquivos .htaccess. O nginx roda um processo master e alguns workers orientados a eventos, lê apenas a config central e costuma ficar na frente de servidores de aplicação como reverse proxy.
Apache e nginx lado a lado
Tema
Apache httpd 2.4
Tratamento de conexões
Escolha um MPM: prefork, worker ou event (event é o padrão usual em Unix modernos)
Um processo master mais processos worker usando um modelo baseado em eventos
Config por diretório
Arquivos .htaccess, se AllowOverride permitir (padrão None)
Nenhuma: tudo fica nos arquivos de config principais
upstream: round robin, least_conn, ip_hash, hash, random
Testar e recarregar
apachectl configtest, depois apachectl graceful
nginx -t, depois nginx -s reload
Escolher entre os dois é principalmente uma questão de onde fica a configuração e de quem pode alterá-la. Esta página deixa de lado alegações de benchmark, que dependem totalmente da carga e do ajuste, e foca nas diferenças que você encontra ao manter um site: como cada servidor lida com conexões, por que o .htaccess existe e como converter as regras de rewrite que você já tem. Use o conversor para ver a versão nginx de uma regra Apache conhecida.
Escolha uma tarefa no conversor, como forçar HTTPS ou mandar todo caminho desconhecido para index.html.
Digite o seu domínio para que as duas versões fiquem prontas para colar.
Coloque a versão Apache no virtual host ou no .htaccess, ou a versão nginx dentro do server block correspondente.
Teste antes de recarregar: apachectl configtest para o Apache, nginx -t para o nginx.
No Apache, prefira a config principal do servidor ao .htaccess quando você controla a máquina. A documentação do Apache diz isso diretamente, porque permitir .htaccess faz o httpd procurar o arquivo em cada diretório do caminho de cada requisição.
No nginx, um bloco if que testa o host quase sempre fica melhor como um server block separado com return 301.
Troque cadeias de verificações de arquivo com RewriteCond por uma única linha try_files; o nginx verifica os caminhos listados em ordem.
Lembre que as linhas add_header do nginx não são herdadas por um bloco que define o próprio add_header. Repita os headers de segurança em todo location que define algum header.
Rodar os dois é comum: o nginx na borda para TLS e arquivos estáticos, fazendo proxy das requisições dinâmicas para o Apache em uma porta local.
Perguntas frequentes
O nginx é mais rápido que o Apache?
Depende da tarefa e do ajuste, então desconfie de qualquer número isolado. Os workers orientados a eventos do nginx foram feitos para manter muitas conexões ociosas com baixo custo. O MPM event do Apache diminuiu essa diferença usando também polling thread-safe. Meça a sua própria carga antes de trocar só por velocidade.
O nginx aceita arquivos .htaccess?
Não. O nginx não tem arquivos de sobrescrita por diretório, então as regras de um .htaccess precisam ir para a configuração do servidor e o nginx precisa ser recarregado. É uma troca deliberada: nenhuma busca de arquivo a cada requisição, mas só quem tem acesso à config principal pode mudar as regras.
Dá para converter .htaccess para nginx automaticamente?
Redirecionamentos e fallbacks simples se convertem sem problema, como mostra o conversor desta página. Cadeias longas de RewriteCond com flags como [P] ou variáveis de ambiente precisam de uma pessoa para lê-las, porque o nginx expressa a mesma intenção com blocos de construção diferentes.
Qual devo escolher para um site WordPress ou PHP?
Se a sua hospedagem só dá acesso aos arquivos, o Apache com .htaccess é o que permite mudar regras. Em um servidor que você controla, os dois funcionam com PHP-FPM; no nginx você escreve o fallback de URLs amigáveis uma vez com try_files no server block.
Como recarregar a config sem derrubar conexões?
No nginx, rode nginx -s reload: o master verifica a nova config, inicia novos workers e pede aos antigos que terminem com calma. No Apache, apachectl graceful faz o equivalente para os processos filhos.
Modelos de processo em termos simples
O Apache delega o tratamento de conexões a um Multi-Processing Module. prefork usa um processo por conexão e não precisa de threads. worker roda vários processos com muitas threads cada. event se baseia no worker e usa polling thread-safe para que conexões keep-alive ociosas não prendam uma thread. Nos sistemas Linux e BSD atuais, event é escolhido por padrão.
O nginx tem um processo master que lê a configuração e gerencia os workers, e um pequeno número de processos worker que lidam cada um com muitas conexões por meio de um event loop.
Por que o .htaccess importa
O .htaccess permite que alguém sem acesso root mude regras de um diretório, e é por isso que as hospedagens compartilhadas dependem dele. O preço é que cada requisição faz o Apache procurar o arquivo em cada diretório pai, mesmo quando nenhum existe. Com AllowOverride None, que é o padrão, esses arquivos são totalmente ignorados.
O mesmo site nos dois servidores
Virtual host do Apache
Arquivos estáticos de uma pasta mais um fallback de SPA, configurados no vhost para dispensar o .htaccess.
Server block do nginx
O mesmo comportamento: pasta raiz, fallback com try_files e uma página de erro personalizada.
Forçar HTTPS
O Apache testa a flag HTTPS; o nginx usa um server separado na porta 80 que só redireciona.
Mandar o domínio sem www para o www
A documentação do nginx recomenda um server block dedicado com return em vez de um if no host.
Fallback de single-page app
Serve arquivos reais quando existem e index.html para qualquer outro caminho.
Redirecionar uma página antiga
O Redirect do mod_alias não precisa do motor de rewrite; o nginx casa o caminho exato com location =.
Página 404 personalizada
Os dois apontam o erro para uma página do mesmo site.
Proxy de /api para um servidor de aplicação
O Apache precisa de mod_proxy e mod_proxy_http carregados, com barras finais iguais nos dois argumentos; o proxy do nginx já vem embutido.
Bloquear arquivos ocultos como .git
Impede que arquivos cujo nome começa com ponto sejam servidos.
Adicionar um header de segurança
Com always, os dois servidores adicionam o header também às respostas de erro, não só às de sucesso.