Série Nginx #2: Compilando o Nginx

Valdeir Psr
7 min readSep 3, 2021

--

Image by https://kinsta.com/

Opa!! Chegamos em mais uma parte da série sobre Nginx.

Neste capítulo, aprenderemos como compilar o código fonte do Nginx no Ubuntu.

Quais as vantagens? 😎

  • Flexibilidade;
  • Utilização de módulos de terceiros;
  • Aplicar as correções de segurança mais recentes.

E as desvantagens? 😢

  • É mais complexo;
  • Demanda mais tempo.

Do que preciso para compilar o código?? 👷

Precisamos instalar algumas ferramentas para “buildar” e adicionar suporte a determinadas funcionalidades do Nginx. São elas:

apt update;
apt install -y curl \
vim \ # Será nosso editor <3
build-essential \ # Serve para "buildar"
gcc \ # " para compilar o código escrito em C
systemd \ # " para gerenciar o serviço do servidor
libgd-dev \ # " para o uso do módulo de otimização de imagem (será mostrado em outro capítulo)
libpcre3-dev \ # " para funções do Core e da diretiva Rewrite, Location (RegExp em geral)
libssl-dev \ # " para utilizar SSL
libmaxminddb-dev \ # " para usar um módulo de terceiro para GeoIP2
zlib1g-dev # " para otimização com GZIP

Ferramentas instaladas, vamos baixar nosso Nginx. Neste capítulo, utilizaremos a versão 1.21.

Baixá-la é simples, basta executar o comando abaixo em seu terminal.

# Baixa e extrai
curl -sSLo- http://nginx.org/download/nginx-1.21.2.tar.gz | \
tar -xzvf -

# Acessa a pasta criada
cd nginx-1.21.2

Ótimo! Baixamos! Agora é hora de usar as ferramentas baixadas para compilar o Nginx. 🎉🎉

Irei deixar o código completo e depois explicarei cada uma das flags.

# Configura os diretórios e
# quais módulos o Nginx deverá instalar
./configure \
\
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/run/nginx.pid \
--modules-path=/etc/nginx/modules-available \
\
--http-client-body-temp-path=/usr/local/nginx/client_body_temp \
--http-proxy-temp-path=/usr/local/nginx/proxy_temp \
--http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp \
--http-scgi-temp-path=/usr/local/nginx/scgi_temp \
\
--with-debug \
--with-compat \
--with-pcre-jit \
--with-pcre \
--user=www-data \
--group=www-data \
--with-threads \
\
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_auth_request_module \
--with-http_v2_module \
--with-http_dav_module \
--with-http_slice_module \
--with-http_addition_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module=dynamic \
--with-http_sub_module \
--with-stream=dynamic \
--with-stream_ssl_module \
\
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module

# Compila o Nginx já configurado
make

# Instala o Nginx no sistema
make install

Apareceu algum erro? Não? 🎉🎉
Ótimo! Finalizamos a instalação do servidor. Para testar, basta iniciar o serviço do Nginx e abrir o navegador http://localhost 🖥

/usr/sbin/nginx

Explicação das Flags 🚩

Não é obrigatório saber todas, mas é importante saber o que você está instalando e para que cada flag serve.

Configurações de Caminhos

O script configure permite definir caminhos para arquivos binários e de configuração NGINX e para bibliotecas dependentes como PCRE ou SSL, a fim de vinculá-los ao binário NGINX.

  • — prefix=<path>
    Define o diretório principal das configurações do Nginx. Padrão: /usr/local/nginx
  • — sbin-path=<path>
    Define o nome e o caminho do arquivo executável. Padrão: <prefix>/sbin/nginx
  • — conf-path=<path>
    Define o arquivo principal de configuração do Nginx. É possível carregar o Nginx com um arquivo de configuração diferente, basta usar a flag -c <file>. Padrão: <prefix>/nginx.conf
  • — http-log-path=<path>
    Define o arquivo principal do log de acesso geral. É possível configurar um arquivo diferente para cada servidor virtual usando a diretiva access_log. Padrão: <prefix>/logs/access.log
  • — error-log-path=<path>
    Define o arquivo principal do log de erro geral. É possível configurar um arquivo diferente para cada servidor virtual usando a diretiva error_log. Padrão: <prefix>/logs/error.log
  • — pid-path=<path>
    Define o nome do arquivo que conterá o PID (ID do processo mestre). Você pode alterar o local no arquivo nginx.conf. Padrão: <prefix>/logs/nginx.pid
  • — modules-path=<path>
    Define o diretório onde os módulos dinâmicos serão instalados. Padrão: <prefix>/modules/

Configurações de diretórios de dados temporários

  • — http-client-body-temp-path=<path>
    Define o diretório em que será armazenados temporariamente o corpo das requisições. Padrão: <prefix>/client_body_temp
  • — http-proxy-temp-path=<path>
    Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar proxy reverso. Padrão: <prefix>/proxy_temp
  • — http-fastcgi-temp-path=<path>
    Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar por servidores FastCGI. Padrão: <prefix>/fastcgi_temp
  • — http-uwsgi-temp-path=<path>
    Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar por servidores UWSGI. Padrão: <prefix>/uwsgi_temp
  • — http-scgi-temp-path=<path>
    Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar por servidores SCGI. Padrão: <prefix>/scgi_temp

Configurações gerais do Nginx

  • — with-debug
    Habilita os logs de debug.
  • — with-compat
    Habilita a compatibilidade com módulos dinâmicos.
  • — with-pcre-jit
    Habilita a biblioteca PCRE com suporte a “just-in-time compilation”. Requer a biblioteca PCRE instalada.
  • —with-pcre
    Força o uso da biblioteca PCRE. Requer a biblioteca PCRE instalada.
  • — user=user-name
    Define o usuário sem privilégios cujas credentiais serão usadas nos processos de trabalho (Services Worker). Padrão: nobody
  • — group=group-name
    Define o nome do grupo sem privilégios cujas credentiais serão usadas nos processos de trabalho (Services Worker). Padrão: O mesmo que — user
  • — with-threads
    Habilita a thread pools. Elas são usadas para leitura e envio de arquivos sem bloquear os processos de trabalho.

Ativando módulos

O NGINX consiste em um conjunto de módulos específicos de função, que são compilados com o script configure junto com outras opções de construção.

Se você quiser ativar um módulo que não é “buildado” por padrão, utilize o prefixo --with-<nome_do_modulo>.

  • — with-http_ssl_module
    Habilita suporte ao protocolo HTTPS para um servidor virtual. Requer a biblioteca openssl.
  • — with-http_stub_status_module
    Habilita o módulo ngx_http_stub_status_module. Ele é usado por plataformas de métrica ou gerenciamento de logs.
  • — with-http_realip_module
    Habilita o módulo ngx_http_realip_module. Ele é usado para alterar o endereço do cliente. Com o Cloudflare, por exemplo, permite identificar o IP real do usuário.
  • — with-http_auth_request_module
    Habilita o módulo ngx_http_auth_request_module. Ele é utilizado para implementação de subrequisições para autenticação.
  • — with-http_v2_module
    Habilita suporte ao protocolo HTTP/2.
  • — with-http_dav_module
    Habilita o módulo ngx_http_dav_module. Ele é utilizado para gerenciamento de arquivos com o protocolo WebDAV.
  • — with-http_slice_module
    Habilita o módulo ngx_http_slice_module. Ele é usado para dividir uma requisição. Isso permite retornar partes de um arquivo de acordo com o cabeçalho Range, por exemplo.
  • — with-http_addition_module
    Habilita o módulo ngx_http_addition_module. Ele é usado para modificar uma resposta adicionando um conteúdo antes ou depois dela.
  • — with-http_gunzip_module
    Habilita o módulo ngx_http_gunzip_module. Ele é utilizado para compactação com gzip.
  • — with-http_gzip_static_module
    Habilita o módulo ngx_http_gzip_static_module. Ele é utilizado para transferência de arquivos compactados com gzip.
  • — with-http_image_filter_module=dynamic
    Habilita o módulo ngx_http_image_filter_module. Ele serve para modificar/alterar arquivos de imagens (JPEG, GIF, PNG, WEBP).
  • — with-http_sub_module
    Habilita o módulo ngx_http_sub_module. Ele permite substituir trechos da resposta.
  • — with-stream=dynamic
    Habilita o módulo ngx_stream_core_module para proxy TCP/UDP e balanço de carga genérico.
  • — with-stream_ssl_module
    Habilita o suporte ao procotolo SSL/TLS para módulo ngx_stream_core_module.

Desativando módulos

Alguns módulos como Rewrite e HTTP são “buildados” por padrão. Para desativá-los, basta usar o prefixo --without-<nome-do-modulo>.

  • — without-mail_pop3_module
    Desabilita o protocolo POP3 para o proxy de email
  • — without-mail_imap_module
    Desabilita o protocolo IMAP para o proxy de email
  • — without-mail_smtp_module
    Desabilita o protocolo SMTP para o proxy de email

Ufa!! Terminamos. 🥱🥱
Para saber outras flags, basta acessar o link http://nginx.org/en/docs/configure.html

Organizando nossa estrutura 📝

Se você abrir o arquivo /etc/nginx/nginx.conf, verá que o Nginx já deixou uma configuração pronta. Eu não curto muito essa estrutura e configuração, então mudá-la-ei, mas este passo é totalmente opcional e fica de acordo com o gosto de cada dev.

# Cria as pastas necessárias
mkdir -p /etc/nginx/{modules-enabled,config_default,sites-available,sites-enabled,log_formats,snippets} /var/www/html

# Move os arquivos de exemplo
mv /etc/nginx/*.default /etc/nginx/config_default

Agora vamos rescrever o arquivo de configuração /etc/nginx/nginx.conf com o conteúdo abaixo:

Falta pouco! Como removemos o código padrão, nosso servidor parou de funcionar. Precisamos criar um novo servidor virtual, beleza? 👍

vim /etc/nginx/sites-available/valdeir.dev.conf

No vim, digite a configuração abaixo:

server {
server_name _;

index index.html index.htm;
autoindex on;

location / {
try_files $uri $uri/ =404;
}
}

Ótimo! Agora é necessário criar um link simbólico no diretório sites-enabled para ativar o site. Ainda no vim, aperte ESC duas vezes e digite:

:w <enter>
:! ln -s %:p /etc/nginx/sites-enabled <enter>
:q

Após cada modificação nos arquivos de configuração, é necessário recarregar o Nginx.

/usr/sbin/nginx -s reload

Criando serviço no Ubuntu

Este passo também é opcional. Ele permitirá gerenciar o Nginx através do systemd (auto iniciar, parar, recarregar etc).

É simples! Basta criar o arquivo /lib/systemd/system/nginx.service com o código abaixo:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

O valor de PIDFile deverá ser igual ao da flag --pid-path, que usamos durante a compilação.

O valor de ExecStartPre, ExecStart e ExecReload deverá ser igual ao da flag --sbin-path.

Conclusão

Chegamos ao final de mais um capítulo. Nos próximos, aprenderemos o que e como funcionam as princiais diretivas do Nginx; aprenderemos também como melhorar e segurança e performance de nossos sites.

--

--