<!-- review: finished -->

<a id="troubleshooting"></a>

# Solução de Problemas

Se você encontrar um problema técnico
e não conseguir encontrar uma solução em outras seções,
faça uma pergunta no [fórum da comunidade](https://forum.angie.support/)
ou no [canal do Telegram](https://t.me/angie_support).

Suporte técnico para clientes:

- [https://support.angie.software](https://support.angie.software)
- [support@angie.software](mailto:support@angie.software)

<a id="debug-logging"></a>

## Log de Debug

O log de debug deve ser habilitado
antes de realizar autodiagnósticos ou conforme recomendado pelo suporte técnico.

Para fazer isso, execute o Angie usando o executável com suporte a debug:

Linux

Nos [pacotes pré-compilados](https://pt.angie.software//angie/docs/installation/index.md#install-packages) para Linux,
o arquivo `angie-debug` é compilado com log de debug habilitado:

```console
$ ls -l /usr/sbin/ | grep angie

   lrwxrwxrwx 1 root root      13 Sep 21 18:58 angie -> angie-nodebug
   -rwxr-xr-x 1 root root 1561224 Sep 21 18:58 angie-debug
   -rwxr-xr-x 1 root root 1426056 Sep 21 18:58 angie-nodebug
```

Configure a execução do `angie-debug`:

```console
$ sudo ln -fs angie-debug /usr/sbin/angie
$ sudo angie -t && sudo service angie upgrade
```

Isso iniciará uma [atualização de executável ao vivo](https://pt.angie.software//angie/docs/configuration/runtime.md#service-upgrade).

Para reverter ao executável regular após a depuração:

```console
$ sudo ln -fs angie-nodebug /usr/sbin/angie
$ sudo angie -t && sudo service angie upgrade
```

FreeBSD

Nos [pacotes pré-compilados](https://pt.angie.software//angie/docs/installation/index.md#install-packages) para FreeBSD,
o arquivo `angie-debug` é compilado com log de debug habilitado:

```console
$ ls -l /usr/local/sbin/ | grep angie

   lrwxrwxrwx 1 root root      13 Sep 21 18:58 angie -> angie-nodebug
   -rwxr-xr-x 1 root root 1561224 Sep 21 18:58 angie-debug
   -rwxr-xr-x 1 root root 1426056 Sep 21 18:58 angie-nodebug
```

Configure a execução do `angie-debug`:

```console
$ sudo ln -fs angie-debug /usr/local/sbin/angie
$ sudo angie -t && sudo service angie upgrade
```

Isso iniciará uma [atualização de executável ao vivo](https://pt.angie.software//angie/docs/configuration/runtime.md#service-upgrade).

Para reverter ao executável regular após a depuração:

```console
$ sudo ln -fs angie-nodebug /usr/local/sbin/angie
$ sudo angie -t && sudo service angie upgrade
```

Docker

Nas [imagens Docker com template](https://pt.angie.software//angie/docs/installation/docker.md#docker-images),
você pode alternar para a versão de debug
sobrescrevendo a variável de ambiente `ANGIE_BINARY`:

```console
$ docker run -it --rm -e ANGIE_BINARY="angie-debug" \
  docker.angie.software/angie:templated
```

Compilação a partir do Código Fonte

Ao compilar o Angie a partir do código fonte,
[habilite a depuração](https://pt.angie.software//angie/docs/installation/sourcebuild.md#configure) antes da compilação:

```console
$ ./configure --with-debug ...
```

Após a instalação, **angie -V** permite verificar
se o log de debug está habilitado:

```console
$ angie -V

  ...
  configure arguments: --with-debug ...
```

#### NOTE
Usar o executável com suporte a debug
pode reduzir ligeiramente a performance;
habilitar o log de debug pode reduzi-la significativamente
e aumentar o uso de espaço em disco.

Para habilitar o log de debug,
defina o nível `debug` na configuração
usando a diretiva [error_log](https://pt.angie.software//angie/docs/configuration/modules/core.md#error-log):

```nginx
error_log /path/to/log debug;
```

E recarregue a configuração:

```console
$ sudo angie -t && sudo service angie reload
```

Nas [imagens Docker com template](https://pt.angie.software//angie/docs/installation/docker.md#docker-images)
com log de debug habilitado,
você também pode usar a variável de ambiente `ANGIE_ERROR_LOG_SEVERITY`:

```console
$ docker run -it --rm -e ANGIE_BINARY="angie-debug" \
-e ANGIE_ERROR_LOG_SEVERITY="debug" \
docker.angie.software/angie:templated
```

Se você alternar para o executável sem suporte a debug
mas deixar o nível `debug` na diretiva [error_log](https://pt.angie.software//angie/docs/configuration/modules/core.md#error-log),
o Angie registrará entradas no nível `info`.

Sobrescrever [error_log](https://pt.angie.software//angie/docs/configuration/modules/core.md#error-log) na configuração
sem especificar o nível `debug` desabilita o log de debug.
Aqui, sobrescrever o log no nível [server](https://pt.angie.software//angie/docs/configuration/modules/http/index.md#server)
desabilita o log de debug para um servidor individual:

```nginx
error_log /path/to/log debug;

http {
   server {
     error_log /path/to/log;
    # ...
```

Para evitar isso, remova a linha que sobrescreve [error_log](https://pt.angie.software//angie/docs/configuration/modules/core.md#error-log),
ou defina o nível `debug` nela:

```nginx
error_log /path/to/log debug;

http {
   server {
     error_log /path/to/log debug;
   #  ...
```

<a id="directive-location"></a>

### Localização da Diretiva

A localização da diretiva [error_log](https://pt.angie.software//angie/docs/configuration/modules/core.md#error-log)
afeta a completude das informações de debug coletadas.

Uma diretiva especificada em um nível de configuração mais baixo
(por exemplo, dentro de um bloco `server` ou `location`)
sobrescreve as configurações de log especificadas em um nível mais alto
(por exemplo, no nível de configuração principal ou dentro de um bloco `http`).

### Log de debug desabilitado para um servidor específico

Se o log de debug estiver habilitado globalmente
mas [error_log](https://pt.angie.software//angie/docs/configuration/modules/core.md#error-log) for especificado para um servidor individual sem o nível `debug`,
as informações de debug não serão coletadas para esse servidor.

```nginx
error_log /var/log/angie/error.log debug; # Log de debug global

http {

    server {

        listen 80;
        server_name example.com;

        error_log /var/log/angie/example.com.error.log;
        # Log de debug para example.com está desabilitado, arquivo contém nível info

        # ...
    }

    server {

        listen 80;
        server_name another.com;

        # Este servidor usará o log de debug global
        # ...
    }
}
```

### Preservando o log de debug no nível do servidor

Para preservar a coleta de informações de debug para um servidor específico
mas direcioná-las para um arquivo diferente,
você também deve especificar o nível `debug`:

```nginx
error_log /var/log/angie/error.log debug; # Log de debug global

http {

    server {

        listen 80;
        server_name example.com;

        error_log /var/log/angie/example.com.error.log debug;
        # Log de debug para example.com está habilitado mas escrito em arquivo separado

        # ...
    }
}
```

Portanto, para habilitar o log de debug globalmente
mas sobrescrever o arquivo de log para blocos individuais,
também especifique o nível `debug` nessas sobrescrições.
Caso contrário, se nenhum nível de log for especificado na diretiva [error_log](https://pt.angie.software//angie/docs/configuration/modules/core.md#error-log),
o nível `error` será usado por padrão
e as informações de debug para esses blocos serão perdidas.

<a id="logging-specific-addresses"></a>

### Log de Endereços Específicos

Você pode habilitar o log de debug apenas para
[endereços de cliente especificados](https://pt.angie.software//angie/docs/configuration/modules/core.md#debug-connection):

```nginx
error_log /path/to/log;

events {
  debug_connection 192.168.1.1;
  debug_connection 192.168.10.0/24;
}
```

<a id="cyclic-memory-buffer"></a>

### Buffer de Memória Cíclico

O log de debug pode ser escrito em um buffer de memória cíclico:

```nginx
error_log memory:32m debug;
```

Escrever no buffer de memória no nível `debug`
não impactará significativamente a performance mesmo sob alta carga.
Neste caso, o log pode ser extraído usando um script GDB, por exemplo:

```console
set $log = ngx_cycle->log

while $log->writer != ngx_log_memory_writer
  set $log = $log->next
end

set $buf = (ngx_log_memory_buf_t *) $log->wdata
dump binary memory debug_log.txt $buf->start $buf->end
```

<a id="core-dumps"></a>

## Core Dumps

Core dumps ajudam a investigar crashes.
Inclua-os ao [entrar em contato com o suporte](#troubleshooting).
Para builds dos [nossos repositórios](https://pt.angie.software//angie/docs/installation/index.md#install-packages),
fornecemos símbolos de debug em pacotes especiais.
Eles têm os mesmos nomes dos pacotes originais
com o sufixo `-dbg` adicionado, por exemplo `angie-dbg`.

#### NOTE
Esta seção assume
que você está executando o Angie como usuário `root` (recomendado).

<a id="linux-systemd"></a>

### Linux: systemd

Para habilitar o salvamento de core dump ao executar o Angie como um serviço **systemd**
(por exemplo, quando [instalado a partir de pacotes](https://pt.angie.software//angie/docs/installation/index.md#install-packages)),
modifique as [configurações do serviço](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Process%20Properties)
no arquivo `/lib/systemd/system/angie.service`:

```ini
[Service]
...
LimitCORE=infinity
LimitNOFILE=65535
```

Ou atualize as [configurações globais](https://www.freedesktop.org/software/systemd/man/systemd-system.conf.html)
no arquivo `/etc/systemd/system.conf`:

```ini
[Manager]
...
DefaultLimitCORE=infinity
DefaultLimitNOFILE=65535
```

Em seguida, recarregue a configuração do serviço e reinicie o Angie
para reproduzir as condições de crash:

```console
$ sudo systemctl daemon-reload
$ sudo systemctl restart angie.service
```

Após o crash, encontre o arquivo de core dump:

```console
$ sudo coredumpctl -1 # opcional

   TIME                           PID   UID   GID SIG COREFILE  EXE
   --- |sampledateshort| 11:05:40 GMT   1157     0     0  11 present   /usr/sbin/angie

$ sudo ls -al /var/lib/systemd/coredump/  # padrão, veja também /etc/systemd/coredump.conf e /etc/systemd/coredump.conf.d/*.conf

  ...
  -rw-r----- 1 root root 177662 Jul 27 11:05 core.angie.0.6135489c850b4fb4a74795ebbc1e382a.1157.1590577472000000.lz4
```

<a id="linux-manual-configuration"></a>

### Linux: Configuração Manual

Verifique as [configurações de core dump](https://man7.org/linux/man-pages/man5/limits.conf.5.html)
no arquivo `/etc/security/limits.conf`, modifique-as se necessário:

```none
root soft core 0          # por padrão desabilita core dumps
root hard core unlimited  # permite aumentar o limite de tamanho
```

Em seguida, aumente o limite de tamanho do core dump usando [ulimit](https://man7.org/linux/man-pages/man1/ulimit.1p.html),
depois reinicie o Angie para reproduzir as condições de crash:

```console
$ sudo ulimit -c unlimited
$ sudo cd <caminho para o diretório de instalação do Angie>
$ sudo sbin/angie  # ou sbin/angie-debug
```

Após o crash, encontre o arquivo de core dump:

```console
$ sudo ls -al <caminho para o diretório de trabalho do Angie>  # padrão, veja /proc/sys/kernel/core_pattern
  ...
  -rw-r----- 1 root root 177662 Jul 27 11:05 core.1157
```

<a id="freebsd"></a>

### FreeBSD

Verifique as [configurações de core dump](https://man.freebsd.org/cgi/man.cgi?query=sysctl.conf&sektion=5)
no arquivo `/etc/sysctl.conf`, modifique-as se necessário:

```ini
kern.coredump=1                             # deve ser 1
kern.corefile=/caminho/para/arquivos/core/%N.core   # precisa do caminho correto
```

Ou atualize as configurações em tempo de execução:

```console
$ sudo sysctl kern.coredump=1
$ sudo sysctl kern.corefile=/caminho/para/arquivos/core/%N.core
```

Em seguida, reinicie o Angie para reproduzir as condições de crash.
Se o Angie estiver instalado como um serviço:

```console
$ sudo service angie restart
```

Se o Angie estiver instalado manualmente:

```console
$ sudo cd <caminho para o diretório de instalação do Angie>
$ sudo sbin/angie
```

Após o crash, encontre o arquivo de core dump:

```console
$ sudo ls -al <caminho para os arquivos de core dump>

  ...
  -rw------- 1 root root 9912320 Jul 27 11:05 angie.core
```
