nginx, log de acesso do robô separado e log de acesso humano

6

Estou tentando separar o log de acesso do robô e o log de acesso humano. Por isso, estou usando a configuração abaixo:

    http {
....
    map $http_user_agent $ifbot {
        default 0;
        "~*rogerbot"        3;
        "~*ChinasoSpider"       3;
        "~*Yahoo"           1;
        "~*Bot"         1;
        "~*Spider"          1;
        "~*archive"         1;
        "~*search"          1;
        "~*Yahoo"           1;
        "~Mediapartners-Google" 1;
        "~*bingbot"         1;
        "~*YandexBot"           1;
        "~*Feedly"  2;
        "~*Superfeedr"  2;
        "~*QuiteRSS"    2;
        "~*g2reader"    2;
        "~*Digg"    2;
        "~*trendiction"     3;
        "~*AhrefsBot"           3;
        "~*curl"            3;
        "~*Ruby"            3;
        "~*Player"          3;
        "~*Go\ http\ package"   3;
        "~*Lynx"            3;
        "~*Sleuth"          3;
        "~*Python"          3;
        "~*Wget"            3;
        "~*perl"            3;
        "~*httrack"         3;
        "~*JikeSpider"          3;
        "~*PHP"         3;
        "~*WebIndex"            3;
        "~*magpie-crawler"      3;
        "~*JUC"         3;
        "~*Scrapy"          3;
        "~*libfetch"            3;
        "~*WinHTTrack"      3;
        "~*htmlparser"      3;
        "~*urllib"          3;
        "~*Zeus"            3;
        "~*scan"            3;
        "~*Indy\ Library"       3;
        "~*libwww-perl"     3;
        "~*GetRight"            3;
        "~*GetWeb!"         3;
        "~*Go!Zilla"            3;
        "~*Go-Ahead-Got-It"     3;
        "~*Download\ Demon" 3;
        "~*TurnitinBot"     3;
        "~*WebscanSpider"       3;
        "~*WebBench"        3;
        "~*YisouSpider"     3;
        "~*check_http"      3;
        "~*webmeup-crawler"     3;
        "~*omgili"      3;
        "~*blah"        3;
        "~*fountainfo"      3;
        "~*MicroMessenger"      3;
        "~*QQDownload"      3;
        "~*shoulu.jike.com"     3;
        "~*omgilibot"       3;
        "~*pyspider"        3;
    }
....
}

E na parte do servidor, estou usando:

    if ($ifbot = "1") {
    set $spiderbot 1;
}
if ($ifbot = "2") {
    set $rssbot 1;
}
if ($ifbot = "3") {
    return 403;
    access_log /web/log/badbot.log  main;
}

access_log /web/log/location_access.log  main;
    access_log /web/log/spider_access.log main if=$spiderbot;
    access_log /web/log/rssbot_access.log main if=$rssbot;

Mas parece que o nginx irá gravar alguns logs do robô em location_access.log e spider_access.log.

Como posso separar os registros do robô?

E outras questões são que alguns logs do robô não são gravados no spider_access.log, mas existem no arquivo location_access.log. Parece que meu mapa não está funcionando. Há algo errado quando eu defino "mapa"?

    
por Meteor 27.04.2015 / 08:26

2 respostas

1

Solução de trabalho, sem nenhum outro processo envolvido:

Inspirado nos comentários. Você pode adaptá-lo facilmente a vários tipos de bots (ruins / bons) e colocar a declaração return 403; na parte direita. A ideia é a seguinte:

Na parte http:

map $http_user_agent $bot {
    default "";
    "~*Googlebot"   "yes";
    "~*MJ12bot"     "yes";
    # Add as many as desired
}
map $bot $no_bot {
    default "no";
    "yes"   "";
}

Em seguida, na parte do servidor:

access_log   /var/log/regular_access.log main if=$no_bot;
access_log   /var/log/bots_access.log main if=$bot;

Isso funciona, mas não é legal quando você quer usar nginx como proxy reverso e redirecionar para vários servidores web. (Não é muito flexível para definir os nomes dos arquivos de log).

Melhor aparência, mas não funciona

Gostaria de ter usado esta solução:

link

map $http_user_agent $bot_header {
    default "";
    "~*Googlebot"   "bots_";
    "~*MJ12bot"     "bots_";
    # Add as many as desired
}

map $server_name $log_filename {
    default          "unknown";
    "site1....."     "site1_***.log";
    "site2....."     "site2_***.log";
}

E depois, em cada parte do servidor:

server { # simple reverse-proxy...
        listen       37........:80;
        server_name  dev.****.net;
        access_log   /var/log/nginx/access/$bot_header$log_filename  main;

        # pass all requests
        location / {
                    # There, your config
        }
  }

Mas este segundo não funciona. Mesmo que seja o caminho certo para o arquivo correto, com os direitos corretos, nginx registra um erro dizendo que seus direitos não são suficientes. Parte engraçada é que esse erro é registrado em um arquivo com exatamente os mesmos proprietários e direitos daquele em que ele não pode escrever. Não sei por que, ou se é um bug? Talvez alguém possa tentar consertar o problema?

    
por 23.02.2016 / 20:27
0

Você está extrapolando os limites do if condicional Nginx, que foi planejado para o mínimo use .

Considere usar o Rsyslog para siga seu log de acesso Nginx . O Rsyslog tem opções robustas para combinar o conteúdo das sequências de log e enviá-las para diferentes logs como um resultado. Então você pode ter os três logs separados que você está procurando.

    
por 30.11.2015 / 19:45