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

19 KiB

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
2 - Servidores Apache PHP
3 - Servidores Banco de Dados
4 - Servidores MSD
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

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

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.

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:

ps aux | grep PID

⚙️ Comando para listar Consumo de Memoria e CPU Detalhado:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
dstat -tcpldmsn

Outras opções

htop
atop
iotop
top

⚙️ Comando para listar processos/status:

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):

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:

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.

Obs. Esse comando deve ser executado exatamente na pasta/diretório onde estão os arquivos que devem ser excluido!

find . -type f -exec rm -v {} \;

⚙️ Analisar/Listar tamanhos de diretórios ou arquivos:

Lista diretórios e tamanhos de cada arquivo/pasta:

du -h pasta/

Lista apenas o tamanho total da pasta:

du -sh pasta/

Lista diretórios montados:

df -h

⚙️ Comandos para contar numero de Arquivos ou Diretórios:

Filtrar por arquivos:

find diretório -type f | wc -l

Filtrar por diretórios:

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:

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:

chown usuario.grupo pasta/
chown usuario.grupo arquivo/

⚙️ Comandos de Compactação

Comandos de Compactação com ZIP

Compactar

zip -9 -r nomedoarquivo.zip /pasta/arquivos

Extrair

unzip nomedoarquivo.zip

Comandos de Compactação com TAR

Compactar

tar cfv nomedoarquivo.tar arquivos

Compactar e Comprimir

tar cfzv nomedoarquivo.tar arquivos

Extrair

tar xvzf nomedoarquivo.tar.gz

Listar conteudo do arquivo compactado

tar tf nomedoarquivo.tar

⚙️ Comandos Analisar Logs (Filtros)

Comandos para filtrar arquivos de logs:

Comando cat com grep

cat nomedoarquivo.log | grep "informação filtrada"

Comando grep filtrando e trazendo o nome do arquivo

Especificando o nome do arquivo

grep "informação filtrada" | grep nomedoarquivo.logs

Filtrando por qualquer coisa que for .log

grep "informação filtrada" | grep *.log