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

Как заблокировать операторы журнала доступа Nginx от определенных пользовательских агентов

Я хочу отключить запись в файл журнала доступа Nginx для определенных запросов от пользовательских агентов http.

В основном из проверки работоспособности Amazon ELB и нашего внешнего (Pingdom) мониторинга. Так как они приходят каждые несколько секунд, тестирование затрудняет сортировку журналов.

"GET / HTTP/1.1" 200 727 "-" "ELB-HealthChecker/1.0"
"GET /login HTTP/1.1" 200 7492 "-" "Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)"

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

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|svg)$ {
        access_log        off;
        expires           30d;
}

Заранее спасибо!


Я попробовал рекомендацию @Gnarfoz, но у меня были некоторые интересные побочные эффекты. Хотя эти две «проверки работоспособности» не регистрировались, Pingdom начал распознавать сервер как ВЫКЛЮЧЕННЫЙ, даже когда он был запущен и работал. Это интересно, так как Load Balancer этого не сделал, и если бы он был, он бы отбросил узел, который мы тестировали.

Я помещаю раздел MAP в блок HTML под моими журналами:

access_log /www/access.log;
error_log /www/error.log;

map $http_user_agent $ignore_ua {
            default                 0;
            "~Pingdom.*"            1;
            "ELB-HealthChecker/1.0" 1;
    }

И я помещаю оператор IF в свой серверный блок с расположением по умолчанию:

location / {
                try_files $uri $uri/ /index.php?$args;

                if ($ignore_ua) {
                       access_log off;
                }
        }

Когда я это сделал, Pingdom начал генерировать 404 ошибки в файле журнала ошибок:

2012/08/03 17:10:33 [error] 6250#0: *164 open() "/www/public_html/login" failed (2: No such file or directory), client: 10.xx.xx.xx, server: xxx.com, request: "GET /login HTTP/1.1", host: "xxx.com"
2012/08/03 17:11:32 [error] 6250#0: *240 open() "/www/public_html/login" failed (2: No such file or directory), client: 10.xx.xx.xx, server: xxx.com, request: "GET /login HTTP/1.1", host: "xxx.com"

Попробуй это:

# map goes *outside* of the "server" block
map $http_user_agent $ignore_ua {
    default                 0;
    "~Pingdom.*"            1;
    "ELB-HealthChecker/1.0" 1;
}

server {
    # Things omitted for brevity

    location / {
        if ($ignore_ua) {
            access_log off;
            return 200;
        }
    }
}    

Часть if, вероятно, потребуется интегрировать в соответствующий блок местоположения.

Соответствующая документация nginx: карта, если, access_log