Série Nginx #4: Instalando módulos de terceiros
Tags: nginx, braziliandevs, devops, webdev
Published: 2021-09-16 15:17:44

Uhuu!! Chegamos em mais uma parte. 👊👊

Bem, os módulos no Nginx servem como uma extensão do servidor web. Eles podem ser instalados durante a compilação ou dinamicamente.

Os módulos trazem uma facilidade maior ao implementar e utilizar o Nginx. Podemos usar desde identificação do Estado até executar código PHP no próprio Nginx. A lista é graaaande.

Nesta postagem, aprenderemos a instalar módulos de terceiros. Este passo é importante para postagens futuras. Nelas utilizaremos vários módulos.

> Observação: É importante que você saiba compilar o código fonte do Nginx. Caso não tenha esse conhecimento, acesse a postagem [Série Nginx #2: Compilando o Nginx](https://dev.to/valdeirpsr/serie-nginx-2-compilando-o-nginx-3f9o)

Vamos lá! 🏃

--------------

## Verificando módulos instalados

Antes de instalar, nada mais justo que verificar se o módulo já está instalado, correto?

Para confirmar, basta executar o código abaixo:

```bash
# Verifica se o módulo foi instalado durante a compilação
nginx -V 2>&1 | grep --color geoip2

# Lista módulos dinâmicos
ls -lah /etc/nginx/modules-available
```

> A pasta `/etc/nginx/modules-available` pode variar de acordo com sua configuração de compilação, método de instalação e/ou sistema operacional. Caso você não saiba qual é a pasta de módulos, execute `nginx -V` e verifique o valor da opção `--module-path`.

Se aparecer algum resultado, o módulo *geoip2* está instalado. Caso contrário, vamos instalá-lo.🤲

--------------

## Instalando módulos

Para começar, instalaremos o módulo [GeoIP2](https://github.com/leev/ngx_http_geoip2_module) como exemplo.

Vamos começar clonando o projeto no diretório `/tmp/geoip2`

```bash
 git clone --depth 1 \
    https://github.com/leev/ngx_http_geoip2_module.git \
    /tmp/geoip2
```

Prontinho!! Agora precisamos instalar a biblioteca [libmaxminddb](https://github.com/maxmind/libmaxminddb) como pede a documentação do módulo.

Há duas formas de instalação: 1) [Compilando](https://github.com/maxmind/libmaxminddb#from-a-named-release-tarball); ou 2) Instalando via gerenciador de pacotes. Vamos escolher esta para facilitar as coisas. 😅

```bash
# Debian/Ubuntu
apt update;
apt install -y libmaxminddb-dev

# Alpine
apk update;
apk add --upgrade libmaxminddb-dev
```

Ótimo! Instalamos a biblioteca e já baixamos o módulo em `/tmp/geoip2`.

Vamos para o próximo passo. Don't stop! ⏩

--------------

## Compilando o módulo

Agora vamos navegar até a pasta do código fonte do Nginx.

> Se você não viu essa parte, recomendo voltar à postagem [Série Nginx #2: Compilando o Nginx](https://dev.to/valdeirpsr/serie-nginx-2-compilando-o-nginx-3f9o)

```bash
cd ~/nginx-1.21.2 # No meu caso
```

Hora de configurar 🕒. Utilizaremos a *flag* `--add-dynamic-module=<path>` para informar a pasta onde baixamos o código fonte do módulo.

```bash
# Configura os diretórios e
# quais módulos o Nginx deverá instalar
./configure \
    --with-compat \
    --add-module=/tmp/geoip2
```

> Caso você precise utilizar com proxies, utilize a *flag* `--with-stream`. O funcionamento depende de módulo para módulo.

Feito isso, vamos compilar o módulo.

```bash
make modules
```

Ótimo! Vamos enviar o módulo compilado para a pasta de módulos e carregá-lo nas configurações do Nginx.

```bash
# Carrega os módulos a pasta
cp objs/ngx_http_geoip2_module.so /etc/nginx/modules-available
```

Pronto! Tudo Instalado... 🎉💃
Mas... Verifique se o módulo realmente foi instalado. 😜

![Resultado do comando `nginx -V 2>&1 | grep --color geoip2` mostra que o módulo foi instalado com sucesso.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6u4fstlkf782mliwlvxg.png)
 
--------------

## Habilitando o módulo

Para habilitar um módulo, precisamos utilizar a diretiva `load_module <path>` no contexto *main* (principal).

```conf
echo "load_module modules-available/ngx_http_geoip2_module.so;" | \
    sudo tee -a /etc/nginx/modules-enabled/geoip2.conf
```

> O diretório do arquivo pode variar de acordo com sua configuração de compilação, método de instalação e/ou sistema operacional.

Reinicie o Nginx.

```bash
nginx -s reload
```

--------------

## Testando o módulo

> Não abordarei como configurar o módulo, que ficará para a próxima postagem, que será sobre segurança com Nginx.

{% asciinema 435128 %}

--------------

## Conclusão

É isso aí!!! Finalizamos mais uma parte. Nas próximas postagens, aprenderemos a configurar o GeoIP e a utilizar outros módulos.

Até breve! 🙌