Thông thường, mỗi truy cập vào nginx đều được lưu vào file log, ví dụ /var/log/nginx/access.log. Tại đây, ta có thể coi các thông tin về truy cập như thời gian, đường dẫn, trình duyệt của người dùng.
Nhưng nếu ta cần có thống kê chi tiết hơn về các truy cập này, như số lượt truy cập trong ngày, phân loại người dùng … thì file log này là chưa đủ. Cho nên, ta có thể đẩy những log này lên elastic search rồi từ đó dùng các công cụ thích hợp để phân tích.
Dưới đây là các bước mình đẩy log của nginx lên elastic search sử dụng logstash.
Cài đặt elastic search và logstash
Môi trường mình sử dụng ở đây là ubuntu, coi như nginx đã được cài đặt rồi.
- Cài đặt elastic search theo hướng dẫn sau: https://www.elastic.co/guide/en/elasticsearch/reference/5.0/deb.html
- Cài đặt logstash theo hướng dẫn sau: https://www.elastic.co/guide/en/logstash/current/installing-logstash.html#package-repositories
Chú ý: Phiên bản elastic search hiện tại yêu cầu java 1.8
Start elastic search và logstash
Từ terminal để khởi động hai dịch vụ trên ta chạy:
1 | sudo service elasticsearch start |
Bản log của nginx
Dưói đây là một mẫu log của nginx
1 | 192.168.1.100 - - [01/Dec/2016:10:38:17 +0700] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" |
Tạo 1 pattern cho logstash để phân tích mẫu log của nginx
Trong thư mục /usr/share/logstash/ tạo thư mục patterns, sau đó tạo file nginx (Chú ý là file, chứ không phải thư mục) trong thư mục patterns
1 | sudo nano /usr/share/logstash/patterns/nginx |
Nội dung file nginx như sau:
1 | NGINX_ACCESS %{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:time}\] "%{WORD:request_action} %{DATA:request} HTTP/%{NUMBER:http_version}" %{NUMBER:response} %{NUMBER:bytes} "%{DATA:referrer}" "%{DATA:agent}" |
Cấu hình logstash để đẩy log từ nginx lên elastic search
Tạo file nginx.conf trong thư mục /etc/logstash/conf.d/
1 | sudo nano /etc/logstash/conf.d/nginx.conf |
Nội dung file nginx.conf như sau:
1 | input { |
Config lại quyền của file log để logstash có thể đọc được
1 | chmod 644 /var/log/nginx/*.log |
Kết quả
Bây giờ bạn thử truy cập vào trang web được phục vụ bởi server nginx của bạn, cứ mỗi lần bạn truy cập vào thì log của nginx sẽ được logstash đẩy lên elastic search.
Đây là kết quả khi mình search từ elastic search tại đường dẫn http://192.168.1.244:9200/nginx_log_test/_search?&scroll=1m&size=1000&pretty=true
1 | { |
Bạn thấy đấy, log của nginx đã được phân tách và lưu đầy đủ trên elastic search. Thật tuyệt vời phải không?