Tìm hiểu cấu hình log trên nginx Webserver

Xem file log trên VPS/Server là bắt buộc nhất là khi cài đặt cấu hình một dịch vụ nào đó.

Với webserver bạn cần quan tâm đến 2 dạng log. Log truy cập (access log) ghi lại các thông tin người dùng truy cập vào website. Log lỗi (error log) ghi lại các cảnh báo các lỗi xảy ra với dịch vụ liên quan web server.

Log là công cụ giám sát hệ thống rất tốt (monitoring systems) không thể thiếu với sysadmin quản trị hệ thống. Bài này chúng ta sẽ đi vào tìm hiểu khái niệm cũng như cách cấu hình log trên linux web server, để xem nó hoạt động như thế nào.

Theo mặc định Nginx Server lưu file log này tại /var/log/nginx.

1. Tìm hiểu Access Log Nginx

Đầu tiên mình muốn nói đến log truy cập (Access Log) tương tự CustomLog trong Web Server Apache. Log này rất cần thiết đặc biệt khi website của bạn bị tấn công DDOS, nhờ nó bạn có thể xác định được nguồn tần công, tần xuất và quy mô để có action phù hợp như chặn theo User Agent hay IP nguồn.

Cấu hình log trên linux server

Nginx cung cấp cho bạn khả năng tùy biến access log để xuất ra file theo định dạng mà bạn muốn.

Để thay đổi định dạng access log bạn chỉ cần làm việc với directive log_format, chỉ thị này mặc định nằm trong block http {…}. Để xem được log format bạn vào /etc/nginx/nginx.conf áp dụng cho cả hệ điều hành CentOS và Ubuntu.

Mẫu log_format trong nginx:

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';

Chỉ thị log_format để định dạng access log cho nginx, ý nghĩa các biến như sau:

  • main tên gọi của log format, bạn có thể tạo nhiều định dạng log khác nhau rồi gán cho nó một cái tên bất kỳ cũng được.
  • $remote_addr địa chỉ IP truy cập web site của bạn.
  • $remote_user ghi lại tài khoản truy cập web nếu trang của bạn có xác thực người dùng, đa số là không dùng bạn có thể bỏ đi.
  • $time_local thời gian người dùng truy cập.
  • $request đoạn đầu của request.
  • $status trạng thái của response.
  • $body_bytes_sent kích thước body mà server response.
  • $http_referer URL được tham chiếu.
  • $http_user_agent thông tin trình duyệt, hệ điều hành mà người dùng truy cập.
  • $http_x_forwarded_for được ghi vào log nếu webserver detect người dùng truy cập qua proxy server.

Để hiểu rõ hơn mình cùng tìm hiểu một mẫu access log cụ thể.

118.69.244.106 - - [08/Jun/2016:08:08:10 +0700] "GET /wp-content/plugins/wp-tab-widget-pro/css/font-awesome.min.css HTTP/1.1" 200 7027 "https://www.thuysys.com/server-vps/backup-restore/huong-dan-backup-website-tren-linux-toan-tap.html" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36" "192.168.6.118"

##########Ý nghĩa###########
118.69.244.106 là IP của $remote_addr
- - là $remote_user, không có gì vì web site không xác thực gì cả.
[08/Jun/2016:08:08:10 +0700] là $time_local 
GET /wp-content/plugins/wp-tab-widget-pro/css/font-awesome.min.css HTTP/1.1 chính là $request
200 Đây là truy cập truy cập thành công webserver phản hồi lại code 200 OK
7027 kích thước body không bao gồm header mà server trả về cho người truy cập.
https://www.thuysys.com/server-vps/backup-restore/huong-dan-backup-website-tren-linux-toan-tap.html là đoạn $http_referer
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 thông tin $http_user_agent
192.168.6.118 IP của proxy server $http_x_forwarded_for được thêm vào access log

Với log format như trên mình thấy là đầy đủ thông tin cần thiết để theo dõi truy cập của một trang web, việc thêm bớt có chăng là bỏ cái $remote_user đi.

Để áp dụng log_format nào đó bạn thêm chỉ thị access_log vào block server {…}

server {
access_log /var/logs/nginx/access.log main;
...
}

Tài liệu tham khảo: Access Log

2. Tìm hiểu Error Log Nginx

Log này để ghi lại thông tin các lỗi cài đặt cấu hình hay đơn giản chỉ là những cảnh báo giữa Web Server Nginx và các dịch vụ của nó.

Để sử dụng error log bạn thêm chỉ thị error_log vào block http {…}.

server {
error_log /var/log/nginx/error.log error;
...
}

Cú pháp chung của error log:

error_log log_file log_level

Cái bạn cần quan tâm là log_level

  • emerg log ở level này mang tính khẩn cấp, dạng như server sắp sập đến nơi rồi.
  • alert cảnh báo các vấn cần cần được xử lý ngay.
  • crit các vấn đề quan trong nhưng không nhất thiết phải xử lý ngay lập tức, để theo dõi thêm.
  • error ghi lại thông tin lỗi như đăng nhập hoặc cấu hình sai, mức độ thấp hơn crit.
  • warn ở mức độ cảnh báo không phải lỗi.
  • notice để thông báo cái gì đó.
  • info ghi thông tin hệ thống, không có gì cả.
  • debug ghi lại tất cả mọi thứ, dùng để dò lỗi.

Trong tất cả mức độ ưu tiên (priority) debug có mức độ cao nhất, nó bao gồm tất cả các thông tin của các level khác.

Ở level debug, info, notice, warn thường ghi ra rất nhiều thông tin có thể không cần thiết. Theo mình các bạn nên để ở level emerg, alert, crit và error bởi vì nó ghi lại gần như tất cả các vấn đề bạn cần để vận hành nginx rồi.

Tài liệu tham khảo: Error Log

Tắt error log

Đôi khi hệ thống hoạt động ổn định, cảm thấy việc ghi log không cần thiết để giảm tiêu tốn tài nguyên bạn có thể Disable Error Log đi, bạn sửa lại chỉ thị error_log như sau:

error_log /dev/null error;

Chỉ thị trên có nghĩa toàn bộ log lỗi sẽ được đưa vào /dev/null.

/dev/null là gì ? Đây là một loại file rất đặc biệt trên linux bạn cần chú ý. /dev/null nó giống như kiểu hố đen vũ trụ nó nuốt tất cả mọi thứ và không trả lại bất kỳ cái gì.

Trong công tác bảo mật hạn chế tấn công DDOS nó đóng vai trò rất quan trọng. Những request vi phạm chính sách bảo mật sẽ đưa vào /dev/null hệ thống sẽ không ghi nhận lỗi gì. Mục đích giảm tải cho CPU, bởi kể cả việc ghi log ít nhiều cũng tiêu tôn tài nguyên. Khi dùng /dev/null, thậm chí dữ liệu ghi vào nhiều đến đâu đi chăng nữa dung lượng ổ cứng của bạn cũng không tăng lên chút nào.

3. Quản lý Logrotate trên nginx

Log Rotate hay còn gọi là “quay vòng log” nó có tác dụng chia log ra thành file nhỏ, rồi nén log theo từng ngày để dễ dàng quản lý giảm dung lượng đĩa cứng.

Với những webserver host nhiều website mỗi website lại có access log và error log khác nhau thì bạn phải cấu hình lại logrotate nếu không toàn bộ log sẽ được dồn vào một file duy nhất, rất khó khăn khi đọc log và quản lý.

Trên hệ điều hành CentOS hay Ubuntu bạn vào

/etc/logrotate.d/nginx

Nội dung file cấu hình logrotate

/var/logs/nginx/*.log
 {
 daily
 missingok
 rotate 7
 compress
 delaycompress
 notifempty
 create 640 nginx adm
 sharedscripts
 postrotate
 [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
 endscript
 }

Một vài thông số cấu hình logrotate cần chú ý .

/var/logs/nginx/*.log đường dẫn đến folder chứa log. Chỉ định những file log nào được rotate, ở đây dùng wildcard name có nghĩa tất cả file log có phần mở rộng .log sẽ được rotate. Cụ thể trong bài là access.logerror.log.

Trong trường hợp có tạo nhiều virtualhost file log sẽ có đường dẫn khác nhau ví dụ /var/logs/nginx/web1/*log /var/logs/nginx/web2/*log thì bạn ngăn cách chúng bằng khoảng trắng hoặc xuống dòng.

  • daily chu kỳ quay vòng log file theo ngày, bạn có thể để giá trị theo weekly/monthly/yearly.
  • missingok không xuất thông báo lỗi vì lý do mất file log hay bị di chuyển đi đâu đó.
  • rotate số file log giữ lại, file cũ hơn sẽ bị xóa đi ở trên mình giữa lại 7 file tương ứng 1 tuần. Muốn lưu nhiều hơn thì nên setup syslog server để lưu trữ và phân tích log.
  • compress chỉ định nén file log thành định dạng .gz.
  • nocompress không muốn nén.
  • delaycompress không nén file log sau khi rotate mà đợi đến lần rotate tiếp theo.
  • notifempty không rotate nếu file log rỗng.
  • create phân quyền cho file, như cấu hình trên file log tạo ra sẽ có quyền 640 thuộc sở hữu (owner) của user nginx và nhóm (group) adm vì có thể những dữ liệu này sẽ được dùng bởi chương trình khác.
  • nocreate không tạo file log mới.
  • sharedscripts có nghĩa sẽ chạy script trong postrotate một lần với tất cả các file .log. Nếu không dùng sharedscripts. Access.log nginx sẽ restart một lần, error.log sẽ restart lại lần nữa là 2 lần. Nginx là web server đặc biệt, mặc dùng khởi động lại nhưng website của bạn vẫn chạy ầm ầm. Tuy vậy  việc khởi đổi nhiều lần là không cần thiết. 
  • postrotate ... endscript đoạn này quy định sẽ khởi động nginx sau khi rotate với script [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`

Trên đây là kiến thức cơ bản về Access Log, Error Log và cách Rotate Log trên linux để vận dụng vào hệ thống của mình giúp bạn quản trị server hiệu quả hơn, log là nguồn cơn của mọi vấn đề trong linux bạn cần coi trọng nó đúng mức.

Tuy mỗi dịch vụ trên linux là khác nhau nhưng ý nghĩa các thông số cấu hình log là như nhau, bạn có thể áp dụng nội dung bài trên cả CentOS/Fedora/Ubuntu/Debain chạy các services Mail Server, SSH Server, FTP Server …

Series bài viết nên xem:

Cảm ởn các bạn đã theo dõi !

Leave a Reply