Série Nginx #2: Compilando o Nginx
Valdeir S.
Posted on September 2, 2021
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
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
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
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
eExecReload
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.
Posted on September 2, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.