web-dev-qa-db-ja.com

特定のユーザーエージェントからの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からの推奨を試しましたが、いくつかの興味深い副作用がありました。これらの2つの「ヘルスチェック」はログに記録されませんでしたが、Pingdomは、サーバーが稼働している間でも、サーバーをDOWNとして認識し始めました。ロードバランサーがそうでなかったので、それは興味深いです。

ログの下のHTMLブロックにMAPセクションを配置しました。

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"
7
briannyc

これを試して:

# 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ドキュメント: mapifaccess_log

5
Gnarfoz