Series Opcodes Log Viewer Thực chiến #3: Centralized Logging – Bức tranh toàn cảnh đa máy chủ (Trạm cuối)
1. Tư duy Kiến trúc Multi-host
Thay vì cài đặt các công cụ hạng nặng như ELK Stack (Elasticsearch, Logstash, Kibana) vốn đòi hỏi cấu hình máy chủ rất lớn, chúng ta sẽ dùng chính Log Viewer để làm việc này.
Kịch bản:
- Chúng ta có 1 Server chính (Command Center) dùng để xem Dashboard.
- Chúng ta có 2 Server chạy API xử lý lõi (Node 1 và Node 2).
- Server chính sẽ gọi API ngầm qua mạng nội bộ (Intranet) đến Node 1 và Node 2 để kéo file log về và gộp chung lại trên một giao diện duy nhất.
2. Cấu hình Trung tâm Chỉ huy (Command Center)
Mở file config/log-viewer.php trên Server chính (nơi bạn sẽ trực tiếp truy cập bằng trình duyệt). Kéo xuống dưới cùng, bạn sẽ thấy mảng 'hosts'. Hãy khai báo danh sách các đàn em của nó vào đây:
'hosts' => [
// Máy chủ hiện tại
'local' => [
'name' => 'Command Center (Main)',
],
// Máy chủ Node 1
'node-1' => [
'name' => 'AFC Core - Node 1',
// Trỏ thẳng vào IP mạng nội bộ (LAN) của Node 1, KHÔNG dùng Public IP
'host' => 'http://10.0.0.11/admin-core/system-diagnostics/logs-monitor',
'headers' => [
'Authorization' => 'Bearer ' . env('LOG_VIEWER_REMOTE_TOKEN'),
],
],
// Máy chủ Node 2
'node-2' => [
'name' => 'AFC Core - Node 2',
'host' => 'http://10.0.0.12/admin-core/system-diagnostics/logs-monitor',
'headers' => [
'Authorization' => 'Bearer ' . env('LOG_VIEWER_REMOTE_TOKEN'),
],
],
],
Biến LOG_VIEWER_REMOTE_TOKEN là một chìa khóa bí mật (Secret Key) do bạn tự đẻ ra (ví dụ: một chuỗi UUID ngẫu nhiên dài 32 ký tự). Hãy đưa biến này vào file .env của Server chính.
3. Mở cửa cho Server giao tiếp với nhau (Server-to-Server Auth)
Nếu bạn nhớ ở Bài 1, chúng ta đã xây một bức tường lửa (Auth Gate) chặn đứng tất cả mọi người, bắt buộc phải có tài khoản super_admin và đúng IP mới được vào.
Nhưng Server chính (Command Center) lại gọi các Node đàn em thông qua API ngầm phía dưới. Trình duyệt không thể truyền Session hay Cookie của User qua đó được. Do đó, các Node đàn em sẽ đá văng Server chính ra ngoài bằng lỗi 403.
Để giải quyết, chúng ta phải độ lại hàm Auth Gate trên tất cả các máy chủ. Hãy mở app/Providers/AppServiceProvider.php (hoặc nơi bạn để LogViewer Gate):
use Opcodes\LogViewer\Facades\LogViewer;
public function boot(): void
{
LogViewer::auth(function ($request) {
// 1. LUỒNG ĐẶC NHIỆM CHO SERVER-TO-SERVER:
// Nếu Request gửi kèm đúng Token bí mật, lập tức cho qua!
$remoteToken = env('LOG_VIEWER_REMOTE_TOKEN');
if ($remoteToken && $request->bearerToken() === $remoteToken) {
// Xác minh thêm: Chỉ cho phép gọi từ IP của Server Chính (Ví dụ: 10.0.0.10)
if ($request->ip() === '10.0.0.10') {
return true;
}
}
// 2. LUỒNG CHO CON NGƯỜI (Từ Bài 1)
if (app()->environment('local')) {
return true;
}
$allowedIps = ['192.168.1.100', '118.69.123.45'];
if (!in_array($request->ip(), $allowedIps)) {
return false;
}
return $request->user() && $request->user()->hasRole(['super_admin', 'devops']);
});
}
Đừng quên chép biến LOG_VIEWER_REMOTE_TOKEN vào file .env của cả Node 1 và Node 2 để chúng có thể đối chiếu.
4. Tận hưởng sức mạnh của Hệ thống Giám sát Phân tán
Mọi thứ đã kết nối xong! Bây giờ, khi bạn đăng nhập vào Log Viewer trên Server chính, nhìn sang thanh Sidebar bên trái, bạn sẽ thấy một menu Dropdown cực kỳ chuyên nghiệp.
Bạn có thể:
- Xem log của riêng máy chủ hiện tại (Command Center).
- Chuyển sang xem log của Node 1 hoặc Node 2 chỉ bằng một cú click chuột mà không cần tải lại trang.
- Kẻ thù bên ngoài hoàn toàn bị mù tịt vì toàn bộ dữ liệu log được kéo ngầm qua giao thức API nội bộ, và bảo vệ bởi Token bí mật cùng IP nội bộ.
Lời kết cho Series Opcodes Log Viewer
Chỉ với 3 bài học ngắn gọn, chúng ta đã đưa một thư viện open-source bình thường vươn lên đẳng cấp Enterprise. Hệ thống AFC giờ đây đã sở hữu:
- Mặt nạ bảo mật (Obscurity): Đổi đường dẫn, giới hạn IP, phân quyền User gắt gao.
- Quyền riêng tư (Data Masking): Bóp chết nguy cơ rò rỉ dữ liệu bằng cách tự động che đi thông tin thẻ, số điện thoại, mật khẩu ngay từ tầng Monolog.
- Khả năng mở rộng (Scalability): Gom toàn bộ log của một cụm Load Balancing về một màn hình duy nhất, tối ưu hóa quá trình xử lý sự cố.
Một Backend Engineer giỏi là người viết code ít lỗi, nhưng một Senior Engineer xuất sắc là người chuẩn bị sẵn chiếc kính lúp hoàn hảo nhất để tìm ra lỗi ngay khi hệ thống vừa "hắt hơi sổ mũi". Chúc hệ thống của bạn luôn vận hành trơn tru và log file mãi mãi chỉ hiện màu xanh của thông báo INFO!
All rights reserved