Я пытаюсь разделить журнал доступа робота и журнал доступа человека, поэтому я использую следующую конфигурацию:
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 имеет надежные варианты для сопоставление содержимого строк журнала и в результате отправка их в разные журналы. Тогда у вас может быть три отдельных журнала, которые вы ищете.