quarta-feira, 4 de maio de 2016

Armazenando Logs do Nginx separados Host

Introdução

No artigo anterior demonstrei como instalar um servidor de logs centralizado com syslog-ng, mas em ambientes onde temos muitos sites hospedados fica complicado configurar o envio de cada um deles para o servidor de logs, e, claro tem sempre o fator humano, podemos criar uma nova entrada para o site (host) e esquecer de criar a entrada para envio do log.

A solução para isso é apontar todos os sites de um mesmo servidor, para o mesmo arquivo de log, mas depois, como diferenciar no arquivo de log, qual entrada pertence a qual site? O objetivo desse post é resolver esse problema.

Configuração dos Logs do Nginx

Precisamos alterar o padrão de logs do nginx para que além das informações padrões, ele acrescente o nome do host no log, para isso temos a opção “$host”.

Obs. Não existe o conceito de vhost no nginx, cada entrada é tratada como um site, mas eles vão apontar para o mesmo servidor de destino e no apache eles serão vhosts.

Edite o arquivo principal no nginx, e acrescente a opção desejada.
# vi /etc/nginx/nginx.conf
http {
#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                      '$status $body_bytes_sent "$http_referer" '
#                      '"$http_user_agent" "$http_x_forwarded_for"';

     log_format  main  '$remote_addr $host $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

Em cada um dos hosts vamos apontar os logs para os mesmos arquivos
# vi /etc/nginx/conf.d/default.conf
## Start www.site01.andredeo.blogspot.com ##
server {
    listen       IP_NGINX:80;
    server_name  www.site01.andredeo.blogspot.com;

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    ## send request back to Backend ##
    location / {
     proxy_pass  http://backend.andredeo.blogspot.com;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
## End www.site01.andredeo.blogspot.com ##

## Start www.site02.andredeo.blogspot.com ##
server {
    listen       IP_NGINX:80;
    server_name  www.site02.andredeo.blogspot.com;

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    ## send request back to Backend ##
    location / {
     proxy_pass  http://backend.andredeo.blogspot.com;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
## End www.site02.andredeo.blogspot.com ##

## Start www.site03.andredeo.blogspot.com ##
server {
    listen       IP_NGINX:80;
    server_name  www.site03.andredeo.blogspot.com;

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    ## send request back to Backend ##
    location / {
     proxy_pass  http://backend.andredeo.blogspot.com;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
## End www.site03.andredeo.blogspot.com ##

Reiniciar o nginx
# service nginx restart


Exemplo de log gerado

187.11.126.243 www.site01.andredeo.blogspot.com - [02/May/2016:11:45:37 -0300] "GET /posts/2016/05/servidor-syslog-ng-gerenciamento.html HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" "-"
191.34.134.142 www.site02.andredeo.blogspot.com - [02/May/2016:11:45:37 -0300] "GET /posts/ HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" "-"

66.249.64.152 www.site01.andredeo.blogspot.com - [02/May/2016:11:02:43 -0300] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-"

143.106.113.15 www.site01.andredeo.blogspot.com - [02/May/2016:11:08:32 -0300] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)" "-"

Instalação do Syslog-ng no servidor do nginx

Vamos realizar a instalação do syslog-ng no servidor, para que ele colete os logs e encaminhe para o nosso servidor central de logs.

A instalação é bastante simples e não demanda nenhum pré-requisito
# yum -y install syslog-ng

Iniciar e configurar para inicio automático o Syslog-ng
# systemctl start syslog-ng
# systemctl enable syslog-ng

Manteremos uma cópia do arquivo original, até por questões de consulta de parâmetros.
# cd /etc/syslog-ng
# cp syslog-ng.conf syslog-ng.conf.orig

Não é preciso alterar nada no arquivo original, apenas adicione ao final do arquivo a opção de encaminhamento dos logs do nginx para o servidor de Syslog-ng.
# vi /etc/syslog-ng/syslog-ng.conf
source s_nginx {
file("/var/log/nginx/access.log");
file("/var/log/nginx/error.log");
};
destination d_servidor_log { udp("IP_SYSLOG-NG_CENTRAL" port(514)); };
log { source(s_nginx); destination(d_servidor_log); };

Reiniciar o serviço
# systemctl restart syslog-ng


Referencias

ITSA Consulting, LLC

Nenhum comentário: