Files
projeto-importado/docs/mon_troubleshooting.md
2025-11-28 00:29:42 -03:00

356 lines
19 KiB
Markdown

# Monitoramento e Troubleshooting - Comandos Úteis e Cenários
>
> Essa documentação tem o intuito de listar comandos úteis para determinadas situações e também exemplo de cenários e ações que podem ser tomadas para identificação e resolução de um problema em questão!
>
[`1 - Servidores de Firewall`](#1-servidores-de-firewall)
[`2 - Servidores Apache PHP`](#2-servidores-apache-php)
[`3 - Servidores Banco de Dados`](#3-servidores-banco-de-dados)
[`4 - Servidores MSD`](#4-servidores-msd)
[`5 - Comandos Gerais - Linux`](#5-comandos-gerais-linux)
## 1 - Sevidores de Firewall
## 2 - Servidores Apache PHP
#### ⚙️ Status Serviços
Comandos para verificar status/reiniciar/parar/iniciar Serviço do Apache e PHP
```
systemctl stop apache2.service
systemctl start apache2.service
systemctl restart apache2.service
systemctl status apache2.service
apache2ctl -k graceful
systemctl stop php8.2-fpm.service
systemctl start php8.2-fpm.service
systemctl restart php8.2-fpm.service
systemctl status php8.2-fpm.service
```
#### ⚙️ Endereços Úteis - Monitoramento sem necessidade de acesso ao servidor
Endereços para monitoramento sem necessidade de conexão ao Linux no ambiente Apache e PHP:
```
https://cliente.atende.net/server-status
https://cliente.atende.net/qos
https://cliente.atende.net/fpm-status
https://cliente.atende.net/server-info
https://cliente.atende.net/realtime-status
```
#### ⚙️ Diretórios e Logs
Diretórios e Arquivos de Logs:
Logs do Apache: /var/log/apache2/
```
error.log
modsec_audit.log
cliente.atende.net-ssl-access.log
cliente.atende.net-access.log
cliente.atende.net-ssl-request.log
cliente.atende.net-request.log
ws-cliente.atende.net-ssl-access.log
ws-cliente.atende.net-access.log
ws-cliente.atende.net-ssl-request.log
ws-cliente.atende.net-request.log
origens-cliente.atende.net-ssl-access.log
origens-cliente.atende.net-access.log
origens-cliente.atende.net-ssl-request.log
origens-cliente.atende.net-request.log
nfse-cliente.atende.net-ssl-access.log
nfse-cliente.atende.net-access.log
nfse-cliente.atende.net-ssl-request.log
nfse-cliente.atende.net-request.log
```
Logs PHP: /var/log/
```
php8.2-fpm.log
php8.2-fpm-www-slow.log
```
#### ⚙️ Log de Segurança modsec_audit.log
Neste log em questão, teremos a requisição completa (incluindo cabeçalho, corpo e retorno da requisição) que foi efetuada e que só esta listada nesse arquivo pois teve um retorno de erro ou advertencia. Hoje este log esta formatando essas requisições em JSON.
Diretório: vim /var/log/apache2/modsec_audit.log
No exemplo abaixo, a requisição foi listado no log do modsec_audit pois retornou um HTTP 500 no servidor.
```
{"transaction":{"time":"20/Aug/2025:16:17:00.578210 --0300","transaction_id":"aKYfLG2RfxYn3hOC3rZ8sgAAARE","remote_address":"192.168.22.73","remote_port":58180,"local_address":"192.168.22.68","local_port":443},"request":{"request_line":"POST /atende.php?cidade=padrao&pg=rest&service=GLWRestAsyncTask&proc=run HTTP/1.1","headers":{"Accept":"application/json","Referer":"www.ipm.com.br","Authorization":"Basic b3RHa3VPTXBDL0VBcVRYaXcwNEk3T2FacFpaN1JLTm46aHF3OWVsUDlXdVpXVHBzZ094cnhSSkk4d3pqTUUxZGUweUFmcnJnSUdNdz0=","Content-Length":"192","Content-Type":"application/x-www-form-urlencoded","Host":"riodosul.atende.net","Connection":"Keep-Alive","User-Agent":"Apache-HttpClient/4.5.2 (Java/1.8.0_352)","Accept-Encoding":"gzip,deflate"},"body":["pathEstrutura=%2Fatende.php&cidade=padrao&ipInterno=177.54.11.78&enderecoHost=https%3A%2F%2Friodosul.atende.net&prioridadeExecucao=3&codigoTarefaAssincrona=5137901&action=asyncRun&rotina=20069"]},"response":{"protocol":"HTTP/1.1","status":500,"headers":{"Pragma":"no-cache","Cache-Control":"no-cache, must-revalidate","Expires":"Mon, 26 Jul 1997 05:00:00 GMT","Data-Servidor":"1755717420000","Exception-Info":"%7B%22Exception%22%3A%22%3Cdiv+class%3D%5C%22mensagem_sistema%5C%22%3EA+tarefa+ass%5Cu00edncrona+foi+cancelada%5C%2Fexpirada+ou+j%5Cu00e1+foi+executada+anteriormente.%3C%5C%2Fdiv%3E%22%2C%22Exception-Sistema%22%3A%22EST%22%2C%22Exception-Params%22%3A%5B%5D%2C%22Exception-Tipo%22%3A%223%22%2C%22Exception-Code%22%3A555%2C%22Exception-Log%22%3Anull%7D","Set-Cookie":"cidade=padrao; path=/; SameSite=lax","Set-Cookie":"PHPSESSID=aekff37apcqiqovl44o5isaovl; path=/; secure; HttpOnly","X-Frame-Options":"sameorigin","Upgrade":"h2,h2c","Connection":"Upgrade, close","X-XSS-Protection":"1; mode=block","Content-Security-Policy":"object-src 'self' data: blob: https://*.atende.net https://*.ipm.com.br https://*.nfs-e.net https://seal.digicert.com; block-all-mixed-content; form-action 'self' *.nfs-e.net https://*.ipm.com.br https://*.atende.net https://*.acesso.gov.br https://*.jucesc.sc.gov.br; frame-ancestors 'self' https://*.nfs-e.net https://*.ipm.com.br https://*.atende.net https://portalservicos.jucisrs.rs.gov.br;","Strict-Transport-Security":"max-age=31586000; includeSubDomains; preload","Transfer-Encoding":"chunked","Content-Type":"application/json","Content-Language":"pt-BR"}},"audit_data":{"handler":"proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost","stopwatch":{"p1":242,"p2":466,"p3":15,"p4":0,"p5":2,"sr":65,"sw":1,"l":0,"gc":0},"producer":["ModSecurity for Apache/2.9.5 (http://www.modsecurity.org/)","OWASP_CRS/3.3.2"],"server":"Apache","engine_mode":"ENABLED"}}
```
#### ⚙️ Log de Request/Acesso
Nos logs de access e request teremos os logs registrados de tudo que conectou no servidor Apache do cliente. Nesses logs conseguiremos saber a requisição que foi efetuada, o IP de Origem, data, hora, retorno e também um ID da conexão que identificamos por um parâmetro chamado ajaxprevent.
Cada requisição que chega no Apache terá um ajaxprevent único o que facilita o troubleshooting. Esse mesmo ajaxprevent pode ser visto e comparado através da console do navegador onde o sistema esta operando por exemplo!
Exemplo:
Após um simples acesso ao sistema, cada tela aberta gera uma nova conexão, e cada conexão possui um ajaxprevent junto dela. No exemplo, o meu acesso ao sistema gerou várias conexões, onde uma dela possui o ajaxprevent 1755717741107 conforme anexo abaixo:
![logs_apache_ajaxprevent.png](../img/logs_apache_ajaxprevent.png)
Com base nesse ajaxprevent, conseguimos filtrar nos logs do Apache do cliente e verificar quando essa conexão chegou e de fato foi estabelecidade com o servidor usando o comando cat:
```
comando cat:
ipm@00003-riodosul-app-01-0820:~$ sudo cat /var/log/apache2/riodosul.atende.net-ssl-access.log | grep 1755717741107
189.42.20.146 - - [20/Aug/2025:16:22:21 -0300] "POST /atende.php?rot=1&aca=1&ajax=t&processo=getListaToursPendenteUsuario&ajaxPrevent=1755717741107 HTTP/2.0" 200 6
ipm@00003-riodosul-app-01-0820:~$ sudo cat /var/log/apache2/riodosul.atende.net-ssl-request.log | grep 1755717741107
[20/Aug/2025:16:22:21 -0300] [Remote-Ip: 189.42.20.146] [Client-Ip: 189.42.20.146] [KeepAlive: 1] [TLS: TLSv1.3] [CIPHER: TLS_AES_256_GCM_SHA384] [Pid: 2594195] [R: -] [Request: "POST /atende.php?rot=1&aca=1&ajax=t&processo=getListaToursPendenteUsuario&ajaxPrevent=1755717741107 HTTP/2.0"] [Status: 200] [Bytes: 6] [Duration: 35588 µs]
ipm@00003-riodosul-app-01-0820:~$
```
Esse tipo de troubleshooting é essencial para verificações de falha na entrega de requisições, atrasos, timeout entre outros fatores dentro de um cenário problemático.
#### ⚙️ Log Syslog
O log do syslog gravam os logs do sistema operacional onde o PHP e Apache estão rodando. Neste log podemos identificar erros e também ações do sistema Operacional, como por exemplo o encerramento de algum processo no Apache/PHP por algum fator, por exemplo a falta de memória OutOfMemory no servidor.
Exemplo:
Neste caso, o cliente em questão estava com a memória baixa e em seguida era liberada:
![omm_killer_cliente.png](../img/omm_killer_cliente.png)
Através dos logs do syslog e horário acabamos encontrando uma ação do próprio Kernel de oom-kill evidenciando o encerramento do PID 219842.
```
#sudo cat /var/log/syslog | more
Aug 18 16:25:21 01071-gramado-app-01-0820 kernel: [418817.008973] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=containerd.service,mems_allowed=0,global_oom,task_memcg=/system.slice/php8.2-fpm.service,task=php-fpm8.2,pid=219
842,uid=33
Aug 18 16:25:21 01071-gramado-app-01-0820 kernel: [418817.008984] Out of memory: Killed process 219842 (php-fpm8.2) total-vm:3003000kB, anon-rss:703188kB, file-rss:6940kB, shmem-rss:640488kB, UID:33 pgtables:3440kB oom_score_adj:0
Aug 18 16:25:21 01071-gramado-app-01-0820 systemd[1]: php8.2-fpm.service: A process of this unit has been killed by the OOM killer.
```
Após a identificação da situação e o PID em questão, filtramos o mesmo nos logs do PHP (php8.2-fpm.log e php8.2-fpm-www-slow.log), afim de identificar mais detalhes da requisição, onde foi possível encontrar informações como rotina, ação, tempo..
```
# sudo cat /var/log/php8.2-fpm.log | grep "219842"
[18-Aug-2025 16:24:10] WARNING: [pool www] child 219842, script '/var/www/html/gramado.atende.net/atende.php' (request: "POST /atende.php?cidade=padrao&rot=20007&processo=getInfoLancamentoPontoModeloDois&PHPSESSID=6miv8gv4kht5k6mihggunqd8i0&id=WRP021102-673-HEZENUCBIYPQYT-2&aca=107") executing too slow (31.076116 sec), logging
[18-Aug-2025 16:24:10] NOTICE: child 219842 stopped for tracing
[18-Aug-2025 16:24:10] NOTICE: about to trace 219842
[18-Aug-2025 16:24:10] NOTICE: finished trace of 219842
[18-Aug-2025 16:25:21] WARNING: [pool www] child 219842 exited on signal 9 (SIGKILL) after 249218.334834 seconds from start
# sudo cat /var/log/php8.2-fpm-www-slow.log | more
[18-Aug-2025 16:24:10] [pool www] pid 219842
script_filename = /var/www/html/gramado.atende.net/atende.php
[0x00007f625bc135b0] criaTagsLancamentoPonto() /var/www/html/gramado.atende.net/include/wrp/view/wrp_class_view_report_lancamento_ponto_modelo_dois.inc:38
[0x00007f625bc134f0] createBody() /var/www/html/gramado.atende.net/estrutura/est_class_view_report.inc:38
[0x00007f625bc13490] render() /var/www/html/gramado.atende.net/include/wrp/controller/wrp_class_controller_manutencao_relatorio_lancamento_ponto.inc:142
[0x00007f625bc132d0] getInfoLancamentoPontoModeloDois() /var/www/html/gramado.atende.net/estrutura/est_funcao.inc:503
[0x00007f625bc13200] callMethod() /var/www/html/gramado.atende.net/estrutura/est_class_formulario.inc:1049
[0x00007f625bc13160] callControllerForm() /var/www/html/gramado.atende.net/estrutura/est_class_formulario.inc:1026
[0x00007f625bc130e0] callController() /var/www/html/gramado.atende.net/atende.php:47
```
#### ⚙️ Log Error
Nos logs de error.log será gravado os erros reportados pelo sistema, onde iniciando a analise através desse arquivo conseguimos chegar também nos detalhes da requisição/rotina que ocasionaram esse erro em questão.
Exemplo:
ipm@00003-riodosul-app-01-0820:~$ sudo cat /var/log/apache2/riodosul.atende.net-ssl-error.log | more
Se pegarmos um exemplo de requisição, temos o erro em questão e junto dele a informação do ID da request que gerou esse erro: [R:aKXMmG2RfxYn3hOC3rY2sAAAAL4]
```
[2025-08-20 10:24:40.982041] [R:aKXMmG2RfxYn3hOC3rY2sAAAAL4] [-:error] [client 54.204.203.58] ModSecurity: Multipart: Skipping invalid part 7f520408aa00 (part name missing): (offset 0, length 0) [hostname "riodosul.atende.net"] [uri "/at
ende.php"] [unique_id "aKXMmG2RfxYn3hOC3rY2sAAAAL4"]
```
Com essa informação conseguimos ir até o log de request e ter mais informações sobre a requisição/rotina que foi efetuada e que gerou o erro em questão:
```
ipm@00003-riodosul-app-01-0820:~$ sudo cat /var/log/apache2/riodosul.atende.net-ssl-request.log | grep "aKXMmG2RfxYn3hOC3rY2sAAAAL4"
[20/Aug/2025:10:24:40 -0300] [Remote-Ip: 54.204.203.58] [Client-Ip: 54.204.203.58] [KeepAlive: 0] [TLS: TLSv1.2] [CIPHER: ECDHE-RSA-AES256-GCM-SHA384] [Pid: 2594195] [R: aKXMmG2RfxYn3hOC3rY2sAAAAL4] [Request: "POST /atende.php?pg=rest&service=WNERestServiceNFSe&cidade=padrao HTTP/1.1"] [Status: 200] [Bytes: 668] [Duration: 540083 µs]
```
Informações mais detalhadas também podem ser encontradas no log do ModSec.
```
ipm@00003-riodosul-app-01-0820:~$ sudo cat /var/log/apache2/modsec_audit.log | grep "aKXMmG2RfxYn3hOC3rY2sAAAAL4"
{"transaction":{"time":"20/Aug/2025:10:24:41.519331 --0300","transaction_id":"aKXMmG2RfxYn3hOC3rY2sAAAAL4","remote_address":"54.204.203.58","remote_port":18993,"local_address":"192.168.22.68","local_port":443},"request":{"request_line":"POST /atende.php?pg=rest&service=WNERestServiceNFSe&cidade=padrao HTTP/1.1","headers":{"Content-Type":"multipart/form-data; boundary=---------------------------8dddfd3c59d022f","Host":"riodosul.atende.net","Authorization":"Basic NzU4MDY1NDcwMDAxODg6UmEzNTI1MjE3NCM=","Content-Length":"2274","Connection":"Keep-Alive"},"fake_body":""},"response":{"protocol":"HTTP/1.1","status":200,"headers":{"Pragma":"no-cache","Cache-Control":"no-cache, must-revalidate","Expires":"Mon, 26 Jul 1997 05:00:00 GMT","Data-Servidor":"1755696280000","Set-Cookie":"cidade=padrao; path=/; SameSite=lax","Set-Cookie":"PHPSESSID=7d8m70eski5nl6t9vcec1rfnem; path=/; secure; HttpOnly","X-Frame-Options":"sameorigin","Upgrade":"h2,h2c","Connection":"Upgrade, Keep-Alive","Vary":"Accept-Encoding","X-XSS-Protection":"1; mode=block","Content-Security-Policy":"object-src 'self' data: blob: https://*.atende.net https://*.ipm.com.br https://*.nfs-e.net https://seal.digicert.com; block-all-mixed-content; form-action 'self' *.nfs-e.net https://*.ipm.com.br https://*.atende.net https://*.acesso.gov.br https://*.jucesc.sc.gov.br; frame-ancestors 'self' https://*.nfs-e.net https://*.ipm.com.br https://*.atende.net https://portalservicos.jucisrs.rs.gov.br;","Strict-Transport-Security":"max-age=31586000; includeSubDomains; preload","Keep-Alive":"timeout=1, max=224","Transfer-Encoding":"chunked","Content-Type":"application/json","Content-Language":"pt-BR"}},"audit_data":{"messages":["Multipart: Skipping invalid part 7f520408aa00 (part name missing): (offset 0, length 0)","Multipart: Skipping invalid part 7f5204122cc8 (part name missing): (offset 0, length 0)"],"error_messages":["[file \"apache2_util.c\"] [line 271] [level 3] [client 54.204.203.58] ModSecurity: Multipart: Skipping invalid part 7f520408aa00 (part name missing): (offset 0, length 0) [hostname \"riodosul.atende.net\"] [uri \"/atende.php\"] [unique_id \"aKXMmG2RfxYn3hOC3rY2sAAAAL4\"]","[file \"apache2_util.c\"] [line 271] [level 3] [client 54.204.203.58] ModSecurity: Multipart: Skipping invalid part 7f5204122cc8 (part name missing): (offset 0, length 0) [hostname \"riodosul.atende.net\"] [uri \"/atende.php\"] [unique_id \"aKXMmG2RfxYn3hOC3rY2sAAAAL4\"]"],"handler":"proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost","stopwatch":{"p1":265,"p2":234,"p3":1,"p4":0,"p5":1,"sr":69,"sw":1,"l":0,"gc":0},"producer":["ModSecurity for Apache/2.9.5 (http://www.modsecurity.org/)","OWASP_CRS/3.3.2"],"server":"Apache","engine_mode":"ENABLED"},"uploads":{"info":[{"file_size":1815,"file_name":"G:\\\\ArquivosTemporarios\\\\Fiscal\\\\NFS-e\\\\Envio\\\\0001\\\\\\\\5308-env-lot.xml","content_type":"<Unknown Content-Type>"}],"total":1815}}
```
## 3 - Servidores Banco de Dados
## 4 - Servidores MSD
## 5 - Comandos Gerais - Linux
#### ⚙️ Consultar Consumo de Swap
Este comando lista os processos (PID) que estão consumuindo Swap e o volume deste consumo em KB.
```console
awk 'function pr(){if (s ~ /^[1-9]/) print p,n,s;n="";p="";s=""}BEGIN{FS="\t *";OFS="\t"}/^Name:/{pr();n=$2}/^VmSwap:/{s=$2}/^Pid:/{p=$2}END{pr()}' /proc/*/status | sort -t $'\t' -k3 -n -r | column -t -s $'\t'
```
Após resultado, para saber mais detalhes dos PID's listados, use:
```console
ps aux | grep PID
```
#### ⚙️ Comando para listar Consumo de Memoria e CPU Detalhado:
```console
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
dstat -tcpldmsn
```
Outras opções
```console
htop
atop
iotop
top
```
#### ⚙️ Comando para listar processos/status:
```console
netstat
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n
netstat -n | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
```
Filtrando conexões por porta 5432 (SGDB), 443/80 (APACHE), 11211(Memcache):
```console
netstat -nat | grep 11211 | wc -l | sort | uniq -c | sort -n
netstat -nat | grep 5432 | wc -l | sort | uniq -c | sort -n
netstat -nat | grep 443 | wc -l | sort | uniq -c | sort -n
netstat -nat | grep 80 | wc -l | sort | uniq -c | sort -n
```
Identificar/Listar conexões em modo Defunct (Zumbi) Linux:
```console
ps axo stat,ppid,pid,comm | grep -w defunct
```
#### ⚙️ Limpeza de Pasta com muitos Arquivos (rm -rf to long)
Comando usado para limpar pastas que possuem muitos arquivos, onde o rm -rf do Linux não consegui fazer a exclusão. O comando abaixo listará e excluirá arquivo por arquivo, fazendo com que o rm -rf não precise ler todos os arquivos de uma única fez, conseguindo assim realizar a exclusão.
<b><i> Obs. Esse comando deve ser executado exatamente na pasta/diretório onde estão os arquivos que devem ser excluido! </i></b>
```console
find . -type f -exec rm -v {} \;
```
#### ⚙️ Analisar/Listar tamanhos de diretórios ou arquivos:
Lista diretórios e tamanhos de cada arquivo/pasta:
```console
du -h pasta/
```
Lista apenas o tamanho total da pasta:
```console
du -sh pasta/
```
Lista diretórios montados:
```console
df -h
```
#### ⚙️ Comandos para contar numero de Arquivos ou Diretórios:
Filtrar por arquivos:
```console
find diretório -type f | wc -l
```
Filtrar por diretórios:
```console
find diretório -type d | wc -l
```
#### ⚙️ Comandos Permissões:
Comando para permissões no Linux com Chmod, são dividios em 7 níveis:
Obs.(use a expressão -R para recursividade)
0 = nenhuma permissão;
1 = apenas executar;
2 = apenas gravar;
3 = gravar e executar;
4 = apenas ler;
5 = ler e executar;
6 = ler e gravar; e
7 = ler, gravar e executar.
Exemplos de comandos:
```console
chmod 700 arquivo ou pasta
chmod 755 arquivo ou pasta
chmod 777 arquivo ou pasta
```
Comando para permissão em arquivos, usuário e grupos:
rwx: significa que o usuário tem permissão para leitura, edição e execução);
r-x: somente os usuários do grupo do arquivo podem ler ou executar;
r: qualquer usuário pode ler o arquivo, mas não pode editá-lo e nem executá-lo.
Exemplo de comandos:
```console
chown usuario.grupo pasta/
chown usuario.grupo arquivo/
```
#### ⚙️ Comandos de Compactação
Comandos de Compactação com ZIP
Compactar
```console
zip -9 -r nomedoarquivo.zip /pasta/arquivos
```
Extrair
```console
unzip nomedoarquivo.zip
```
Comandos de Compactação com TAR
Compactar
```console
tar cfv nomedoarquivo.tar arquivos
```
Compactar e Comprimir
```console
tar cfzv nomedoarquivo.tar arquivos
```
Extrair
```console
tar xvzf nomedoarquivo.tar.gz
```
Listar conteudo do arquivo compactado
```console
tar tf nomedoarquivo.tar
```
#### ⚙️ Comandos Analisar Logs (Filtros)
Comandos para filtrar arquivos de logs:
Comando cat com grep
```console
cat nomedoarquivo.log | grep "informação filtrada"
```
Comando grep filtrando e trazendo o nome do arquivo
Especificando o nome do arquivo
```console
grep "informação filtrada" | grep nomedoarquivo.logs
```
Filtrando por qualquer coisa que for .log
```console
grep "informação filtrada" | grep *.log
```