Nginx (EngineX) é um servidor web e de correio eletrônico para IMAP, POP3 e SMTP, cuja principal característica é trabalhar em formato de Proxy reverso.
Foi originalmente escrito por Igor Sysoev, um russo, nascido em 1970, para o BSD, e posteriormente adaptado para Linux e outras distros. Teve seu lançamento oficial em outubro de 2004.
Está atualmente executando vários sites russos e internacionais, como Yandex , Mail.Ru , VK, Rambler, Dropbox , Netflix, Wordpress.com , FastMail.FM, Google, Adobe, Autodesk, Atlassian, Intuit, T-Mobile, GitLab, DuckDuckGo, Microsoft, IBM, Google, Adobe, Salesforce, VMWare, Xerox, LinkedIn, Cisco, Facebook, Target, Citrix Systems, Twitter, Apple, Intel, CloudFlare e muitos outros.
Basicamente o Nginx funciona acelerando a consulta e entrega de conteúdo web, mantendo um cache em memória no Servidor instalado.
Um Servidor web padrão funciona de forma a receber solicitações (GET) para um determinado Domínio. Ele verifica qual é o diretório no Servidor em que está este Domínio e entrega o primeiro arquivo .php ou .html que este domínio possui (geralmente index.php ou index.html). Após isso, o arquivo index é lido pelo browser do cliente e continua a realizar as demais solicitações, como imagens, css, scripts e outros arquivos. Cada solicitação ao Servidor recebe o mesmo tratamento individual.
Este processo, por cada conexão realizada com o Servidor, é chamada de thread. E ela é individual. Ou seja, cada conexão possui uma thread no Servidor que irá realizar o GET do arquivo solicitado diretamente no Diretório, em solicitação ao Sistema Operacional.
Quando ocorrem muitas solicitações, começa a haver uma espécie de fila de threads, ou seja, o Servidor começa a demorar a entregar o conteúdo, uma vez que há threads, ou entregas, ainda a serem realizadas.
Esta situação é ainda piorada quando se trata de alta quantidade de conteúdo, como motores de busca, streaming, bancos e outra aplicações deste tipo, que funcionam em cluster ou distribuídas. Neste caso, o conteúdo fica espalhado em vários Servidores e armazenamentos, demorando ainda mais para finalizar o thread.
Em casos extremos, o Servidor trava.
O Nginx muda este tratamento com o Servidor, transformando o thread em multi-thread, chamado workers. No Linux, um multi-thread consome menos tempo e energia que a realização de vários threads ao mesmo tempo.
Esta arquitetura e funcionalidade do Nginx faz a simultaneidade deste processo sem a necessidade de um thread adicional para cada nova conexão GET. Um único processo no Nginx pode receber e tratar simultaneamente milhares de conexões HTTP. Isso é obtido por um mecanismo de loop, denominado loop de evento.
Assim, as solicitações GET do cliente são processadas de forma assíncrona, sem aguardar fila, em um único thread e remetidas, simultaneamente, ao Servidor, sendo entregues e recebidas sem fila ou ordem de aguardar a conclusão do thread anterior.
Ao invés de fazer uma solicitação direta ao servidor de tipo thread, o Nginx executa um processo mestre, chamado worker, e vários processos de trabalho, chamados conexões worker. Toda essa atividade trabalha continuamente e de forma assíncrona.
Quando há um pedido de processamento de conteúdo, ele é feito pelas conexões worker, ao invés de iniciar apenas um thread. A conexão worker faz a solicitação ao processo mestre que, por sua vez, retorna o resultado do Servidor (conteúdos, PHP, etc). Isso permite o gerenciamento de inúmeras conexões simultâneas.
Este formato de conexão do Nginx é chamado de Event-based web server.
Nginx também trabalha de forma eficiente como Proxy e junto com o Apache. Neste caso, para a entrega de conteúdo estático ele trabalha as solicitações realizadas de forma mais rápida e global, agilizando o conteúdo de uma requisição e colocando em cache no Servidor.
Este processo, chamado de Proxy Reverso permite verificar se o conteúdo web já está disponível em cache, antes de realizar nova solicitação ao Sistema Operacional e arquivos, ou seja, acionar o Sistema operacional, sistema de arquivos, localização do arquivo no diretório, acessar o disco, ler, etc.
Na combinação com o Apache, quando uma requisição é realizada, o Nginx verifica se é um arquivo estático, como html, imagem ou CSS, por exemplo. Neste caso, o Nginx verifica se o conteúdo já está cacheado em memória e entrega o arquivo para o usuário, sem precisar lê-lo novamente. Se não estiver em cache, o Nginx faz a solicitação ao Sistema Operacional, recebe o arquivo e entrega.
Se for um arquivo dinâmico, ou seja, precisar ser processado e o resultado ser entregue, como PHP ou consulta a banco de dados, o Nginx encaminha a requisição para o Apache, que vai processar ela e entregar para o Nginx remeter o resultado para o visitante.
Da mesma forma que o Apache, o Nginx foi criado também com uma interface modular, ou seja, diferentes funções são oferecidas em módulos correspondentes, as quais os administradores optam por instalar e ativar. De maneira igual, ele possui várias funções que podem ser selecionadas para uso.
O Nginx com Reverse Proxy do cPanel & WHM passa o conteúdo estático e dinâmico por meio de proxy para o Apache.