Назад | Перейти на главную страницу

nginx, отдельный журнал доступа роботов и журнал доступа человека

Я пытаюсь разделить журнал доступа робота и журнал доступа человека, поэтому я использую следующую конфигурацию:

    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;
    }
....
}

А в серверной части я использую:

    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;

Но похоже, что nginx будет записывать журналы роботов как в location_access.log, так и в spider_access.log.

Как можно разделить журналы для робота?

И еще один вопрос: некоторые журналы роботов не записываются в spider_access.log, а существуют в location_access.log. Похоже, моя карта не работает. Что-то не так, когда я определяю «карту»?

Рабочее решение без каких-либо других процессов:

На основе комментариев. Вы можете легко адаптировать его под несколько видов ботов (плохих / хороших) и поставить return 403; заявление в правой части. Идея следующая:

В части http:

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

Затем в серверной части:

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

Это работает, но не очень хорошо, если вы хотите использовать nginx в качестве обратного прокси и перенаправлять на несколько веб-серверов. (Не очень гибкий способ определения имен файлов журнала).

Лучше выглядит, но не работает

Я бы хотел использовать это решение:

http часть:

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";
}

А затем в каждой серверной части:

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
        }
  }

Но второй не работает. Даже если это правильный путь к нужному файлу с правильными правами на него, nginx записывает ошибку, говоря, что его прав недостаточно. Забавно то, что эта ошибка регистрируется в файле с теми же владельцами и правами, что и тот, в который он не может записывать. Понятия не имею, почему, или это ошибка? Может кто попробует исправить проблему?

Вы раздвигаете границы if условный Nginx, который был предназначен для минимального использования.

Рассмотрите возможность использования Rsyslog для следите за журналом доступа к Nginx. Rsyslog имеет надежные варианты для сопоставление содержимого строк журнала и в результате отправка их в разные журналы. Тогда у вас может быть три отдельных журнала, которые вы ищете.