DEV Community

Cover image for Série Nginx #2: Compilando o Nginx
Valdeir S.
Valdeir S.

Posted on • Edited on

1 1

Série Nginx #2: Compilando o Nginx

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ó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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Nos próximos capítulos, ao indicar um módulo irei informar qual flag deverá ser utilizada para instalá-lo com o Nginx. Ela deverá ser utilizada no momento da compilação.


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 essa 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
Enter fullscreen mode Exit fullscreen mode

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

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
include /etc/nginx/log_formats/*.conf;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
view raw nginx.conf hosted with ❤ by GitHub

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
Enter fullscreen mode Exit fullscreen mode

No vim, digite a configuração abaixo:

server {
    server_name _;

    index index.html index.htm;
    autoindex on;

    location / {
        try_files $uri $uri/ =404;
    }
}
Enter fullscreen mode Exit fullscreen mode

Ó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
Enter fullscreen mode Exit fullscreen mode

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

/usr/sbin/nginx -s reload
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

Billboard image

Try REST API Generation for Snowflake

DevOps for Private APIs. Automate the building, securing, and documenting of internal/private REST APIs with built-in enterprise security on bare-metal, VMs, or containers.

  • Auto-generated live APIs mapped from Snowflake database schema
  • Interactive Swagger API documentation
  • Scripting engine to customize your API
  • Built-in role-based access control

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay