Série Nginx #2: Compilando o Nginx

valdeirpsr

Valdeir S.

Posted on September 2, 2021

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:

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.

💖 💪 🙅 🚩
valdeirpsr
Valdeir S.

Posted on September 2, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Série Nginx #3: Conhecendo as diretivas
braziliandevs Série Nginx #3: Conhecendo as diretivas

September 8, 2021

Série Nginx #2: Compilando o Nginx
braziliandevs Série Nginx #2: Compilando o Nginx

September 2, 2021