Tìm hiểu cấu hình frontend, backend trong HAProxy, cài đặt và sử dụng nó để cân bằng tải hoặc làm Server trung gian chuyển hướng các request
Nhiều bạn đã quen dùng nginx làm reverse proxy (server trung gian) hoặc balance proxy (cân bằng tải) hiệu quả với giao thức HTTPD(S). Ngoài nginx thì HAProxy
cũng đáp ứng được các yêu cầu trên với hiệu suất cao đồng thời còn có các chức năng phức tạp trên cả các giao thức TPC, nó làm Proxy được cho nhiều dịch vụ khác nhau. Nhiều hãng công nghệ nổi tiếng có sử dụng HAProxy như Twitter, Intagram ...
- Giới thiệu HAProxy
- Cấu hình HAProxy
- HAProxy Docker Container
Cài đặt HAProxy
Cài đặt trên CentOS 7/RHEL 7
# yum -y update # yum -y install haproxy # systemctl start haproxy # systemctl enable haproxy
File cấu hình cho HAProxy tại (systemctl restart haproxy)
Cài đặt trên Ubuntu
sudo apt-get -y update sudo apt-get -y install haproxy
Cấu hình HAProxy và thuật toán cân bằng tải
Cấu hình cách thức làm việc của HAProxy thông qua việc biên tập file /etc/haproxy/haproxy.cfg
, cơ bản là bạn định nghĩa ra những khối nhận phân tích các yêu cầu (Request) gửi đến gọi chúng là frontend
, các yêu cầu này được chuyển hướng thích hợp đến một khối gọi là backend
, ở backend
các thuật toán về cân bằng tải được xử lý và có thể các Request được chuyển cho một Server thực sự sau HAProxy
Các khối backend
Bạn có thể định nghĩa ra nhiều backend, mỗi backend có đặt một cái tên để fontend nào cần dùng thì sử dụng tên này. Trong khối này cần chỉ ra:
Thuật toán cân bằn tải với keyword là balance và các server nhận Request và một số thiết lập khác ví dụ:
backend name-backend # bắt đầu định nghĩa backend với tên name-backend
balance roundrobin # thuật toán cân bằng tải sử dụng
mode http # chế độ cần bằng tải (còn có mode tcp)
server server1 mydomain.com:80 check # server1 (chỉ ra bằng domain và cổng)
server server2 IP:80 check # server2 (chỉ ra bằng IP và cổng)
# chữ check ở cuối là yêu cầu HAProxy kiểm tra server
Một số thuật toán cân bằng tải:
roundrobin
chọn server xoay vòng (request này cho server này, thì resquest tiếp theo cho server khác ...)leastconn
chuyển yêu cầu cho server có ít kết nối nhấtsource
server được chọn dựa vào IP của user!
check
khai báo ở server là yêu cầu HAProxy liên tục kiểm tra xem server đó còn sống (phản hồi gói tin) không, để đảm bảo request được gửi đến server đang còn sống!
Các khối fontend
Khối này nhận phân tích các request và chuyển nó cho khối backend thích hợp. Có thể định nghĩa nhiều khối frontend và có đặt tên cho khối. Các tham số cần chỉ ra gồm có các thứ như IP, cổng (từ khóa bind
), định nghĩa các điều kiện với từ khóa alc
(Access control list), căn cứ vào các alc
Request được gửi cho backend thích hợp với từ khóa use_backend
, ví dụ:
frontend name-frontend # bắt đầu định nghĩa một frontend đặt tên là name-frontend
bind *:80 # nhận phân tích các request gửi đến cổng 80 từ IP bất kỳ
acl alc1 hdr_dom(host) -i testhaproxy1.com # định nghĩa alc1 là: nếu domain truy vấn là testhaproxy1.com
acl alc2 hdr_dom(host) -i testhaproxy2.com # định nghĩa alc2 là: nếu domain truy vấn là testhaproxy2.com
use_backend name-backend if acl1 # chuyển request đến backend có tên name-backend nếu acl1 thỏa mãn
use_backend other-backend if alc2 # chuyển request đến backend có tên other-backend nếu acl2 thỏa mãn
use_backend default_backend # chuyển request đến backend có tên default-backend nếu request chưa chuyển cho backend nào!
Tóm lại, cơ bản cấu hình HAProxy là bạn viết ra các khối frontend, backend phù hợp với yêu cầu của mình. Sau đây là một ví dụ chạy HAProxy trên Docker để bạn có thể thực hành kiểm tra nó một cách nhanh chóng!
HAProxy với Docker
Image Docker của HAproxy được cung cấp với tên haproxy
(bản cuối haproxy:latest
). Để đảm bảo chạy được container HAProxy cần có file config haproxy.cfg
khi tạo thì copy (hoặc ánh xạ) vào thư mục /usr/local/etc/haproxy/haproxy.cfg
của container. Có thể chạy docker run
với tham số -v
để ánh xạ file vào (xem ánh xạ file, thư mục vào container để biết cách sử dụng).
Tuy nhiên ở đây sẽ dùng kỹ thuật với Dockerfile và docker-compose để thực hiện chạy một container HAProxy.
Trước tiên cần đưa ra một yêu cầu đơn giản sau:
Tạo HAProxy chạy trên một container
, lắng nghe các yêu cầu gửi đến cổng 80,443
(public 8080, 443)
- Nếu truy cập bằng domain
http://testhaproxy1.com:8080
thì request gửi đếnyahoo.com:80
- Nếu truy cập bằng domain
http://testhaproxy2.com:8080
thì request gửi xoay vòng đếnwikipedia.org:80
,bing.com:80
,google.com:80
- Nếu truy cập bằng
https://testhaproxy1.com
hoặchttps://testhaproxy2.com
thì gửi request đếnwikipedia.org:443
Giờ ta sẽ từng bước thực hiện yêu cầu trên:
Hãy tạo ra một thư mục đặt tên là haproxy
để lưu các file. Đầu tiên trong thư mục đó tạo ra file haproxy.cfg
với nội dung:
global
maxconn 4096 # giới hạn kết nối đến Proxy
daemon
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
timeout connect 10s
timeout client 30s
timeout server 30s
log global
mode http # mode tcp
option httplog # option tcplog
maxconn 3000
stats enable
# option forwardfor
# option http-server-close
stats uri /haproxyStats # URL trang thống kê
stats auth admin:admin123 # user/pass truy cập trang thống kê http://localhost:8080/haproxyStats
# FONTEND xử lý yêu cầu gửi đến port 80
frontend http-in
bind *:80
acl host_test1 hdr_dom(host) -i testhaproxy1.com # nếu truy cập bằng domain testaproxy1.com
acl host_test2 hdr_dom(host) -i testhaproxy2.com # nếu truy cập bằng domain testaproxy2.com
use_backend bke_80_test1 if host_test1 # gửi đến backend bke_80_test1 nếu host_test1 thỏa mãn
use_backend bke_80_test2 if host_test2 # gửi đến backend bke_80_test2 nếu host_test2 thỏa mãn
# FONTEND xử lý yêu cầu gửi đến port 443
frontend https-in
bind *:443
mode tcp # chế độ cân bằng tải tcp
option tcplog
tcp-request inspect-delay 10s
tcp-request content accept if { req_ssl_hello_type 1 }
acl acl1 req.ssl_sni -m end testhaproxy1.com # nếu truy cập bằng domain testaproxy1.com
acl acl2 req.ssl_sni -m end testhaproxy2.com # nếu truy cập bằng domain testaproxy1.com
use_backend bke_443 if acl1 || acl2 # gửi request đến bke_443 nếu acl1 hoặc acl2 thỏa mãn
backend bke_80_test1
balance roundrobin
option httpclose
option forwardfor
server server1 yahoo.com:80 check
backend bke_80_test2
balance roundrobin
option httpclose
option forwardfor
server server1 wikipedia.org:80 check
server server2 bing.com:80 check
server server3 google.com:80 check
backend bke_443
mode tcp
balance source
option ssl-hello-chk
server server1 wikipedia.org:443 check
#redirect scheme https if !{ ssl_fc }
Dockerfile
Tạo file Dockerfile trong thư mục haproxy ở trên, với nội dung:
FROM haproxy:latest
COPY ./haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
docker-compose.yml tạo ra file này trong thư mục haproxy và nội dung nhập vào như sau:
version: "3"
services:
xtlab-haproxy:
build:
context: .
container_name: haproxy
restart: always
hostname: haproxy
ports:
- "8080:80" # Mở cổng 8080 public -> 80
- "443:443" # Mở cổng 443 public -> 443
Như vậy mọi thứ đã đủ, giờ hãy chạy thử bằng cách đang ở thử mục haproxy
tạo ở trên gõ:
docker-compose up
Vậy là đã có container đang chạy, hãy kiểm tra bằng cách tạo thiết lập 2 domain testhaproxy2.com
và testhaproxy2.com
trong file hosts
(/ect/hosts của macOS, Linux) hoặc (C:\Windows\System32\Drivers\etc\hosts trong Windows)
127.0.0.1 testhaproxy2.com 127.0.0.1 testhaproxy1.com
Giờ tại trình duyệt bạn vào địa chỉ http://testhaproxy1.com:8080
, kết quả backend bke_80_test1
nó đã chuyển request đến yahoo.com
Vào địa chỉ http://testhaproxy2.com:8080
, thì backend bke_80_test1
làm việc, mỗi lần refesh địa chỉ này thì bạn thấy nó vào một trong 3 server như 3 hình dưới đây: lúc thì nó chuyển request đên google.com, lúc đến bing.com, lúc thì đến wikipedia.org (xem khối bke_80_test1 và lý thuyết cân bằng tải ở trên để biết tại sao lại thế)
Cuối cùng vào địa chỉ https://testhaproxy.com
:
Để theo dõi hoạt động của HAProxy truy cập địa chỉ
Kết luận
Qua ví dụ trên đã biết cách sử dụng HAProxy làm một server cân bằng tải hoặc server trung gian. Từ đây bạn có thể ứng dụng nó nhận các request phân tích và chuyển request đó đến các DOCKER CONTAINER
thích hợp trong hệ thống của bạn. Ứng dụng đơn giản nhất, bạn có nhiều domain, mỗi domain lại chạy ứng dụng trên một container Docker khác nhau vậy thì dùng HAProxy làm server trung gian lắng nghe cổng (80, 443 http, https) tùy thuộc domain nào thì chuyển yêu cầu đến container đó.
Website không bao giờ chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn muốn tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ kinh nghiệm, thủ tục, quy trình, bí kíp thực chiến mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin1_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty