Nginx
如何阻止來自特定使用者代理的 Nginx 訪問日誌語句
我希望關閉來自 http 使用者代理的特定請求的登錄 Nginx 訪問日誌文件。
基本上來自 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 開始將伺服器辨識為 DOWN,即使它已啟動並執行。這很有趣,因為負載均衡器沒有,如果有的話,它會刪除我們正在測試的節點。
我將 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 文件: map , if , access_log
感謝**@gnarfoz**
關於if is Evil,這是在 log 之前使用條件的更好方法
map $http_user_agent $ignore_ua { default 1; "~Pingdom.*" 0; } server { location / { access_log /var/log/nginx/access.log if=$ignore_ua; } }
啟用條件日誌記錄的 NGINX 文件