Xây dựng cho sản xuất: Ứng dụng web - Ghi log tập trung
Cuối cùng, ta đã sẵn sàng cài đặt ghi log tập trung cho cài đặt ứng dụng production của bạn . Ghi log tập trung là một cách tốt để thu thập và trực quan hóa log của các server của bạn. Nói chung, việc cài đặt một hệ thống ghi log phức tạp không quan trọng bằng việc cài đặt các bản backup và giám sát vững chắc, nhưng nó có thể rất hữu ích khi cố gắng xác định xu hướng hoặc vấn đề với ứng dụng của bạn.Trong hướng dẫn này, ta sẽ cài đặt ngăn xếp ELK (Elasticsearch, Logstash và Kibana) và cấu hình các server bao gồm ứng dụng của ta để gửi các log liên quan của chúng đến server ghi log . Ta cũng sẽ cài đặt các bộ lọc Logstash sẽ phân tích cú pháp và cấu trúc log của ta , cho phép ta dễ dàng tìm kiếm và lọc chúng cũng như sử dụng chúng trong hình ảnh hóa Kibana.
Yêu cầu
Nếu bạn muốn truy cập trang tổng quan ghi log của bạn qua domain , hãy tạo Bản ghi A trong domain của bạn, như “logging.example.com”, trỏ đến địa chỉ IP công khai của server ghi log của bạn. Ngoài ra, bạn có thể truy cập trang tổng quan giám sát qua địa chỉ IP công cộng. Bạn nên cài đặt web server ghi log để sử dụng HTTPS và hạn chế quyền truy cập vào nó bằng cách đặt nó sau VPN.
Cài đặt ELK trên Server ghi log
Cài đặt ELK trên server ghi log của bạn theo hướng dẫn này: Cách cài đặt Elasticsearch, Logstash và Kibana 4 trên Ubuntu 14.04 .
Nếu bạn đang sử dụng DNS riêng để phân giải tên, hãy đảm bảo làm theo Tùy chọn 2 trong phần Tạo certificate SSL .
Dừng lại khi bạn đến phần Cài đặt Logstash Forwarder .
Cài đặt Logstash Forwarder cho khách hàng
Cài đặt Logstash Forwarder, người gửi log , trên server khách hàng của bạn, tức là db1, app1, app2 và lb1, theo phần Cài đặt Logstash Forwarder , của hướng dẫn ELK.
Khi hoàn tất, bạn có thể đăng nhập vào Kibana thông qua địa chỉ mạng công cộng của server ghi log và xem nhật ký hệ thống của từng server của bạn.
Xác định log để thu thập
Tùy thuộc vào ứng dụng và cài đặt chính xác của bạn, các bản ghi khác nhau sẽ có sẵn để được thu thập vào ngăn xếp ELK của bạn. Trong trường hợp của ta , ta sẽ thu thập các bản ghi sau:
- Nhật ký truy vấn chậm MySQL (db1)
- Nhật ký lỗi và truy cập Apache (app1 và app2)
- Nhật ký HAProxy (lb1)
Ta chọn những log này vì chúng có thể cung cấp một số thông tin hữu ích khi khắc phục sự cố hoặc cố gắng xác định xu hướng. Server của bạn có thể có các log khác mà bạn muốn thu thập, nhưng điều này sẽ giúp bạn bắt đầu.
Cài đặt log MySQL
Nhật ký truy vấn chậm của MySQL thường được đặt tại /var/log/mysql/mysql-slow
. Nó bao gồm các log chạy đủ lâu để được coi là "truy vấn chậm", vì vậy việc xác định các truy vấn này có thể giúp bạn tối ưu hóa hoặc khắc phục sự cố ứng dụng của bạn .
Bật log truy vấn chậm MySQL
Nhật ký truy vấn chậm không được bật theo mặc định, vì vậy hãy cấu hình MySQL để ghi các loại truy vấn này.
Mở file cấu hình MySQL của bạn:
- sudo vi /etc/mysql/my.cnf
Tìm dòng "ghi lại các truy vấn chậm " đã comment và bỏ ghi chú để nó trông giống như sau:
log_slow_queries = /var/log/mysql/mysql-slow.log
Lưu và thoát.
Ta cần khởi động lại MySQL để thay đổi có hiệu lực:
- sudo service mysql restart
Bây giờ MySQL sẽ ghi các truy vấn đang chạy dài của nó vào file log được chỉ định trong cấu hình.
Gửi file log MySQL
Ta phải cấu hình Logstash Forwarder để gửi log truy vấn chậm MySQL đến server ghi log của ta .
Trên server database của bạn, db1, hãy mở file cấu hình Logstash Forwarder:
- sudo vi /etc/logstash-forwarder.conf
Thêm phần sau, trong phần “tệp” dưới các mục hiện có, để gửi log truy vấn chậm MySQL dưới dạng loại “mysql-slow” đến server Logstash của bạn:
, { "paths": [ "/var/log/mysql/mysql-slow.log" ], "fields": { "type": "mysql-slow" } }
Lưu và thoát. Điều này cấu hình Logstash Forwarder để gửi log truy vấn chậm MySQL và đánh dấu chúng là log loại “mysql-slow”, sẽ được sử dụng để lọc sau này.
Khởi động lại Logstash Forwarder để bắt đầu gửi log :
- sudo service logstash-forwarder restart
Bộ giải mã đầu vào đa dòng
Nhật ký truy vấn chậm MySQL có định dạng đa dòng (tức là mỗi mục nhập kéo dài nhiều dòng), vì vậy ta phải bật codec đa dòng của Logstash để có thể xử lý loại log này.
Trên server ELK, ghi log , hãy mở file cấu hình nơi đầu vào Lumberjack của bạn được xác định:
- sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf
Trong định nghĩa đầu vào lumberjack
, hãy thêm các dòng sau:
codec => multiline { pattern => "^# User@Host:" negate => true what => previous }
Lưu và thoát. Điều này cấu hình Logstash để sử dụng bộ xử lý log đa dòng khi nó gặp các log có chứa mẫu được chỉ định (tức là bắt đầu bằng “# User @ Server :”).
Tiếp theo, ta sẽ cài đặt bộ lọc Logstash cho các bản ghi MySQL.
Bộ lọc log MySQL
Trên server ELK, ghi log , mở một file mới để thêm bộ lọc log MySQL của ta vào Logstash. Ta sẽ đặt tên nó là 11-mysql.conf
, vì vậy nó sẽ được đọc sau cấu hình đầu vào Logstash (trong file 01-lumberjack-input.conf
):
- sudo vi /etc/logstash/conf.d/11-mysql.conf
Thêm định nghĩa bộ lọc sau:
filter { # Capture user, optional host and optional ip fields # sample log file lines: if [type] == "mysql-slow" { grok { match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ] } # Capture query time, lock time, rows returned and rows examined grok { match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"] } # Capture the time the query happened grok { match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ] } # Extract the time based on the time of the query and not the time the item got logged date { match => [ "timestamp", "UNIX" ] } # Drop the captured timestamp field since it has been moved to the time of the event mutate { remove_field => "timestamp" } } }
Lưu và thoát. Điều này cấu hình Logstash để lọc các bản ghi kiểu mysql-slow
với các mẫu Grok được chỉ định trong chỉ thị match
. Nhật ký loại apache-access
đang được phân tích cú pháp bởi mẫu Grok do Logstash cung cấp phù hợp với định dạng thông báo log Apache mặc định, trong khi các log loại apache-error
đang được phân tích cú pháp bởi bộ lọc Grok được viết để trùng với định dạng log lỗi mặc định.
Để các bộ lọc này hoạt động, hãy khởi động lại Logstash:
- sudo service logstash restart
Đến đây, bạn cần đảm bảo Logstash đang chạy đúng cách, vì các lỗi cấu hình sẽ khiến nó không thành công.
Bạn cũng cần xác nhận Kibana có thể xem các log Apache đã lọc.
Nhật ký Apache
Nhật ký của Apache thường nằm trong /var/log/apache2
, có tên là “access.log” và “error.log”. Thu thập các log này sẽ cho phép bạn xem địa chỉ IP của ai đang truy cập server của bạn, những gì họ đang yêu cầu, hệ điều hành và trình duyệt web nào họ đang sử dụng, ngoài bất kỳ thông báo lỗi nào mà Apache đang báo cáo.
Gửi file log Apache
Ta phải cấu hình Logstash Forwarder để gửi các bản ghi lỗi và truy cập Apache đến server ghi log của ta .
Trên server ứng dụng của bạn, app1 và app2, hãy mở file cấu hình Logstash Forwarder:
- sudo vi /etc/logstash-forwarder.conf
Thêm phần sau, trong phần “tệp” dưới các mục hiện có, để gửi log Apache, dưới dạng các loại thích hợp, đến server Logstash của bạn:
, { "paths": [ "/var/log/apache2/access.log" ], "fields": { "type": "apache-access" } }, { "paths": [ "/var/log/apache2/error.log" ], "fields": { "type": "apache-error" } }
Lưu và thoát. Điều này cấu hình Logstash Forwarder để gửi các bản ghi lỗi và truy cập Apache và đánh dấu chúng là các loại tương ứng, sẽ được sử dụng để lọc các bản ghi.
Khởi động lại Logstash Forwarder để bắt đầu gửi log :
sudo service logstash-forwarder restart
Ngay bây giờ, tất cả log Apache của bạn sẽ có địa chỉ IP nguồn client trùng với địa chỉ IP riêng của server HAProxy, vì Reverse Proxy HAProxy là cách duy nhất để truy cập server ứng dụng của bạn từ Internet. Để thay đổi điều này nhằm hiển thị IP nguồn của user thực đang truy cập trang web , ta có thể sửa đổi định dạng log Apache mặc định để sử dụng tiêu đề X-Forwarded-For
mà HAProxy đang gửi.
Mở file cấu hình Apache của bạn (apache2.conf):
- sudo vi /etc/apache2/apache2.conf
Tìm dòng trông giống như sau:
[Label apache2.conf — Original "combined" LogFormat] LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
Thay % h bằng % {X-Forwarded-For} i , vì vậy nó trông giống như sau:
[Label apache2.conf — Updated "combined" LogFormat] LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
Lưu và thoát. Điều này cấu hình log truy cập Apache để bao gồm địa chỉ IP nguồn của user thực tế của bạn, thay vì địa chỉ IP riêng của server HAProxy.
Khởi động lại Apache để thay đổi log có hiệu lực:
- sudo service apache2 restart
Bây giờ ta đã sẵn sàng để thêm bộ lọc log Apache vào Logstash.
Bộ lọc log Apache
Trên server ELK, ghi log , mở một file mới để thêm bộ lọc log Apache của ta vào Logstash. Ta sẽ đặt tên là 12-apache.conf
, vì vậy nó sẽ được đọc sau cấu hình đầu vào Logstash (trong file 01-lumberjack-input.conf
):
- sudo vi /etc/logstash/conf.d/12-apache.conf
Thêm các định nghĩa bộ lọc sau:
filter { if [type] == "apache-access" { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } } filter { if [type] == "apache-error" { grok { match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" } } } }
Lưu và thoát. Điều này cấu hình Logstash để lọc các bản ghi loại apache-access
và apache-error
với các mẫu Grok được chỉ định trong các chỉ thị match
tương ứng. Nhật ký loại apache-access
đang được phân tích cú pháp bởi mẫu Grok do Logstash cung cấp phù hợp với định dạng thông báo log Apache mặc định, trong khi các log loại apache-error
đang được phân tích cú pháp bởi bộ lọc Grok được viết để trùng với định dạng log lỗi mặc định.
Để các bộ lọc này hoạt động, hãy khởi động lại Logstash:
- sudo service logstash restart
Đến đây, bạn cần đảm bảo Logstash đang chạy đúng cách, vì các lỗi cấu hình sẽ khiến nó không thành công. Bạn cũng cần xác nhận Kibana có thể xem các log Apache đã lọc.
Nhật ký HAProxy
Nhật ký của HAProxy thường nằm trong /var/log/haproxy.log
. Thu thập các log này sẽ cho phép bạn xem địa chỉ IP của ai đang truy cập bộ cân bằng tải của bạn, những gì họ đang yêu cầu, server ứng dụng nào đang phục vụ yêu cầu của họ và nhiều chi tiết khác về kết nối.
Gửi file log HAProxy
Ta phải cấu hình Logstash Forwarder để gửi log HAProxy.
Trên server HAProxy của bạn, lb1 , hãy mở file cấu hình Logstash Forwarder:
sudo vi /etc/logstash-forwarder.conf
Thêm phần sau, trong phần “tệp” bên dưới các mục hiện có, để gửi log HAProxy dưới dạng “haproxy-log” đến server Logstash của bạn:
, { "paths": [ "/var/log/haproxy.log" ], "fields": { "type": "haproxy-log" } }
Lưu và thoát. Điều này cấu hình Logstash Forwarder để gửi các bản ghi HAProxy và đánh dấu chúng là haproxy-log
, sẽ được sử dụng để lọc các bản ghi.
Khởi động lại Logstash Forwarder để bắt đầu gửi log :
sudo service logstash-forwarder restart
Bộ lọc log HAProxy
Trên server ELK, ghi log , mở một file mới để thêm bộ lọc log HAProxy của ta vào Logstash. Ta sẽ đặt tên nó là 13-haproxy.conf
, vì vậy nó sẽ được đọc sau cấu hình đầu vào Logstash (trong file 01-lumberjack-input.conf
):
sudo vi /etc/logstash/conf.d/13-haproxy.conf
Thêm định nghĩa bộ lọc sau:
filter { if [type] == "haproxy-log" { grok { match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))" } } } }
Lưu và thoát. Điều này cấu hình Logstash để lọc haproxy-log
loại haproxy-log
với các mẫu Grok được chỉ định trong chỉ thị match
tương ứng. haproxy-log
loại haproxy-log
đang được phân tích cú pháp bởi mẫu Grok do Logstash cung cấp phù hợp với định dạng thông báo log HAProxy mặc định.
Để các bộ lọc này hoạt động, hãy khởi động lại Logstash:
- sudo service logstash restart
Đến đây, bạn cần đảm bảo Logstash đang chạy đúng cách, vì các lỗi cấu hình sẽ khiến nó không thành công.
Cài đặt hình ảnh Kibana
Đến đây bạn đang thu thập log của bạn ở vị trí trung tâm, bạn có thể bắt đầu sử dụng Kibana để hình dung chúng. Hướng dẫn này có thể giúp bạn bắt đầu với điều đó: Cách sử dụng Trang tổng quan và Hình ảnh hóa Kibana .
Khi bạn đã cảm thấy thoải mái với Kibana, hãy thử hướng dẫn này để hình dung user của bạn theo cách thú vị: Cách lập bản đồ vị trí user với GeoIP và ELK .
Kết luận
Xin chúc mừng! Bạn đã hoàn thành loạt bài hướng dẫn Cài đặt Ứng dụng Web Sản xuất. Nếu bạn đã làm theo tất cả các hướng dẫn, bạn sẽ có một cài đặt giống như những gì ta đã mô tả trong hướng dẫn tổng quan (với DNS riêng và backup từ xa):
Đó là, bạn nên có một ứng dụng hoạt động, với các thành phần được tách rời, được hỗ trợ bởi các thành phần backup , giám sát và ghi log tập trung. Đảm bảo kiểm tra ứng dụng của bạn và đảm bảo tất cả các thành phần hoạt động như mong đợi.
Các tin liên quan
Xây dựng cho Sản xuất: Ứng dụng Web - Tổng quan2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Giám sát
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - backup
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Triển khai
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Lập kế hoạch khôi phục
2015-06-01
Cách cài đặt control panel lưu trữ web Sentora trên Ubuntu 14.04
2015-04-27
Cách cài đặt web server OpenLiteSpeed trên CentOS 7
2015-04-16
Cách cài đặt web server OpenLiteSpeed trên Ubuntu 14.04
2015-04-15
Cách cài đặt Bacula-Web trên Ubuntu 14.04
2015-04-03
Khái niệm cơ bản về bộ nhớ đệm trên web: Thuật ngữ, Tiêu đề HTTP và Chiến lược lưu vào bộ đệm
2015-04-01