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:
OutputCreated 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:
. . . # 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:
. . . # 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 :
$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 :
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:
Outputrsyslog-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:
OutputHTTP/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.
Các tin liên quan
Cách cài đặt Git trên CentOS 82020-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