Thứ ba, 22/09/2020 | 00:00 GMT+7

Cách cấu hình ghi log HAProxy với Rsyslog trên CentOS 8 [Quickstart]

HAProxy, viết tắt của High Av available Proxy, là một server proxy dựa trên TCP và HTTP được sử dụng rộng rãi chạy trên Linux, Solaris và FreeBSD. Nó được sử dụng để cân bằng tải các ứng dụng bằng cách phân phối các yêu cầu giữa nhiều server và đảm bảo rằng các ứng dụng luôn sẵn sàng cho user .

Theo mặc định trên nhiều bản cài đặt CentOS 8, HAProxy không được cấu hình để ghi kết quả log của nó vào một file . Hướng dẫn bắt đầu nhanh này sẽ giải thích cách cấu hình ghi log HAProxy với Rsyslog bằng cách sử dụng socket domain Unix đảm bảo độ tin cậy, tốc độ và bảo mật.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần một server chạy CentOS 8. Server này phải có user không phải root có quyền quản trị. Để cài đặt điều này, hãy làm theo hướng dẫn Cài đặt Server Ban đầu cho hướng dẫn CentOS 8 .

Bước 1 - Cài đặt và kích hoạt HAProxy

Để cài đặt HAProxy, hãy chạy lệnh dnf sau:

  • sudo dnf install haproxy

Khi bạn được yêu cầu Is this ok [y/N]: nhập y và nhấn RETURN để cài đặt gói.

Sau khi bạn đã cài đặt HAProxy, hãy bật và khởi động nó bằng lệnh systemctl :

  • sudo systemctl enable haproxy.service

Bạn sẽ nhận được kết quả sau:

Output
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.

Với dịch vụ HAProxy hiện được kích hoạt, bạn có thể khởi động nó đảm bảo rằng nó chạy với cấu hình mặc định trên server của bạn:

  • sudo systemctl start haproxy.service

Tiếp theo, kiểm tra trạng thái của HAProxy đảm bảo rằng nó đang chạy:

  • sudo systemctl status haproxy.service

Bạn sẽ nhận được kết quả như sau. Lưu ý phần active (running) đánh dấu của kết quả . Nếu server của bạn hiển thị cùng một phần được đánh dấu thì HAProxy đang chạy chính xác trên server của bạn và bạn có thể tiến hành cấu hình ghi log .

Output
● haproxy.service - HAProxy Load Balancer Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-09-09 21:16:39 UTC; 4min 39s ago Process: 21340 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS) Main PID: 21341 (haproxy) Tasks: 2 (limit: 2881) Memory: 2.7M CGroup: /system.slice/haproxy.service ├─21341 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid . . .

Nếu kết quả của bạn khác hoặc trạng thái hiển thị như Active: failed , thì hãy làm theo các bước khắc phục sự cố trong hướng dẫn Giới thiệu chuỗi các lỗi phổ biến của HAproxy để xác định điều gì đang ngăn HAProxy khởi động chính xác.

Khi bạn đã xác nhận HAProxy được bật và đang chạy, bạn có thể tiếp tục bước tiếp theo, đó là cấu hình các chỉ thị ghi log của HAProxy.

Bước 2 - Cấu hình chỉ thị ghi log HAProxy

Để cấu hình chỉ thị ghi log của HAProxy, hãy mở /etc/haproxy/haproxy.cfg trong vi hoặc trình soạn thảo bạn muốn :

  • sudo vi /etc/haproxy/haproxy.cfg

Nhấn i để chuyển sang chế độ INSERT , sau đó tìm log 127.0.0.1 local2 dòng log 127.0.0.1 local2 và comment bằng cách thêm ký tự # vào đầu dòng, như được tô sáng trong ví dụ sau:

/etc/haproxy/haproxy.cfg
. . . # 2) configure local2 events to go to the /var/log/haproxy.log #   file. A line like the following can be added to #   /etc/sysconfig/syslog # #    local2.*                       /var/log/haproxy.log #     #log         127.0.0.1 local2      chroot      /var/lib/haproxy     pidfile     /var/run/haproxy.pid . . . 

Bây giờ thêm một dòng ngay sau dòng chú thích với nội dung sau:

    log         /dev/log local0 

Toàn bộ phần /etc/haproxy/haproxy.cfg mà bạn đã chỉnh sửa phải chứa các dòng sau:

/etc/haproxy/haproxy.cfg
. . . #    local2.*                       /var/log/haproxy.log #      #log         127.0.0.1 local2      log         /dev/log local0       chroot      /var/lib/haproxy      pidfile     /var/run/haproxy.pid . . . 

Dòng chroot rất quan trọng, vì nó hạn chế quá trình HAProxy chỉ truy cập vào các file trong folder /var/lib/haproxy . Dòng log /dev/log local0 sẽ tạo một file bên trong folder đó mà Rsyslog sẽ sử dụng để thu thập các mục log .

Khi bạn đã hoàn tất việc chỉnh sửa các dòng log trong /etc/haproxy/haproxy.cfg , hãy lưu file bằng cách nhấn ESC , gõ :wq và nhấn ENTER .

Bước cuối cùng bạn cần hoàn thành trong phần này là tạo folder /var/lib/haproxy/dev vì nó không tồn tại theo mặc định.

Tạo folder bằng mkdir và sau đó khởi động lại HAProxy:

  • sudo mkdir /var/lib/haproxy/dev
  • sudo systemctl restart haproxy.service

Đến đây bạn đã cấu hình HAProxy để gửi log của nó đến socket domain Unix nằm trong /var/lib/haproxy/dev/log . Trong bước tiếp theo, bạn sẽ cấu hình Rsyslog để tạo và truy cập socket.

Bước 3 - Cấu hình log Rsyslog để thu thập log HAProxy

Cấu hình mặc định của Rsyslog trên CentOS 8 không xử lý log HAProxy. Để thu thập log từ dịch vụ HAProxy, hãy mở file mới /etc/rsyslog.d/99-haproxy.conf bằng vi hoặc editor bạn muốn :

  • sudo vi /etc/rsyslog.d/99-haproxy.conf

Nhấn i để chuyển sang chế độ INSERT , sau đó dán các dòng sau vào file :

/etc/rsyslog.d/99-haproxy.conf
$AddUnixListenSocket /var/lib/haproxy/dev/log  # Send HAProxy messages to a dedicated logfile :programname, startswith, "haproxy" {   /var/log/haproxy.log   stop } 

Chỉ thị $AddUnixListenSocket yêu cầu Rsyslog tạo một socket domain Unix ở vị trí được chỉ định, trong trường hợp này là /var/lib/haproxy/dev/log . Phần :programname, startswith, "haproxy" chỉ định file nơi Rsyslog sẽ ghi các mục log mà nó thu thập từ socket.

Khi bạn hoàn tất việc chỉnh sửa /etc/rsyslog.d/99-haproxy.conf , hãy lưu file bằng cách nhấn ESC , nhập :wq và nhấn ENTER .

Đến đây bạn đã cấu hình Rsyslog để đọc các mục log từ socket domain Unix trong /var/lib/haproxy/dev/log và ghi chúng vào một file log trong /var/log/haproxy.log .

Tuy nhiên, trước khi khởi động lại Rsyslog, bạn cần xác định xem SELinux có đang thực thi quyền kiểm soát truy cập trên hệ thống CentOS 8 của bạn hay không.

Để kiểm tra policy hiện tại của SELinux, hãy chạy như sau:

  • getenforce

Bạn sẽ nhận được một trong các kết quả sau:

  • Enforcing - Trong chế độ này, SELinux đang thực thi các kiểm soát truy cập trên hệ thống. Bạn cần phải hoàn thành Bước 4 tùy chọn sau - Phần cấu hình SELinux .
  • Permissive - Trong trường hợp này, SELinux ghi lại tất cả các nỗ lực truy cập vào file log của nó, nhưng không thực thi các kiểm soát truy cập trên hệ thống.
  • Disabled - Nếu SELinux bị tắt, thì nó sẽ không ghi log hoặc thực thi bất kỳ policy kiểm soát truy cập nào trên hệ thống.

Nếu lệnh getenforce trả về Permissive hoặc Disabled , thì bạn có thể khởi động lại Rsyslog bằng lệnh sau:

  • sudo systemctl restart rsyslog

Sau khi khởi động lại Rsyslog, bạn có thể xem log trong file /var/log/haproxy.log mà bạn đã cấu hình trong /etc/rsyslog.d/99-haproxy.conf . Tiếp tục sang Bước 5 - Kiểm tra Ghi log HAProxy đảm bảo rằng mọi thứ đang hoạt động như mong đợi.

Mặt khác, nếu hệ thống của bạn đang chạy SELinux ở chế độ Enforcing , thì phần tiếp theo của hướng dẫn này giải thích cách thêm module để cho phép Rsyslog và HAProxy giao tiếp với nhau qua socket domain Unix được chia sẻ của chúng.

Bước 4 - (Tùy chọn) Cấu hình SELinux

Nếu hệ thống CentOS 8 của bạn được cấu hình với SELinux ở chế độ Enforcing , thì bạn cần cho phép Rsyslog truy cập vào folder chroot của HAProxy. Việc cho phép quyền truy cập này sẽ cho phép Rsyslog tạo socket domain Unix mà HAproxy sẽ gửi log của nó đến.

Nếu bạn chưa quen với SELinux, loạt bài hướng dẫn này Giới thiệu về SELinux trên CentOS 7 sẽ giúp bạn học cách quản lý và tương tác với SELinux. Mặc dù nó được viết cho CentOS 7, các nguyên tắc và lệnh trong loạt bài này đều có thể áp dụng được cho CentOS 8.

Để cho phép truy cập Rsyslog và HAProxy vào socket được chia sẻ của chúng, nhiệm vụ đầu tiên là tạo file policy Thực thi Loại. Mở file mới có tên rsyslog-haproxy.te trong vi hoặc trình soạn thảo bạn muốn :

  • vi rsyslog-haproxy.te

Nhấn i để chuyển sang chế độ INSERT , sau đó dán các dòng sau vào file :

rsyslog-haproxy.te
module rsyslog-haproxy 1.0;  require {     type syslogd_t;     type haproxy_var_lib_t;     class dir { add_name remove_name search write };     class sock_file { create setattr unlink }; }  #============= syslogd_t ============== allow syslogd_t haproxy_var_lib_t:dir { add_name remove_name search write }; allow syslogd_t haproxy_var_lib_t:sock_file { create setattr unlink }; 

Dòng đầu tiên xác định tên và version module . Phần require cho trình tải module SELinux biết về các loại và lớp được yêu cầu để policy được tải dưới dạng module . Hai dòng cuối cùng là các luật cho phép Rsyslog truy cập vào file chroot và socket của HAProxy tương ứng.

Khi bạn hoàn tất việc chỉnh sửa file , hãy lưu file đó bằng cách nhấn ESC , nhập :wq và nhấn ENTER .

Tiếp theo, chạy lệnh sau để cài đặt gói checkpolicy , có chứa tiện ích module checkmodule mà bạn sẽ sử dụng để biến file Loại thực thi thành một module SELinux.

  • sudo dnf install checkpolicy

Đến đây bạn đã cài đặt công cụ checkmodule , bước tiếp theo là biên dịch module và sau đó tải nó vào SELinux. Chạy phần sau để biên dịch file Thực thi Loại thành một module SELinux:

  • checkmodule -M -m rsyslog-haproxy.te -o rsyslog-haproxy.mod

Tiếp theo, chạy semodule_package để tạo một gói policy hoàn chỉnh mà SELinux có thể tải vào nhân Linux:

  • semodule_package -o rsyslog-haproxy.pp -m rsyslog-haproxy.mod

Bước cuối cùng là tải gói mà bạn đã tạo vào nhân Linux bằng lệnh semodule :

  • sudo semodule -i rsyslog-haproxy.pp

Việc thêm module có thể mất vài giây. Khi lệnh hoàn tất, bạn có thể xác nhận module đã được tải vào kernel bằng cách chạy lệnh semodule :

  • sudo semodule -l |grep rsyslog-haproxy

Bạn sẽ nhận được kết quả như sau:

Output
rsyslog-haproxy

Sau khi module được tải, bạn có thể khởi động lại Rsyslog bằng lệnh sau:

  • sudo systemctl restart rsyslog

Đến đây bạn đã xác định, biên dịch và tải một policy SELinux sẽ cho phép HAProxy và Rsyslog giao tiếp qua socket được chia sẻ của chúng.

Trong bước tiếp theo, bạn sẽ kiểm tra xem mọi thứ có hoạt động không bằng cách thực hiện một yêu cầu HTTP tới HAProxy và kiểm tra file log mới của nó.

Bước 5 - Kiểm tra ghi log HAProxy

Đến đây bạn đã cấu hình HAProxy, Rsyslog và tùy chọn SELinux, bạn có thể kiểm tra xem việc đăng nhập vào /var/log/haproxy.log có hoạt động hay không.

Theo mặc định, gói haproxy kèm file cấu hình tạo socket bộ nghe HTTP trên cổng 5000. Cấu hình trỏ đến server backend không tồn tại, vì vậy bất kỳ yêu cầu nào đến cổng sẽ dẫn đến lỗi HTTP 503.

Để kiểm tra lỗi 503 trong file /var/log/haproxy.log của bạn, trước tiên hãy tạo một yêu cầu HTTP bằng cách sử dụng curl như sau:

  • curl -si http://127.0.0.1:5000

Bạn sẽ nhận được kết quả như sau:

Output
HTTP/1.0 503 Service Unavailable Cache-Control: no-cache Connection: close Content-Type: text/html <html><body><h1>503 Service Unavailable</h1> No server is available to handle this request. </body></html>

Bây giờ hãy kiểm tra /var/log/haproxy.log để tìm bất kỳ phản hồi HTTP 503 nào bằng cách sử dụng grep :

  • sudo grep -E ‘NOSRV.+503’ /var/log/haproxy.log

Lưu ý : Phần NOSRV.+503 của lệnh là một biểu thức chính quy. Hướng dẫn này về Sử dụng Grep & Biểu thức chính quy để tìm kiếm các mẫu văn bản trong Linux
đi sâu hơn vào việc sử dụng grep và biểu thức chính quy.

Bạn sẽ nhận được một dòng (hoặc nhiều dòng) như sau:

[secondary_label Output Sep 9 21:32:22 centos-s-1vcpu-1gb-nyc3-01 haproxy[4451]: 127.0.0.1:56024 [9/Sep/2020:21:32:22.098] main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1" 

Dòng này tương ứng với yêu cầu curl mà bạn đã thực hiện, nghĩa là Rsyslog và HAProxy được cấu hình để sử dụng đúng socket được chia sẻ của chúng.

Kết luận

Trong hướng dẫn bắt đầu nhanh này, bạn đã cấu hình HAProxy để đăng nhập vào socket domain Unix. Bạn cũng cài đặt Rsyslog để tạo và đọc từ socket để hai chương trình có thể giao tiếp với nhau mà không cần mở bất kỳ cổng TCP / IP nào trên hệ thống. Cuối cùng, bạn có thể tùy ý biên dịch, đóng gói và tải một policy SELinux để cho phép Rsyslog và HAProxy được chia sẻ quyền truy cập vào socket của chúng.


Tags:

Các tin trước

Cách cài đặt Git trên CentOS 8 2020-04-12
Cách thiết lập và cấu hình Tổ chức phát hành chứng chỉ (CA) trên CentOS 8 2020-04-06
Cách cài đặt MariaDB trên CentOS 8 2020-04-03
Cách thiết lập firewall bằng firewalld trên CentOS 8 2020-04-03
Cách thêm và xóa người dùng trên CentOS 8 2020-04-03
Cách cài đặt Node.js trên CentOS 8 2020-04-01
Cách tạo người dùng mới hỗ trợ Sudo trên CentOS 8 [Khởi động nhanh] 2020-03-30
Cách tự động hóa quá trình triển khai sản xuất Node.js của bạn với Giao hàng trên CentOS 7 2020-02-26
Cách sử dụng Cron để tự động hóa công việc trên CentOS 8 2020-02-10
Cách thiết lập khóa SSH trên CentOS 8 2020-02-06