Log của Nginx đóng vai trò quan trọng trong việc giám sát hiệu suất máy chủ, chẩn đoán sự cố và tăng cường bảo mật ứng dụng web. Việc cấu hình đúng log Nginx cho phép bạn thu thập thông tin chi tiết về hoạt động của máy chủ, hỗ trợ khắc phục sự cố và tối ưu hóa hệ thống. Hướng dẫn này sẽ đưa bạn qua từng bước cài đặt và cấu hình log Nginx.
Tại Sao Log Nginx Quan Trọng?
Log của Nginx rất quan trọng trong việc quản lý máy chủ, cung cấp thông tin chi tiết về hành vi của máy chủ, bao gồm các yêu cầu từ phía client, tương tác và các lỗi xảy ra. Một số lợi ích chính của việc cấu hình log Nginx tốt bao gồm:
- Chẩn đoán sự cố nhanh chóng : Xác định lỗi và các nút thắt cổ chai về hiệu suất.
- Giám sát lưu lượng : Hiểu hành vi người dùng và lưu lượng truy cập.
- Đảm bảo bảo mật : Phát hiện và ứng phó với các hoạt động đáng ngờ.
Các Loại Log Trong Nginx
1. Access Logs (Log Truy Cập)
Access logs ghi lại tất cả các yêu cầu từ client gửi đến máy chủ, bao gồm địa chỉ IP, phương thức yêu cầu, trạng thái phản hồi, kích thước bytes, các URL được yêu cầu,..
2. Error Logs (Log Lỗi)
Error logs ghi nhận các lỗi máy chủ và các vấn đề xảy ra trong quá trình xử lý yêu cầu ví dụ cấu hình error, script error, connection failures. Đây là nguồn thông tin quan trọng để debug và hiểu nguyên nhân của các lỗi.
3. Slow logs (Optional)
Ghi lại các yêu cầu mất nhiều thời gian hơn một ngưỡng nhất định, giúp xác định các điểm nghẽn hiệu suất.
Hướng Dẫn Cấu Hình Log Nginx Từng Bước
1. Xác Định Đường Dẫn File Log Mặc Định
Cấu hình Log trong Nginx mặc định được đặt trong file /etc/nginx/nginx.conf
. Cấu hình này sẽ áp dụng cho toàn bộ.
Các log của Nginx thường được lưu tại:
- Log truy cập:
/var/log/nginx/access.log
- Log lỗi:
/var/log/nginx/error.log
2. Cấu Hình Log Trong File Cấu Hình Nginx
Để tùy chỉnh cấu hình log, chỉnh sửa file cấu hình Nginx. Mở file bằng trình chỉnh sửa yêu thích:
sudo vi /etc/nginx/nginx.conf
user nginx;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log notice;
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
}
3. Cấu Hình Access Log
Để tùy chỉnh log, sử dụng các directive error_log
và access_log
vào các khối http
, server
, hoặc location
trong tệp cấu hình Nginx Virtual hosting của bạn
http {
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
}
server {
listen 80;
server_name site1.example.com;
access_log /var/logs/nginx/site1.example.com.access.log;
error_log /var/logs/nginx/site1.example.com.error.log;
}
4. Kiểm Tra và Reload Nginx
Sau khi chỉnh sửa, kiểm tra cấu hình để phát hiện lỗi:
sudo nginx -t
Nếu không có lỗi, reload Nginx:
sudo systemctl reload nginx
Giám Sát Log
Để kiểm tra log, Sử dụng các công cụ như tail
hoặc multitail
:
Giám Sát Log Error Log
sudo tail -f /var/log/nginx/error.log
2024/12/20 09:48:06 [notice] 26796#26796: start worker processes
2024/12/20 09:48:06 [notice] 26796#26796: start worker process 26797
2024/12/20 09:48:10 [error] 26797#26797: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 118.70.241.180, server: _, request: "GET /favicon.ico HTTP/1.1", host: "18.181.218.48", referrer: "http://18.181.218.48/"
Giám Sát Log Access Log
sudo tail -f /var/log/nginx/access.log
Log Format Trong Nginx
Log format xác định cấu trúc của các dòng log, cho phép bạn thu thập dữ liệu cụ thể về yêu cầu và phản hồi của máy chủ.
Mặc định, Nginx sư dụng log format đơn giản để ghi lại các thông tin cơ bản trong tệp access.log
.
Bạn có thể tuỳ chỉnh log format để bao gồm các thông tin chi tiết chi cần.
Log Format Mặc Định
Log format mặc định của Nginx là combined
, bao gồm các chi tiết cơ bản về yêu cầu và phản hồi:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Giải Thích Các Thành Phần:
$remote_addr
: Địa chỉ IP của client.$remote_user
: Tên user đã xác thực (nếu có).$time_local
: Thời gian và ngày giờ của yêu cầu theo local.$request
: Dòng yêu cầu HTTP đầy đủ. bao gồm method, path- Ví dụ:
"GET /index.php HTTP/1.1"
- Ví dụ:
$status
: Mã trạng thái HTTP (e.g.,200
,404
).$body_bytes_sent
: Kích thước của body phản hồi tính bằng byte.$http_referer
: URL của trang web dẫn đến yêu cầu.$http_user_agent
: Chuỗi user agent (trình duyệt, bot, v.v.) của client.
Log Format Mặc Định Sample
146.70.46.34 - - [20/Dec/2024:10:18:42 +0000] "GET /index.php HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" "-"
Tùy Chỉnh Log Format
Bạn có thể định nghĩa các log format tùy chỉnh để thu thập thêm dữ liệu hoặc đơn giản hóa các dòng log. Sử dụng directive log_format
để tạo format và gán tên cho nó.
Ví Dụ 1: Log Format Tối Giản
Format nhẹ nhàng để giám sát hiệu suất:
log_format minimal '$remote_addr - $status [$time_local] "$request"';
access_log /var/log/nginx/access_minimal.log minimal;
Ví Dụ 2: Log Format Chi Tiết
Thu thập dữ liệu đầy đủ để phân tích chi tiết:
log_format detailed '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'$request_time $upstream_response_time';
access_log /var/log/nginx/access_detailed.log detailed;
- $http_x_forwarded_for: Trong Nginx, biến $http_x_forwarded_for có thể được sử dụng để truy cập giá trị của header X-Forwarded-For. Thông thường, nó được dùng để:
- Ghi log địa chỉ IP thật của client trong file log truy cập (access.log).
- Kiểm tra và chặn các IP cụ thể khi yêu cầu đi qua proxy.
- Dùng khi thông qua Proxy hoặc Load balancer
- $request_time: tổng thời gian theo đơn vị giây(s) mà Nginx sử dụng để xử lý một yêu cầu HTTP, tính từ lúc nhận được yêu cầu từ client cho đến khi phản hồi được gửi xong
- Bao gồm: Thời gian nhận dữ liệu yêu cầu từ client, Thời gian xử lý yêu cầu trong Nginx (bao gồm truy vấn upstream nếu có), Thời gian gửi phản hồi đến client
- Nếu
$request_time = 0.5
, điều này có nghĩa là Nginx mất tổng cộng 0.5 giây để hoàn tất yêu cầu từ client.
- $upstream_response_time: Đây là thời gian theo đơn vị giây(s) mà Nginx chờ đợi và nhận phản hồi từ upstream server (như PHP-FPM, một API server hoặc một máy chủ back-end khác).
- Bao gồm: Thời gian bắt đầu kết nối với upstream, Thời gian để upstream xử lý và gửi dữ liệu phản hồi đầu tiên.
Kết Luận
Như vậy, bạn đã nắm được cách hoạt động và cấu hình log trong Nginx.