[Nginx] Hướng dẫn cấu hình Nginx không ghi log một số dạng request cụ thể

Có bao giờ bạn muốn loại bỏ quá trình ghi log của Nginx với 1 số loại request có thông tin nhận dạng cụ thể chưa ? Nếu có hãy đọc qua bài viết này nhé.

Khi vận hành các hệ thống dịch vụ bất kì, hay như web server thì nhu cầu về lưu trữ log để theo dõi tình hình và chuẩn đoán vấn đề là vô cùng quan trọng. Nhưng sẽ có những tình huống nhu cầu phát sinh việc không cần lưu trữ log đối với 1 số đối tượng muốn loại bỏ.

Trong bài viết này mình sẽ đề cập đến việc loại bỏ chức năng ghi log đối với 1 số đối tượng request cụ thể mà mình thấy không cần thiết phải ghi log lại trên dịch vụ Web Server Nginx, còn những request khác vẫn được ghi log bình thường. Bài viết này không bàn về nội dung cấu hình chi tiết log của dịch vụ Nginx.

Trong cấu trúc cấu hình access_log của Nginx có dạng như sau :

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

 
Ta sẽ sử dụng phần cấu hình điều kiện “if“, để sử dụng cho các trường hợp mà ta mong muốn. Nếu phần cấu hình “if” được bật lên, thì các request không được ghi log khi giá trị điều kiện “if” là bằng 0 hoặc chuỗi kí tự rỗng, nên các bạn sẽ thấy ở phần cấu hình dưới mình sẽ sử dụng “map” để bật “0” đối với những giá trị mình muốn không ghi log.

Các bạn có thể tuỳ biến nội dung cấu hình access_log với các request tới Nginx, ở đây mình sẽ liệt kê vài trường hợp thường sử dụng nhằm không ghi log với các request ta mong muốn.
 

1. Không ghi log đối với request truy cập tài nguyên tĩnh

– Trong cấu hình Nginx có hỗ trợ chúng ta tắt ghi log truy cập hoặc log không tìm thấy (not found) đối với từng block location.
– Ví dụ cấu hình dưới đây sẽ chỉ định rõ phần block location khớp với các request truy xuất tài nguyên tĩnh và tắt ghi log với những request khớp location này.

Cấu hình ví dụ 1:

location ~* \.(png|jpg|jpeg|gif|ico|woff|otf|ttf|eot|svg|txt|pdf|docx?|xlsx?)$ {
      access_log off;
      log_not_found off;
      expires max;
      add_header Pragma public;
      add_header Cache-Control "public";
      add_header Vary "Accept-Encoding";
}

 

2. Không ghi log đối với request có thông tin User-Agent cụ thể

– Nếu bạn cảm thấy việc phải ghi log đối với các request bắt nguồn từ bots/crawler hoặc bạn có các hệ thống kiểm tra độ uptime của website thường xuyển gửi request check là việc không cần thiết. Thì ta sẽ cấu hình sử dụng cấu hình “map” của Nginx.
– Ở đây mình sẽ không diễn giải cách thức sử dụng của “map” trong Nginx, đơn giản chỉ là kiểm tra thông tin mình cấu hình khớp thì bật sang flag cờ báo khớp, như từ 1 sang 0 trong tình huống này.

Cấu hình ví dụ 2:

map $http_user_agent $log_ua {
      default 1;

      ~*pingdom 0;
      ~*googlebot 0;
      ~*baiduspider 0;
      ~*uptime 0;
}

server {

      [..]

      access_log /var/log/nginx/access.log main if=$log_ua;

}

Lưu ý :
– Phần cấu hình “map” phải cấu hình ngoài cấu hình server block.
– Phải chỉ định rõ format name là gì ? Cái này tuỳ thuộc vào cấu hình format name của hệ thống bạn, mặc định là “combined“.
 

3. Không ghi log đối với request có nguồn IP cụ thể

– Nếu bạn thường sử dụng cronjob để chạy curl/wget trên hệ thống localhost hoặc 1 server ip nội bộ để thực hiện 1 số thao tác tương tác với website trong các khoảng thời gian cố định, hoặc tuần tự kiểm tra tình trạng hệ thống bằng cách gửi request đến website. Bạn không muốn ghi log các request đến từ các IP này ?! Ok, đơn giản thôi, cấu hình mẫu phía dưới nè.

Cấu hình ví dụ 3 :

map $remote_addr $log_ip {
      default 1;

      "127.0.0.1" 0;
      "192.168.1.0" 0;
      "192.168.1.3" 0;
}

server {

      [...]

      access_log /var/log/nginx/access.log main if=$log_ip;

}

 

4. Kết hợp các điều kiện kiểm tra

– Nếu bạn muốn kiểm tra điều kiện phải khớp request có user agent mình mong muốn chỉ được đến từ các địa chỉ IP nhất định mà mình quy định, thì đơn giản bạn có thể áp dụng nội dung cấu hình nhiều điều kiện kiểm tra “if” trong Nginx ở bài viết này : Mẹo cấu hình “if” đồng thời nhiều điều kiện kiểm tra trong Nginx

Cấu hình ví dụ 4 :

map $http_user_agent $log_ua {
      default 1;

      ~*pingdom 0;
      ~*googlebot 0;
      ~*baiduspider 0;
      ~*uptime 0;
}

map $remote_addr $log_ip {
      default 1;

      "127.0.0.1" 0;
      "192.168.1.0" 0;
      "192.168.1.3" 0;
}

server {

      [...]

      set $logging 1;
      set $logcheck '';

      if ( $log_ua = 0 ) {
            set $logcheck "${logcheck}A";
      }
      if ( $log_ip = 0 ) {
            set $logcheck "${logcheck}B";
      }
      if ( $logcheck = "AB" ) {
            set $logging 0;
      }

      access_log /var/log/nginx/access.log main if=$logging;

}

 

Nội dung phần này chỉ có nhiêu đó thôi, chúc bạn thành công.

Previous article[cPanel] Hướng dẫn khoá và mở tài khoản user cPanel bằng command-line
Next article[cPanel] Hướng dẫn tạo tài khoản email account cPanel bằng command-line
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !