O documento descreve as principais características do Nginx, Apache e Varnish. O Nginx é um servidor leve e escalável que usa um modelo assíncrono, enquanto o Apache é mais pesado mas suporta conteúdo dinâmico internamente. O Varnish armazena conteúdo em cache para acelerar sites com alto tráfego.
2. Nginx
· Engine-X
· Servidor de Proxy Reverso para HTTP, HTTPS, SMTP, POP3 e IMAP. No
entanto, muito utilizado também como load balancer, servidor de cache HTTP e
WebServer.
· Escrito para quebrar a barreira C10k (http://kegel.com/c10k.html)
· Algoritmo baseado no funcionamento assíncrono e não-bloqueante de eventos
o que permite processar um número muito maior de pedidos em uma única (ou,
pelo menos, em muito poucas) thread(s). Desta forma, a principal vantagem é a
escalabilidade com pouco consumo de recursos.
3. Nginx
· Faz spawn de processos chamados de workers, onde cada um pode tratar
milhares de conexões. Os processos workers fazem isto através da
implementação de um mecanismo de looping que continuamente verifica e
processa eventos.
5. Nginx | Estrutura do arquivo de configuração
· Consiste em modulos controlados por diretivas
· Pode possuir um único arquivo de configuração ou um arquivo principal com
include em outros
· Diretivas são divididas em diretivas simples e diretivas em blocos
· Simples: Consiste no nome e parâmetros, separados por espaços e
terminados com ;
· Em blocos: Similar à simples, porém termina um conjunto de instruções
adicionais entre chaves {}. Se uma diretiva em blocos possuir outras diretivas
dentro das chaves, é chamado de contexto (events, http, server e location).
7. Apache
· Servidor usado por 56% dos websites no mundo
· Inicialmente baseado em processo (mpm_prefork) onde cada conexão
simultânea requer uma thread, o que era pouco performático por conta do alto
overhead. Posteriormente com o lançamento do Apache2 foram inseridos novos
módulos de multi-processamento, permitindo a troca de como as requests são
tratadas: mpm_worker (com base em threads) e mpm_event (com base em
eventos).
8. Apache
· mpm_prefork: Faz o spawn de processos com uma única thread para tratar
cada request. Cada processo filho consegue gerenciar uma única conexão por
vez. Enquanto o número de requests for menor que o número de processos, o
MPM performa muito bem, no entanto caso o número de requests passe a ser
maior que o número de processos, a performance diminui bastante.
· mpm_worker: Faz o spawn de processos de modo que cada processo
consegue tratar múltiplas threads. Cada thread consegue gerenciar apenas
uma conexão. O uso de threads é mais eficiente que o de processos, fazendo
com que este módulo seja melhor que o anterior. Novas conexões podem usar
imediatamente uma thread livre ao invés de ter que esperar por um processo
livre.
9. Apache
· mpm_event: É similar o módulo worker em algumas situações, mas é
otimizado para lidar com conexões keep-alive. Quando se usa mpm_worker, a
conexão irá manter uma thread por todo tempo que a conexão estiver ativa, por
outro lado, quando se utiliza o mpm_event, ele irá manter as conexões ativas
reservando threads dedicadas para o tratamento de conexões keep-alive e
passando requests ativos para outras threads, o que evita ele que fique preso
com conexões keep-alive, permitindo uma execução mais rápida.
10. Apache | Estrutura do arquivo de configuração
· De modo geral a configuração é similar ao Nginx.
· Pode possuir toda a configuração em um arquivo principal, ou utilizar includes
com outros arquivos para configurações individuais/específicas;
11. Apache | Estrutura do arquivo de configuração
Configuração básica: apache.conf.basic
Configuração mais completa: apache.conf.complex
12. Conteúdo estático e dinâmico
Ambos possuem maneiras diferentes de solicitações de conteúdo estático.
· Apache:
- Lida com conteúdos estáticos usando seus métodos baseados em arquivos
convencionais.
- Consegue processar conteúdo dinâminco através de mecanismos
internos para a linguagem em questão para cada instância worker, o que
permite executar conteúdo dinâmico internamente sem recorrer a componentes
externos. Estes macanismos internos podem ser habilitados através do
carregamento dinâmico de módulos no arquivo de configuração.
13. Conteúdo estático e dinâmico
· Nginx:
- Não possui mecanismos internos para processar conteúdo dinâmico
nativamente. Para processar requisições PHP por exemplo, ele precisa repassar
a requisição para um mecanismo externo executar e aguardar o conteúdo
renderizado ser trazido de volta. Isto pode resultar em um delay para o cliente.
- Esta comunicação precisa ser configurada entre o Nginx e um dos
seguintes protocolos que o Nginx saiba tratar: http, FastCGI, SCGI, uWSGI,
memcache.
14. Conteúdo estático e dinâmico
· Nginx:
- Entretanto, este modo de funcionamento pode trazer alguns benefícios.
Como o worker não possui um interpretador dinâmico embutido, todo este
overhead só é percebido em conteúdo dinâmico. Conteúdos estáticos podem
ser servidos de forma simples e direta e um interpretador só é acionado quando
necessário.
15. Varnish
· Um serviço que fica à frente do Servidor Web fazendo uma ponte entre o
usuário e o servidor, da mesma forma que um proxy reverso.
· Acelera uma conexão HTTP analisando conteúdos mais acessados e
armazenando uma cópia em cache (RAM).
· O servidor Web só é acessado quando o conteúdo do cache no Varnish expira
ou é alterado, diminuindo a carga no servidor Web. Por esta razão, em sites com
grandes volumes de acessos, é recomendável utilizá-lo ao invés de utilizar o
recurso de cache do próprio servidor Web por exemplo, para que o servidor web
lide apenas com o gerenciamento dos requests e não também do gerenciamento
do cache.
16. Varnish
· Por não sobrecarregar o servidor Web, permite um maior volume de visitas
simultâneas.