Desvendando o Nginx - Parte 1

O Nginx é um servidor web, Proxy reverso, Proxy balanceador de carga, com um performance muito maior se comparado com outros servidores WEB como o APACHE. O Nginx (pronuncia-se "enginex") é um servidor de alta performance, gratuito e open-source, bem como um servidor proxy para IMAP/POP3.

Escrito em C por Igor Sysoev em 2002, com sua primeira versão pública liberada em 2004. O Nginx é conhecido por sua estabilidade, rico conjunto de características/facilidades, simples configuração e baixo consumo de recursos. Aqui no LEMAF, por exemplo, usamos tanto Apache, quanto Nginx (dando preferência ao Nginx).


Instalação

O Nginx roda na plataforma GNU/Linux, no Microsoft Windows, ou no OsX da Apple. No entanto, esta abordagem será em GNU/Linux. Se você usa alguma distribuição GNU/Linux baseada em Debian como por exemplo o Ubuntu, basta digitar o seguinte comando:

sudo apt-get install -y nginx  

Dica: Ainda que o apt-get seja o gerenciador de pacotes mais conhecido, é interessante usar o aptitude que é uma evolução do apt-get. Por outro lado, se você usa alguma distribuição baseada em Redhat, basta digitar o comando a seguir:

sudo yum install -y nginx  

Dica: Se a distribuição é o Fedora, no lugar do yum, use o dnf. No caso da distribuição ser diferente das citadas, consulte o site o https://nginx.org/. Assim que terminar de instalar, será necessário ativar o daemon do Nginx:

sudo systemctl enabled nginx.service  

Agora inicializaremos o serviço:

sudo systemctl start nginx.service  

Dica: As versões mais atuais do Ubuntu, Fedora ou Debian, já não rodam o sistema de inicialização de serviços antigos. Isto é, não rodam mais o SysV init que anteriormente iniciava serviços através do (/etc/init.d/script). Ao invés, o padrão da maioria das distribuições é o systemd. Por este motivo agora usa-se o systemctl (system control) para iniciar os serviços. Em alguns casos ainda é possível usar o padrão service nginx start que na verdade é redirecionado para o comando systemctl de todo modo.

A diferença básica entre as distribuições GNU/Linux são basicamente caminhos, comandos, ciclos de vida ,atualização e política de segurança. No entanto, ainda sim, é mantido o padrão denominado LSB - Linux Standart Base.


Entendendo a estrutura do Nginx

O Nginx armazena seus arquivos de configuração dentro do diretório /etc/nginx por padrão. Este diretório também contém outras pastas como mostra abaixo:

conf.d/         koi-win           naxsi.rules   scgi_params       uwsgi_params  
fastcgi_params  mime.types        nginx.conf     win-utf  
koi-utf         naxsi_core.rules  proxy_params  

Nota: Se você está vindo do Apache, é interessante criar o mesmo padrão de pastas como o sites-available, e sites-enabled.

Em distribuições baseadas em Redhat como o Fedora/Centos, o nginx vem crú, sem esta configuração ao estilo Apache. Neste caso, será necessário criar tais pastas (diferentemente de distribuições baseadas em Debian que já vem com tais configurações por padrão). Estes diretórios são usados ​​para definir configurações para as suas aplicações. Os arquivos são geralmente criados no diretório sites-available, e, em seguida, simbolicamente ligados ao diretório sites-enabled.


Configuração básica do Nginx

Partindo do Fedora e seguindo o padrão Apache de diretórios (opcional), então vamos criar os diretórios:

cd /etc/nginx/  
sudo mkdir sites-available sites-enabled  

Atenção: Como descrito a cima, a criação de ambas as pastas só será necessário em distribuições baseadas em Redhat. Agora basta editar o nginx.conf e incluir o sites-enabled, e o conf.d como segue:

include /etc/nginx/conf.d/*.conf;  
include /etc/nginx/sites-enabled/*;  

Atenção: Geralmente se espera que o link simbólico no diretório sites-enabled sejam criados automaticamente. No entanto, nem sempre isto ocorre. Portanto, é interessante verificar se os links foram criados e cria-los manualmente caso seja necessário. Em outro exemplo, podemos habilitar as opções de compactação de arquivos bastando apenas adicionar as seguintes linhas no nginx.conf:

gzip on;  
gzip_disable "msie6";  

Nota: O parâmetro gzip_disable "msie6"; a cima, visa desativar o tipo de compactação Gzip para o navegador Internet Explorer 6 pois, este navegador não aceita este tipo de compactação de arquivos.

O diretório conf.d pode ser usado para a configuração do site também. Cada arquivo dentro deste diretório termina com .conf e é lido na configuração quando Nginx é iniciado garantindo assim, que cada arquivo defina sintaxe válida de configuração do Nginx. Na maioria dos casos, outros arquivos dentro do diretório /etc/nginx contêm detalhes de configuração de processos específicos ou componentes opcionais. Por fim, o arquivo nginx.conf estará assim:

user www-data;  
worker_processes 4;  
pid /run/nginx.pid;

events {  
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Você pode estar se perguntando: Mas que diabos são estes parâmetros do nginx.conf padrão? Vamos lá:

  • O user www-data; significa que o Nginx irá executar como usuário www-data. Isso é útil se você estiver fazendo a transição do Apache, onde o usuário é padrão é o www-data. Assim, você não terá que alterar a propriedade de todos os arquivos ou diretórios existentes.

  • O parâmetro worker_processes 4; é a espinha dorsal para o processamento do Nginx. Esta diretiva é responsável por deixar o nosso servidor virtual ciênte de que muitos processos são gastos de uma vez.

  • O pid /run/nginx.pid define um arquivo que irá armazenar o ID de processo do processo principal.

  • A diretiva events fornece a configuração em que as diretivas que afetam o processamento de conexão são especificados. Neste caso, o worker_connections 768 define o número máximo de conexões simultâneas que podem ser abertas por um processo de trabalho (768 por padrão).

Nota: Perceba que ainda dentro de events temos a diretiva multi_accept on; que por padrão vem comentado. Isto é, um processo vai aceitar uma nova conexão de cada vez. Caso contrário, um processo iria aceitar todas as novas conexões ao mesmo tempo.

Obs: A diretiva http assim como a diretiva events, funcionam como se fossem funções que encapsulam diretivas dentro delas. A diretiva http contém as configurações do protocolo http. Dentro do http temos alguns parâmetros. Como mostra a seguir:

  • A diretiva sendfile on; em modo on, isto é, ativo, não bloqueia a saída e entrada do disco informando que os dados não estão na memória. Em seguida, o nginx inicia uma carga de dados assíncronos através da leitura de um byte.

  • A diretiva tcp_nopush on; só é usada quando o sendfile também está ativo. Pois, esta diretiva é reponsável por enviar o cabeçalho de resposta de pacotes para o sistema operacional.

  • A diretiva tcp_nodelay on; só pode estar ativa quando um há transferência para o estado keep-alive.

  • A diretiva keepalive_timeout define um limite de tempo durante o qual uma conexão de cliente keep-alive vai ficar aberta no servidor. O valor zero desativa conexões keep-alive do cliente.

  • A diretiva types_hash_max_size define o tamanho máximo das hash tables.No caso, o padrão é 2048.

  • A diretiva server_tokens off; que está comentada por padrão, serve para emitir mensagens de erro ao servidor. Esta diretiva é extremamente importante quando não se sabe bem a causa de uma suposta falha envolvendo o nginx.

  • A diretiva server_names_hash_bucket_size; que também está comentada, define o tamanho de buckets para as tabelas de nome de hash para servidores. O valor padrão depende do tamanho do cache do processador.

  • A diretiva server_name_in_redirect off que também está comentada por padrão, é responsável por ativar ou desativar o uso do nome do servidor principal, especificado pela diretiva server_name, em redirecionamentos emitidos pelo nginx.

  • A diretiva include /etc/nginx/mime.types define o tipo MIME padrão de uma resposta. Isto é, o mapeamento das extensões de nome de arquivo para tipos de MIME pode ser definida com a diretiva types que corresponde a uma extensa lista de formados e extensões permitidas no nginx.

  • A diretiva default_type application/octet-stream; é uma declaração direta de mime type que não está declarado dentro do arquivo mime.types ativando a aplicação de stream de vídeo octet-stream.

  • A diretiva ssl_protocols por padrão cria compatibilidade aos formatos ssl TLS versão 1, 1.1, 1.2 não permitindo a iteração com o formato SLLv3. O formato SSLv3 ainda não está suficientemente maduro e por isto é um padrão inseguro.

  • Temos também as diretivas para geração de logs em seus devidos caminhos, no caso a diretiva access_log e error_log que são gerados por padrão em /var/log/nginx nos arquivos access.log e error.log.

  • Temos as diretivas para habilitar formatos de compactação através das configurações do formato gzip, da diretiva gzip_disable "msie6" que desabilita a compatibilidade com navegadores Internet Explorer 6 para evitar problemas, e outras configurações pertinentes para este tipo de compabilidade além de mime.types do formato.

  • Por fim, em Virtual Host Configs, é onde adicionamos os caminhos dos arquivos de configuração contidos na pasta sites-available, conf.d ou qualquer outra pasta que julgue pertinente.

Pronto. Já temos a configuração básica funcional do Nginx. Na parte 2 deste artigo, irei mostrar em detalhes os casos de uso para o Nginx o que envolve proxy_reverso, redirecionamento de endereços, proxy balanceador de carga, bloqueio e liberação de faixas de ip, cache, webserver, streaming, entre outras funcionalidades.


Sugestão para estudo: